正確なGCがライブラリとして実装可能な言語はどのようなものでしょうか。


8

手動のメモリ管理を備えたプログラミング言語があるとします。正確なガベージコレクションを、基本的な言語構成要素としてではなく、ライブラリとして実装できるようにするために、この言語にはどのような機能が必要ですか?

正確なGCとは、ヒープへのポインタのみがトラバースされ、どの変数が有効であるかどうかを確認することを意味します。

その他の考慮事項:

  • CとC ++にはBoehmガベージコレクターがありますが、正確なGCではないため、これはカウントしません。Boehmコレクターは、スタック上でポインターである可能性のあるものはすべて、純粋にメモリー調整要件に基づいているものをポインターであると想定しています。たとえば、ポインタは4バイト境界で整列する必要があるため、ポインタのようにビットレベルk(k % 4) == 0見える整数。
  • カササギは、正確なガベージコレクターを使用するように既存のCコードを変換します。生成されたCコードには、ガベージコレクション用の多くのスタブがあります。つまり、コレクターを使用してスタックポインターをヒープに登録するためのものです。誰もそのようにコードを書くことは期待できないので、私はこれを数えません。これは、他の言語のコンパイルターゲットの詳細です。

そのような言語には次のものが必要だと思います。

  1. マクロまたは何らかの形のメタプログラミング。GCルートの登録などを行うために必要なすべての追加コードをカプセル化します。
  2. 構造体または共用体を検査できる反射メカニズム。どのメンバーがポインターであるかを判別する必要があります。
  3. スタックフレームのレイアウトを確認できる反射メカニズム。これは2よりもはるかに難しいようです。

これが漠然としたり、意見に基づくものではないことを願っていますが、しばらくの間、それについて疑問に思っていました。


興味深いアイデア/ 「考えられた実験」ですが、ガベージコレクションされた言語の重要な側面の一部は、割り当てられていないメモリへのポインタ参照が不可能であり、「ほとんど」(すべて?)のガベージコレクションされていない言語、およびすべてで強制できないものです。ポインタ/メモリロジック/参照は言語によって高度に管理されています。したがって、どのような答えでも、この重要な側面を考慮する必要があります。実際にはあなたが望む答えではないかもしれませんが、GCを非GC言語の単なるライブラリとして実装することは、想像できるほどのシナリオではないと思います。
vzn 2017

回答:


1

これはおそらくRustのような言語で可能であるか、少なくとも可能であると思いますが、おそらくあなたが考えているという意味では必ずしもそうではありません。

Rustに実際にGCライブラリーがありますが、正確さはわかりません。しかし、アイデアはGc<T>、typeの値へのガベージコレクションされたポインタに特定の型があるということですT。だからあなたが話しているメタプログラミングは起こりません

これを正確に可能にするのは、Rustの所有権システムです。アフィン線形型付けのため、メモリ内のすべての場所には、unsafeブロック(ガベージコレクターなどの実装に使用される)を使用して宣言されていない限り、最大で1つのポインターがあります。。したがって、Gc型にラップされていないポインタがある場合、スコープ外になるとすぐに割り当てが解除されます。したがって、それをポインタではないと見なすことはできません。それは、Gc型にラップされているか、単一所有であり、自動的に割り当て解除されています。

すべての型には、dropそれがスコープ外になったときに呼び出される暗黙的なメソッドがあり、それが指すものの割り当てを解除します。このdropメソッドはポインタであるかどうかを認識しているため、精度の向上にも役立ちます。

言語は強く静的に型付けされており、特にunsafeブロック内にいる場合を除き、他の型にキャストすることはできないため、特定のメモリチャンクの型を静的に知ることができます。

これは、非GCコードをガベージコレクションとして扱うことができるドロップイントランスフォーマーではありません。プログラマーは、収集する値を具体的に指定します。しかし、それを考えると、それはあなたの基準を満たす可能性があると思います。


1

言語自体を変更せずに、C ++でガベージコレクターを実装することは可能だと思います。ただし、ガベージコレクターを使用するには、プログラマーが任意の言語構造を使用することを制限する必要があります。特に、すべてのメモリ割り当て要求は、ガベージコレクターによって提供される割り当てAPIを介して行われる必要があり、すべてのアクセスは、ガベージコレクターによって管理される参照を介して行われる必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.