私はおもちゃの手続き型言語の趣味のコンパイラ/インタプリタに取り組んでおり、良いガベージ コレクション アルゴリズム (この男に似ています) を除いて、探索しようとしているほとんどの機能を実装しました。私はさまざまなアルゴリズムについてかなり読んだことがあり、それらを実装する方法についての一般的な考えを持っています。私の言語ランタイムの以前の反復では参照カウントを使用していましたが、より高度なことを学ぶためにそれをやめたので、現在はマークとコピーの圧縮アルゴリズムを検討しています。
開始時の私の最初の問題は、アルゴリズムがネイティブ拡張関数 (つまり、C で記述された関数) の「オブジェクト」を収集できないことです。ルート セットは、インタープリターのスタック上の「オブジェクト」とシンボル テーブル内の「オブジェクト」で構成されています。これらについてはあまり問題にならないはずですが、コンテナの「オブジェクト」が C 関数で作成されてから、子「オブジェクト」、実際にはインタープリタースタック上にないか、シンボルにバインドされていないため、GC がそれらを収集しないようにするにはどうすればよいですか?
GC の実装を容易にするもの:
- 私の言語のすべての「オブジェクト」は組み込み型です (たとえば、オブジェクト指向ではありません)。
- インタプリタ スタックは、構造体へのポインタの単なるスタックです。
- シンボル テーブルは、構造体へのポインタの単なる配列です
ユーザーコード:
f = open('words.txt', 'r');
lines = readlines(f);
close(f);
インタプリタ (解析後、バイトコードにコンパイル...):
push
ファイル名、open_modebuiltin_fopen
をラップする構造体を返す呼び出しFILE*
- 結果をシンボルに格納
f
- プッシュ記号
f
builtin_flines
リストタイプを作成する呼び出しl
、次にCfread
を使用してファイルの各行を文字列タイプとして読み取り、リストに追加しますl
- 結果をシンボル
lines
に格納するなど....
ファイル内の行を含む文字列の 1 つが割り当てられている間に GC が実行された場合、ルート セットにはまだ への参照がないl
ため、収集されるはずです。これをより適切に処理する方法についてのアイデアはありますか?