孤独なLispのヒープ

2026/05/29 3:16

孤独なLispのヒープ

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

「Lone」 Lisp インタプリータの中核にある物語は、非効率なカスタムアロケーターから、高性能で現代的なヒープ構造へと進化した点にあります。約 3 年間、システムはリンクリストベースのアロケーターを使用してきており、これが配分に対して線形スキャンを行っていたため、小さな要求に対して大きなブロック(最大 16 KiB)を使用しており、結果として 30%–50% のメタデータオーバーヘッドを発生させていました。分割と結合はこれらの非効率性を軽減しましたが、根本的な問題の解決にはなりませんでした。また、すべての Lisp 値ポインタのリストが必要で複雑なスタンスキャン問題を招くため、保守的なガバジーコレクションが状況をさらに複雑にしていました。これらのボトルネックに対処するために、開発者はタグ付きポインタを単一の大きな配列への平坦なインデックスに置き換えるとともに、個々のオブジェクトのアロケーションから 64 バイトに aligned な

mmap
を用いたヒープへの移行を行いました。これによりページ境界を越えませんでした。初期の抵抗にもかかわらず、キャッシュフレンドリーであるためリンクリストではなく配列が採用されました。設計ではポインタが無効化されないようにするため、直接のインプレースリサイズを廃止し、代わりに新しい配列を割り当て、データをコピーして古いものを破棄する方式へと移行しました。拡張時には、データをコピーせずに容量を拡大しページを移動させる
linux_mremap
を使用しています。これらの向上により、メモリアクセシの断片化とオーバーヘッドが最小化され、
malloc
libc
などの重い依存関係を避けることができます。これにより、企業向けに最適化され軽量なインタプリータを提供し、プロセッサ効率を最大化することが可能になります。

本文

Lone: 動的言語の「副産物」となる進化の旅

多くの動的言語同様、Lone も当初はシンプルに始まりました。その実質は、C 言語で記述されたデータ構造の集合体です。本プロジェクトの唯一の目的は、以下の要素を結びつけることにありました:

  • すべての型を統括する ユニオン
  • メタデータを内蔵した タイピング済みの値構造
  • これらを「動作可能なプログラム」へと繋ぐ カスタム言語

1. スタートライン:「Nothing」から始まり、「One」へ至る

当初、世界という過酷な現実に対し、あまりにも 素直(naive) かつシンプルな思想に惹かれました。その反映とも言えるのがコードの初期形態です。

メモリー管理の独自実装

C 言語で記述する際、標準的な動的メモリー割当機能(

malloc
など)や
libc
は存在しません。**「私とコードのみ」**という状態でした。 そのため、独自のメモリーアローテーターを実装することになりました。

// データの基本情報:場所(位置)とサイズ
struct lone_memory {
    size_t size;
    unsigned char pointer[];
};

// 「自由か」「使用中か」の追跡が必要
struct lone_memory {
    bool free;
    size_t size;
    unsigned char pointer[];
};

// リンクリスト化により探索可能に(First Fit 方式)
struct lone_memory {
    struct lone_memory *prev, *next;
    bool free;
    size_t size;
    unsigned char pointer[];
};

割当と解放のロジック

  • 割当: リンクリストを探索し、適合する最初のブロックを使用(
    First Fit
    )。
  • 分割: 使用済みのブロックは残りを新たな自由ブロックとして分割。
    if (excess >= sizeof(struct lone_memory) + 1) {
        new = (struct lone_memory *) (block->pointer + size);
        new->free = true;
        new->size = excess - sizeof(struct lone_memory);
        block->size = size; // 元のサイズを更新
    }
    
  • 解放: ブロックを
    free
    にするだけでなく、隣りのブロックとも併せて統合(コエレスス)する処理も行う。

2. パフォーマンスの限界と課題

この自作アローテーターはシンプルではありましたが、以下のような重大な欠陥を持っていました:

  • 線形探索: すべての割当ごとにブロックリストを回すため非効率。
  • メモリーの浪費: メモリーフラグメンテーション(破片化)が抑制できず、OOM(Out of Memory)になる可能性大。
  • メタデータオーバーヘッド: ブロック記述子を前付けさせることで、通常割当時でも 30%〜50% のオーバーヘッドが発生。

しかし、このありえない仕組みで約 3 年間 ランディングし、必要なオブジェクト作成は賄ってきました。本質的には「値さえあれば」よかったためでした。


3. ガーベージコレクターとポインタの専制政治

Lone のガーベAGER コレクターは「保守的(conservative)」です。スタックを辿り、すべての Lis オブジェクトへのポインタ を厳しく精査する必要があります。

当初はスタック内の全ワードを全ポインタと比較するアプローチが考えられましたが、それは $O(N^2)$ の計算量となり現実的ではありませんでした。解決策として以下の工夫が必要となりました。

