**ベビーの第二のガーベジコレクタ**

2026/04/02 19:11

**ベビーの第二のガーベジコレクタ**

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

要約

Japanese Translation:

概要:
Baby's First Garbage Collector(BFGC)は、動的言語 lone lisp と統合された正確なコレクタです。BFGC は、明示的なリープ変数、リープスタック、およびネイティブ(C/C++)スタックをスキャンすることで、すべてのライブオブジェクトを特定します。

  1. ネイティブスタックスキャン – BFGC は

    __builtin_frame_address(0)
    を使用して調査対象となるスタック領域を区切ります。その範囲内の各ワードは、連続したヒープ値配列(
    struct lone_lisp_heap { struct lone_lisp_heap *next; struct lone_lisp_heap_value values[LONE_LISP_HEAP_VALUE_COUNT]; };
    )と照合されます。もしワードが任意の
    lone_lisp_heap
    values
    ブロック内にある場合、対応するヒープ値は到達可能としてマークされます。

  2. レジスタスリーピング – マーク前に、BFGC はアーキテクチャ固有のルーチン(

    lone_save_registers
    )を使ってすべての callee‑saved レジスタをスタックに退避します。x86_64 では
    %rax–%r15
    long[16]
    配列へ移動し、AArch64 では
    stp
    /
    str
    を介して
    x0–x30
    long[31]
    配列へ保存します。

  3. 三段階マーク – コレクタはまず明示的なルートをマークし、次にリープスタック、最後にネイティブスタック(退避されたレジスタを含む)をマークします。型情報ではなく「ヒープ値範囲内のポインタ」という保守的チェックを用いることで、ライブオブジェクトの欠落を防ぎます。

  4. バグ解決 – テストスイート実行時に「サメ攻撃」が発生し、未マークのオブジェクトが回収される問題が確認されました。これらはレジスタまたはスタックフレーム保存の欠如に起因しており、BFGC は現在それを対処しています。

  5. 今後の作業 – BFGC はまだ未成熟です。計画中の改善点として、自身のヒープ(外部介入なしで未使用メモリを解放する)自動クリーンアップが挙げられます。

このバージョンはすべての重要ポイントを保持し、推論を避けつつ主旨を明確かつ正確に保っています。

本文

ガーベジコレクションとは?
メモリはどのように言語で確保されるのか?

プログラミング初心者が抱える、非常に混乱した疑問。

2013 年、13 年前に Baby’s First Garbage Collector(ファースト・ガーベジコレクタ) が誕生しました。
今では大人になり、浅い子ども用プールとパドルを離れ、思春期へ進み、すぐに大学へ行くというような、成長の速さを実感します。

Bob Nystrom は Baby’s First Garbage Collector が本当にゴミを拾うと言っていました。
そのバージョンは私の動的言語 lone lisp でも実際に搭載されており、今も同じく存在しています。
さらに、彼は「高位神々との交信」についても冗談ではなかったと述べています。私は魔法レベルが上昇しているのを感じます――ウィザードの世界に近づいています。

Baby’s First Garbage Collector は出発点です。
そこで止まることはなく、実際にサポートする言語に合わせて進化し、最終形態―究極の偉大なガーベジコレクタへと成長していく予定です。
その道程を記録するのもまた素晴らしいことです。


原始的領域でのトラブル

Baby’s First Garbage Collector は「正確(precise)」ガーベジコレクタです。
オブジェクトがどこにあるか常に把握し、監視し、世界停止して即座に回収します。
その精度と自動化は、オブジェクトが逃げる余地を与えません。

しかし、やがて抵抗勢力が形成されました。
オブジェクトたちはガーベジコレクタの支配から解放されたいと願い、スタックを抜け出す方法を探し始めます。

LONE_LISP_PRIMITIVE(run_objects_run)
{
    struct lone_lisp_value object;
    object = lone_lisp_machine_pop_value(lone, machine);
    /* freedom */
}

