4

私は高水準言語を設計しており、C++ の速度 (LLVM を使用します) を持ちながら、C# のように安全で高水準であることを望んでいます。ガベージ コレクションは遅く、新規作成/削除は安全ではありません。「領域ベースのメモリ管理」を使用することにしました (Web 上には、主に関数型言語に関する論文がいくつかあります)。それを使用する唯一の「便利な」言語は Cyclone ですが、GC もあります。基本的に、オブジェクトはレキシカル スタックに割り当てられ、ブロックが閉じると解放されます。オブジェクトは、ダングリング参照を防ぐために、同じリージョンまたはそれ以上のリージョンにある他のオブジェクトのみを参照できます。これをより柔軟にするために、スタックを上下に移動でき、ループを通じて保持できる並列領域を追加しました。ほとんどの場合、型システムは割り当てを検証できますが、

元:

region(A) {
    Foo@A x=new Foo(); //x is deleted when this region closes.
    region(B,C) while(x.Y) {
        Bar@B n=new Bar();
        n.D=x; //OK, n is in lower region than x.
        //x.D=n; would cause error: x is in higher region than n.
        n.DoSomething();
        Bar@C m=new Bar();
        //m.D=n; would cause error: m and n are parallel.
        if(m.Y)
            retain(C); //On the next iteration, m is retained.
    }
}

これは実用的ですか?非レキシカル スコープの参照カウント領域を追加する必要がありますか? 任意のオブジェクトを参照できる弱い変数を追加する必要がありますが、領域の削除をチェックする必要がありますか? このシステムで使用するのが難しい、または漏洩する可能性のあるアルゴリズムは何か考えられますか?

4

5 に答える 5

14

私はあなたが地域を試すことを思いとどまらせます。問題は、地域の安全を保証するためには、非常に洗練された型システムが必要であるということです--- TofteとTalpinの論文を見て、複雑さを理解していると思います。リージョンが正常に機能している場合でも、プログラムの存続期間がプログラムの存続期間であるプログラムが必要になる可能性は非常に高く、そのリージョンは少なくともガベージコレクションが必要です。(これが、CycloneにリージョンGCがある理由です。)

まだ始めたばかりなので、ガベージコレクションを使用することをお勧めします。最新のガベージコレクターは、多くの労力をかけなくてもかなり高速に作成できます。主な問題は、割り当てが高速になるように、隣接する空き領域から割り当てることです。ハードウェアレジスタを割り当てポインタとして使用できるように、スペアレジスタを備えたAMD64またはその他のマシンをターゲットにするのに役立ちます。

適応するための良いアイデアはたくさんあります。実装が最も簡単なのは、Joel Bartlettのほとんどコピーするコレクターのようなページベースのコレクターです。このコレクターでは、完全に空のページからのみ割り当てるという考え方があります。

既存のガベージコレクターを調査したい場合、Luaにはかなり洗練されたインクリメンタルガベージコレクターがあり(したがって、目に見える一時停止時間はありません)、実装はわずか700行です。パフォーマンスが重要な多くのゲームで使用するのに十分な速度です。

于 2009-03-28T01:07:13.887 に答える
5

リージョン ベースのメモリ管理を使用して言語を実装する場合、おそらくA language-independent framework for region inference を読むでしょう。そうは言っても、私がこのことを調べてからしばらく経ちましたが、最新技術が何であるかを知っていたとしても、最新技術は進んでいると確信しています.

于 2009-03-28T01:00:07.133 に答える
0

領域ベースのメモリ管理に関する Tofte と Talpin の論文から始めることができます。

于 2012-02-17T19:35:03.263 に答える
0

Apple のメモリ管理を勉強する必要があります。リリース プールとゾーンがあり、あなたがここでやっていることとよく似ています。

「GCが遅い」という発言にはコメントしませんが、

于 2009-03-28T01:00:41.250 に答える
-1

動的に作成されたオブジェクトをどのように返しますか?誰がそれを「所有」し、メモリを解放する責任がありますか?

ほとんどの場合、リカウントまたはGCが最良の選択であるため、リカウントまたはGCは非常に一般的です。世代別のガベージコレクターは非常に効率的です。

于 2009-03-28T00:30:49.497 に答える