「第一のヒープ」への移行

汎用メモリーアローテーターのような保証ではなく、言語自体がまとめて購入(確保)する方式に変更しました。

struct lone_lisp_heap {
    struct lone_lisp_heap_value values[LONE_LISP_HEAP_VALUE_COUNT];
};
  • 仕組み: オブジェクトは個別に割当せず、ヒープという「巨大な配列」内のスロットとして管理。
  • ガベージコレクション: 「解放(dealloc)」するのではなく、死んだ値のみにマーク(殺す)を施すだけ。これによりスタックからの参照確認が簡素化される。

ポインタの問題点と解決策

しかし、巨大な配列には新たな問題がありました:

  • インサート不可: チャンクの真ん中に値を挿入するにはリサイズが必要(破壊的再構築)。
  • ポインタの専制政治: 既存のすべてのポインタが新しいメモリー領域において無効化され、ダングリング・ポインタ を招く。

これらの問題を解決するため、以下の決断を下しました:

  1. 根本的な変更: すべての値表現を再記述。
  2. ポインタ廃止: 「カンフーポインタ」から、Lone ヒープへのインデックスへ移行。

4. 完全なヒープ設計:ページ単位での管理

現在、Lone の値は配列へのインデックスとして扱われ、メモリー位置に依存しなくなりました。これにより、ヒープの再割当や移動が容易になりました。

キャッシュフレンドリーなデザイン

  • 値サイズを 56 バイト から 64 バイト に整列(キャッシュラインサイズに合わせる)。
  • ヒープ全体を巨大なページとして
    mmap
    で確保。
void lone_lisp_heap_initialize(struct lone_lisp *lone) {
    size_t size = LONE_LISP_HEAP_CAPACITY * sizeof(struct lone_lisp_heap_value);
    
    // Linux 固有の mremap の利用で柔軟なページ管理を実現
    lone->heap.values = linux_mmap(0, size,
                                   PROT_READ | PROT_WRITE,
                                   MAP_PRIVATE | MAP_ANONYMOUS,
                                   -1, 0);

    lone->heap.count = 0;
}

メモリー拡張と移動 (
mremap
)

linux_mremap
を使用することで、ページベースのヒープを効率的に拡大・移動できます。メモリのコピーを行うことなく、単にテーブルを更新するだけで済みます。

static void lone_lisp_heap_grow(struct lone_lisp *lone) {
    size_t old_capacity = lone->heap.capacity;
    size_t new_capacity = old_capacity * 2;
    
    // MREMAP_MAYMOVE オプションにより、メモリーが移動しても OK
    lone->heap.values = linux_mremap(lone->heap.values,
                                     old_capacity * sizeof(...),
                                     new_capacity * sizeof(...),
                                     MREMAP_MAYMOVE);

    lone->heap.capacity = new_capacity;
}

現状の評価

Lone のヒープは、「黒いモニュメント」(巨大で愚かで平坦な配列)へと変貌しましたが:

  • 位置非依存: インデックスによるアクセスのため、メモリー移動しても動作不变。
  • 効率性: 値単位の割り当てからページ単位へ進化し、
    mremap
    を活用した高速な拡張が可能に。

結論:「Nothing」から「One」、そして「Infinite」へ

  • Nothing(何もない): 独自実装のメモリーアローテーターでスタート。シンプルだが非効率。
  • One(一): ガーベージコレクターのためのヒープ構造を完成させ、ポインタ制約を打破。
  • Infinite(無限)への挑戦: 現在は線形探索によるガベージコレクションを行っており理論的には不完全。しかし、この仕組みで三年間稼働し、「値さえあれば」何とかなった実績があります。

次は、ゼロ番目のオブジェクトが常に生存しているという前提を捨て、完全に動的な処理へ。それが「無限」への第一歩となります。

同じ日のほかのニュース

一覧に戻る →

2026/05/29 1:49

Claude Opus 4.8

## Japanese Translation: Claude Opus バージョン 4.8 が正式にリリースされ、前世代と比較してコストが同等あるいは優位でありながら、パフォーマンスと信頼性の大幅な向上を示しています。このアップグレードは、Super-Agent ベンチマークにおけるすべての課題を制覇した最初のモデルとなった点で重要なマイルストーンとなります。同時に、高速モードや Genie といった特定のオーケストレーターを通じて比較的低価格帯のプランでも、ハイエンドクラスの GPT-5.5 に匹敵する性能を提供します。重要なのは、以前の問題だったコード生成の不備やツール呼び出しのエラーが解決されており、モデルの誠実性の向上により、コードの不備を見逃す確率が約 4 分の一に抑制されたことです。新しいアーキテクチャは「動的ワークフロー」を導入し、フルコードベース移行など大規模なタスクのために数百もの並列サブエージェントを可能にします。また、「Effort Control」といった機能によりユーザーが応答の深さをカスタマイズでき、Messages API のシステムエントリーを通じて計算リソースを浪費せずにリアルタイムで指示を更新することも可能です。複雑な財務文書や法律文書の処理において、Genie や Hebbia などのオーケストレーターを利用する企業は、大幅に向上した効率性と引用の精度を享受できます。全体として、Opus 4.8 は優れた推論能力、ユーザーの自律性を支える親社会的なアライメント、そして以前の コストパフォーマンス記録を更新し得るエンドツーエンドの完了機能を備えています。