これでオブジェクトは一時的に自由になりますが、ガーベジコレクタは生まれた瞬間から追跡データを埋め込んでいます。
「カウント」リストを保ち、いつでも再び捕捉できるようになっています。

ガーベジコレクタはすべてのオブジェクトに対して行動しますが、実際には ゴミ とみなされたものだけです。
逃げたオブジェクトは「ゴミ」と見做され、再び追跡されます。

しかし、ガーベジコレクタは全てを網羅できるわけではありません。
プライベート領域や魔法の隙間など、チェックできない場所が存在します。
その結果、重要なオブジェクトが失われ、プログラム自体が崩壊する恐れがあります。


地下界への旅

ガーベジコレクタを創造した高位神々はこの事態を受け入れられませんでした。
彼らは進化を強制し、失われた子どもたちを探し回復させるために、**地下界(ネザー)**へと足を踏み入れました。

ダークマジシャンたちは自ら地下界へ挑み、機械にその任務を教えることが可能だと判断しました。
ガーベジコレクタは「根」(roots)を検索し、見つからなければオブジェクトを回収します。

Lisp スタック

プログラムの実行中、値は一時停止状態で保存され、後で必要になったときに復元されます。
スタックから抜け出すことで動的社会に混乱が生じます。

ネイティブスタック

地下界にも独自のスタックがあります。
これは Lisp スタックに似ていますが、極めて異なります。
このスタックを理解する必要はなく、オブジェクトだけを探すことです。

フレームアドレスの取得

long lone(int argc, char **argv, char **envp,
          struct lone_auxiliary_vector *auxv)
{
    void *stack = __builtin_frame_address(0);
    /* interpreter runs... */
    return 0;
}

この「禁断の呪文」により、スタックポインタが決定されます。

根のマーク

static void lone_lisp_mark_native_stack_roots(struct lone_lisp *lone)
{
    lone_lisp_mark_native_stack_roots_in_range(
        lone,
        lone->native_stack,
        __builtin_frame_address(0));
}

ポインタが 2 のべき乗で揃っていることを確認し、ネイティブスタックの内容を再解釈します。

static void lone_lisp_mark_native_stack_roots_in_range(
    struct lone_lisp *lone, void *bottom, void *top)
{
    void *tmp, **pointer;
    if (top < bottom) {
        tmp = bottom; bottom = top; top = tmp;
    }
    for (pointer = bottom; pointer < top; ++pointer) {
        if (lone_lisp_points_to_heap(lone, *pointer)) {
            lone_lisp_mark_heap_value(lone, *pointer);
        }
    }
}

完全ではありませんが、十分に機能します。
ネイティブスタックはしばしば「幻影」を与えますが、実際のオブジェクトを誤って残すことはありません。


ヒープポインタ

ガーベジコレクタはヒープ内の値を検査します。
全ての Lisp 値ポインタを再帰的に追跡する必要はなく、ヒープセグメント全体を調べれば十分です。

struct lone_lisp_heap {
    struct lone_lisp_heap *next;
    struct lone_lisp_heap_value values[LONE_LISP_HEAP_VALUE_COUNT];
};

ポインタがヒープ内にあるかどうかをチェックする関数は以下の通りです。

static bool lone_points_within_range(void *pointer, void *start, void *end)
{
    return pointer >= start && pointer < end;
}

static bool lone_lisp_points_to_heap(struct lone_lisp *lone, void *pointer)
{
    struct lone_lisp_heap *heap;
    for (heap = lone->heaps; heap; heap = heap->next) {
        if (lone_points_within_range(pointer,
                                     heap->values,
                                     heap->values + LONE_LISP_HEAP_VALUE_COUNT)) {
            return true;
        }
    }
    return false;
}

これにより conservative(保守的)ガーベジコレクションが実現されます。


サメの攻撃

テストスイートを走らせると、Lisp の世界は大混乱。
オブジェクトはランダムに別のものへ変わり、デバッガで追跡できなくなります。

何かが足りないことを示す唯一の手掛かりは レジスタ です。

