私はプログラミング言語の設計を実験してきましたが、ガベージコレクションシステムを実装する必要が出てきました。ここで最初に頭に浮かんだのは参照カウントでしたが、これは参照ループを処理しません。アルゴリズムを検索するときに出くわすページのほとんどは、Javaなどの既存の言語でのガベージコレクターの調整に関するリファレンスです。特定のアルゴリズムを説明するものを見つけたとき、実装のための十分な詳細が得られていません。たとえば、ほとんどの説明には「プログラムのメモリが不足したとき...」が含まれていますが、これは、スワップが十分にある4GBシステムではすぐには発生しない可能性があります。したがって、私が探しているのは、ガベージコレクターを開始するタイミングを調整する方法など、実装の詳細が記載されたチュートリアルです(つまり、
私がやろうとしていることについてもう少し詳しく説明するために、Postscriptに似たスタックベースのインタプリタを書くことから始めます。次の試みは、おそらくLisp方言の1つに基づくS式言語です。 。私はストレートCで実装しています。私の目標は、独学と、さまざまな段階を「インタプリタの設計と作成方法」チュートリアルに文書化することの両方です。
これまでに行ったことについては、スタックマシンスタイルのVMによって解析および処理されるCスタイルの命令型言語を実装する単純なインタープリターを作成しました(lang2e.sourceforge.netを参照)。ただし、この言語は関数の入力時に新しいメモリを割り当てず、ポインタデータ型も持たないため、当時はどのタイプの高度なメモリ管理も実際には必要ありませんでした。次のプロジェクトでは、非ポインター型オブジェクト(整数、文字列など)の参照カウントから始めて、別のメモリープール内のポインター型オブジェクト(循環参照を生成できる)を追跡することを考えています。 。次に、プールが前のガベージコレクションサイクルの終了時よりもX割り当て単位を超えて大きくなるたびに、コレクターを再度開始します。
私の要件は、非効率的ではないが、実装と文書化が簡単であるということです(他の人がフォローできるように、これを紙や本に発展させたいことを忘れないでください)。私が現在前面に持っているアルゴリズムは3色のマーキングですが、世代別コレクターの方が少し優れているように見えますが、文書化して理解するのは困難です。ですから、私が始めるのに十分な実装の詳細を含むいくつかの明確な参考資料(できればオンラインで入手可能)を探しています。