Baby's Second Garbage Collector
> Source: Hacker_News
Execute Primary Source
// Problem
従来の精密なGCは、Lispスタック上のオブジェクトは把握できるが、ネイティブスタック(C言語等の実行環境のスタック)に存在するオブジェクトを追跡できない。その結果、スタックから脱出したオブジェクトが「ゴミ」と誤認され、誤回収によるプログラムの破壊が発生する。
// Approach
ネイティブスタックに対しては、値をポインタの候補として扱い、ヒープ範囲内か判定する「保守的なスキャン」を採用する。さらに、レジスタ内に残るポインタを捕捉するため、アセンブリを用いてレジスタの内容をスタックへ退避(Spilling)させる処理を実装し、すべてのルートを走査可能にした。
// Result
ネイティブスタックとレジスタの両方をスキャン対象に含めることで、オブジェクトの誤回収を防ぐ保守的なGCを実現した。これにより、スタック境界を越えて生存するオブジェクトを適切に保護し、システムの安定性を確保することに成功した。
Senior Engineer Insight
> 精密なGC(Precise GC)は、オブジェクトの型情報を完全に把握しているため効率的だが、ネイティブコードとの境界(ABI)において管理が破綻しやすい。本稿で示された、ネイティブスタックをポインタの候補として走査する「保守的なGC(Conservative GC)」への移行は、実装コストと安全性のバランスを取るための定石である。特に、レジスタ内の値をスタックへ退避(Spilling)させるためにアーキテクチャ固有のアセンブリを記述するプロセスは、ランタイムエンジニアが直面する、抽象化の限界を突破するための不可欠な作業である。