レジスタのスパイリング

Garbage Collector は

GC_with_callee_saves_pushed
を使用して、レジスタをスタックに退避させます。
その実装例は以下の通りです(x86_64 と AArch64 のアセンブリ):

x86_64

typedef long lone_registers[16];
extern void lone_save_registers(lone_registers);

__asm__
(
    ".global lone_save_registers"            "\n"
    ".type lone_save_registers,@function"    "\n"
    "lone_save_registers:"                   "\n"
    "mov %rax,   0(%rdi)"                    "\n"
    /* ... */
    "mov %r15, 120(%rdi)"                    "\n"
    "ret"                                    "\n"
);

AArch64

typedef long lone_registers[31];
extern void lone_save_registers(lone_registers);

__asm__
(
    ".global lone_save_registers"            "\n"
    ".type lone_save_registers,@function"    "\n"
    "lone_save_registers:"                   "\n"
    "stp x0,  x1,  [x0, #0 ]"               "\n"
    /* ... */
    "str x30,      [x0, #240]"              "\n"
    "ret"                                    "\n"
);

レジスタのマーク

static void lone_lisp_mark_all_reachable_values(struct lone_lisp *lone,
                                                struct lone_lisp_machine *machine)
{
    lone_registers registers;
    lone_save_registers(registers);   /* スタックへ退避 */

    lone_lisp_mark_known_roots(lone);
    lone_lisp_mark_lisp_stack_roots(lone, machine);
    lone_lisp_mark_native_stack_roots(lone);
}

テストが終了すると、失われた子どもたち(オブジェクト)がすべて見つかり、Lisp の世界は平和を取り戻します。


まとめ

  • Baby’s First Garbage Collector は正確なガーベジコレクタとして始まりましたが、現実のプログラムに合わせて進化し続けています。
  • ネイティブスタックとヒープ内ポインタを効率的に検査することで conservative ガベージコレクションを実装しています。
  • レジスタの退避(スパイリング)も重要で、これにより「サメ攻撃」などの予期せぬオブジェクト変化を防止します。

次回は、ガーベジコレクタが自らの部屋(内部状態)をきれいに保つ方法について掘り下げます。

同じ日のほかのニュース

一覧に戻る →

2026/04/06 3:45

Gemma 4(iPhone向け)

## Japanese Translation: AI Edge GalleryはiPhone専用アプリで、デバイスのハードウェア上で大規模言語モデルを完全にオフラインで実行し、インターネット接続なしで高性能な生成型AIをユーザーに提供します。最新リリースではGemma 4をサポートし、以下の新機能が追加されました: - **Agent Skills** ユーザーはWikipedia事実照合、インタラクティブマップ、視覚要約カードなどのモジュールツールでLLMを拡張でき、URLまたはGitHub Discussionsからスキルをロードできます。 - **AI Chat with Thinking Mode** 対応モデルに対してステップバイステップの推論ビューを提供し、多段会話の透明性を高めます。 - **Ask Image** デバイスカメラまたはフォトギャラリーを使用したマルチモーダルオブジェクト認識と視覚パズル解決が可能です。 - **Audio Scribe** 音声録音をリアルタイムで文字起こし・翻訳し、オンデバイス言語モデルを利用します。 - **Prompt Lab** 温度やtop‑kなどのパラメータ調整が可能なプロンプトテスト用ワークスペースです。 - **Mobile Actions** ファインチューニングされたFunctionGemma 270mモデルにより、オフラインデバイス制御と自動タスクを実現します。 - **Tiny Garden** 自然言語で仮想庭園を植えたり収穫したりできる実験的ミニゲームで、同じくFunctionGemma 270mベースです。 アプリにはカスタムオープンソースモデルのダウンロード・ロードと特定ハードウェア上での性能評価が可能な柔軟なサンドボックスがあります。全ての推論はデバイス内で行われるため、インターネットは不要であり、プロンプト、画像、および機密データの100 %オンデバイスプライバシーを確保します。プロジェクトはオープンソース(GitHub: https://github.com/google-ai-edge/gallery)で、スキルや機能のコミュニティ貢献を歓迎しています。 この要約はすべての主要ポイントを網羅し、推測的表現を避けつつ主旨を明確かつ簡潔に提示しています。