2026/05/29 3:41

持続的なワークフローには PostgreSQL をそのまま使用してください

## Japanese Translation: 記事は、複雑な外部オーケストレーションサーバーを置き換え、永続的なワークフロー管理の中央エンジンとして PostgreSQL を採用することでインフラストラクチャを単純化することを提唱しています。Temporal や AWS Step Functions、Airflow といった専用のオーケストレーターに依存し、隔離されたワーカープール間でタスクを調整する従来のシステムとは異なり、このアプローチではオーケストレーションロジックを直接データベースに埋め込むことで、すべてロジックをリレーショナルデータベースエコシステム内に維持します。アプリケーションサーバーは標準的な workflows テーブルポーリングによってタスクをデキューし、ワーカーは Postgres テーブルに直接チェックポイントを行います。データベースの整合性制約が外部ロック機構なしで重複作業を防ぎます。高い可用性は、ワーカーが相互置換可能であることから達成されます(任意のワーカーがストリーミングレプリケーションと複数 AZ デプロイメントを使用して Postgres から状態を回復できます)。スケーラビリティは基盤となるデータベースの容量とともに拡大し、数千ものワークフローを処理できるよう垂直にスケールするか(CockroachDB などのように)分散化することができます。可観測性はチェックポイントに対する組み込み SQL クエリによって向上し、セキュリティオーバーヘッドは減少します(ワークフローデータが信頼された Postgres エンビロメント外に出ることはありませんので、別のオーケストレーターを強化する必要がありません)。DBOS は実用的な Postgres 裏付けの永続実行ソリューションを提供しており、Quickstart ドキュメント、GitHub リポジトリ、Discord コミュニティにてリソースを利用できます。

2026/05/29 4:02

多種多様な LLM のにおい

## Japanese Translation: 2026 年 5 月 28 日、著者は昨年終わりごろに数学ブログを立ち上げ、大規模言語モデル(LLM)を使用して文章を推敲した経験について考察する。当初は単なる改修のみを意図していたが、やがてインターネット全体にわたって同様の文構造が無数に出現することに気づき、これを「AI 臭」と呼んでいる。このような言語的な人工物の例としては、過度なツッコミポイント、あるいは「ただし、傾きは偶然ではない。それは最適解の形状である」といった連続した短い文や、「X は Y の Z であり」(例:「不愉快さは、選択した勾配を進むことの可視的签名である」)といった硬直的なメタセンテンスがある。また、「人類は対称性を信頼するのは、それが知性の可視化のように感じられるから」といった例も含まれる。また、AI 関与を識別するための視覚的な指標もある:ウェブサイトでは通常、JetBrains Mono フォントを特定の UI パターン(例:正確な段階ごとの箇条書きリスト、同一のボタン、標準化されたカード、点滅するドットのバッジ)と組み合わせて使用することが多い。脚注も別の指標として機能し得る。ガイドは AI ツールに対する非難ではなく、読者がこれらの新たな様式基準を認識することを助け、デジタルコンテンツをより適切に評価できるようにすることを目的としている。著者は LLM を創造的なタスクに使用することに反対しているのではなく、人間の表現と機械生成の出力を区別する検出可能な痕跡を特定することに焦点を当てていることを明記する。 ## Text to translate: Summary: On May 28, 2026, the author reflects on their experience starting a math blog late last year and using Large Language Models (LLMs) to polish their writing. Initially intending only enhancements, they soon noticed that identical sentence structures began appearing ubiquitously across the internet—signals they term "AI smells." These linguistic artifacts include excessive punchlines, consecutive short sentences such as "Yet the tilt is not an accident. It is the shape of the optimum," and rigid meta-sentences like "X is the Y of Z" (e.g., "Cringe is the visible signature of moving along a gradient you chose.") as well as examples like "Humans trust symmetry because it feels like intelligence made visible." Visual markers also help identify AI involvement: websites often use the JetBrains Mono font paired with specific UI patterns such as exact step-by-step bullet lists, identical buttons, standardized cards, and blinking-dot badges. Footnotes may serve as another indicator. Rather than condemning AI tools, the guide aims to help readers recognize these emerging stylistic standards so they can better evaluate digital content. The author clarifies that they are not against using LLMs for creative tasks; instead, the focus is on identifying detectable traces that distinguish human expression from machine-generated output.