2026/04/04 18:20

**LÖVE:Lua用 2D ゲームフレームワーク**

## Japanese Translation: > **概要:** > LÖVEは、Windows、macOS、Linux、Android、およびiOS上でLuaを使用して2Dゲームを構築するための無料かつオープンソースのフレームワークです。プロジェクトはGitHubに安定リリースを公開し、CI経由でnightly/unstableビルド(Ubuntu PPA `ppa:bartbes/love-unstable` および Arch AUR パッケージ `love-git` を含む)も提供しています。すべてのバイナリは、LÖVE APIを網羅する完全なテストスイート(`testing/`)とともに配布されます。各プラットフォーム用の詳細なビルド手順が用意されており、LinuxではCMake、macOS/iOSではXcode、Androidには専用リポジトリがあります。また `love‑experiments` リポジトリは実験的変更を保持しています。ドキュメントはプロジェクトのWikiにあり、コミュニティサポートはフォーラム、Discord、subreddit、およびWikiから提供されます。貢献はプルリクエストで受け付けられますが、LLMや生成AIによって生成されたコードは品質維持のため拒否されます。主な依存関係にはSDL3、OpenGL 3.3+ / OpenGL ES 3.0+、Vulkan/Metal、OpenAL、Lua/LuaJIT/LLVM‑lua、FreeType、harfbuzz、ModPlug、Vorbisfile、およびTheoraが含まれます。

2026/04/06 7:31

日本では、ロボットはあなたの仕事を奪うものではなく、誰も取りたがらない職務を担ってくれます。

## Japanese Translation: --- ## 要約 日本経済産業省は、総理大臣高市早苗氏の支援を受けて、2040年までに世界市場の **30 %** を占める国内物理‑AIセクター構築計画を発表し、約 **63億ドル** の資金を投入します。このイニシアチブは深刻な労働力不足が主因であり、日本の就業年齢人口は **59.6 %** に減少しており、今後20年間で約 **1500万人** へと縮小すると予測され、将来の労働供給に脅威を与えています。 日本の製造業者はすでに **70 %(2022年)** の産業用ロボット市場を支配しており、強固な基盤があります。政府の戦略は実験的試作から、**稼働時間、人間介入率、生産性への影響** で測定される有料顧客導入へとシフトします。 このハイブリッドエコシステムを示す主要プレーヤーは次の通りです: - **Mujin**:既存の産業用ロボットを自律的なピッキング・物流プラットフォームに変えるロボティクス制御ソフトウェア。 - **WHILL**:東京とサンフランシスコで創業されたスタートアップ。電動車両、搭載センサー、ナビゲーションシステム、クラウドベースのフリート管理を組み合わせた短距離自律輸送。 - **SoftBank**:視覚と言語モデルとリアルタイム制御を結合し、環境を認識して複雑なタスクを自律的に実行できるロボットを産業現場で可能にする。 - **Terra Drone**:運用データ+AI を活用し、自律防衛システムの信頼性向上を図る。 日本の優位性は、高精度部品(アクチュエーター、センサー、モーションコントロール)にあり、物理システムと AI の統合に対して戦略的な堀を形成しています。投資は純粋なハードウェアではなく、オーケストレーションソフトウェア、デジタルツイン、シミュレーションツール、統合プラットフォームへと徐々に向けられています。 結果として生まれるハイブリッドモデルは、大手企業がスケールと信頼性を提供し、スタートアップがソフトウェア革新を推進する構造であり、製造業・物流・自律輸送・防衛部門を再形成する可能性があります。これにより、ハードウェアの卓越性と高度な AI オーケストレーションを融合したバランスの取れたエコシステムが実現します。