2009-03-28 14 views
4

私は高水準言語を設計しており、C++(それはLLVMを使用する)のスピードを持ちたいが、C#のような安全で高レベルなものにしたい。ガベージコレクションは遅く、新規/削除は危険です。私は、「地域ベースのメモリ管理」を使用しようと決心しました(これは主に機能的な言語のためにウェブ上にいくつかの論文があります)。それを使用する唯一の「有用な」言語はCycloneですが、それにもGCがあります。基本的に、オブジェクトは字句スタックに割り当てられ、ブロックが閉じると解放されます。オブジェクトは、同一リージョンまたはそれ以上の他のオブジェクトのみを参照することができ、参照の不一致を防ぐことができます。これをより柔軟にするために、スタックを上下に動かすことができ、ループを通して保持できる並列領域を追加しました。タイプシステムはほとんどの場合、割り当てを検証することができますが、いくつかの場所ではオーバーヘッドのランタイムチェックが必要になります。地域ベースのメモリ管理

例:

region(A) { 
    [email protected] x=new Foo(); //x is deleted when this region closes. 
    region(B,C) while(x.Y) { 
     [email protected] 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(); 
     [email protected] 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. 
    } 
} 

これは実用的なように見えるのか?レキシカルではないスコープの参照カウント領域を追加する必要がありますか?オブジェクトを参照できる弱い変数を追加する必要がありますが、領域の削除をチェックする必要がありますか?このシステムで使用するのが難しいアルゴリズムや、漏れてしまうアルゴリズムについて考えることはできますか?

+0

また、GC管理メモリの割り当てを避けるために、MLtonは領域推論も行います。 –

答えて

11

コメントはありません。問題は、地域が安全であることを保証するためには、非常に洗練されたタイプのシステムが必要であることです.-私はあなたがTofteとTalpinによって論文を見てきたと思います。地域がうまく機能しても、プログラムの寿命はプログラムの寿命である必要があり、少なくともその地域はガベージコレクションされなければならない可能性が非常に高いです。 (サイクロンには、 GCの領域があります)。

ガーベッジコレクションに参加することをお勧めします。現代のガベージコレクタは、かなりの労力を要することなく、かなり高速に作成できます。主な問題は、割り当てが高速になるように連続した空き領域から割り当てることです。ハードウェア・レジスタを割り振りポインタとして使用できるように、AMD64またはスペア・レジスタを備えた他のマシンをターゲットにすることが役立ちます。

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

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

+0

この投稿の後に状況が変わったのですか? [私はケーキを食べて食べることもできると思う](http://stackoverflow.com/a/7102860/309483)。 –

+0

言語のセマンティクスに領域を追加するのはどれほど難しいでしょうか?つまり、すべての価値レベルの用語は型だけでなく地域も持つことになります。値を別の領域に転送するには、領域を保存する明示的なコピーまたは移動操作が必要ですが、領域は保持しません。関数は、同じ基礎となるパラメトリック多型機構を使用して、型多型および領域多型であることができる。 Cと同じくらい速く(ほとんどではないが)ガベージコレクションの休止を持たないMLのような言語のアイデアは、私にとって非常に魅力的なものだと思う。 – pyon

-1

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

RefcountingまたはGCは、ほとんど常に最適な選択肢であるため、非常に一般的です。世代別ガベージコレクタは非常に効率的です。

+0

割り当てられたオブジェクトを返すには、呼び出し側が引数として割り当てられる領域を渡す必要があります。発信者はそれを「所有」し、その地域が閉じると解放されます。 – Zifre

3

リージョンベースのメモリ管理で言語を実装していた場合は、おそらくA language-independent framework for region inferenceと表示されます。それは、私がこのようなことを調べてからしばらくしていたと言いました。最先端の技術が進歩したと確信しています。

0

あなたはAppleのメモリ管理について調べてください。それはあなたがここでやっているのとよく似ているリリースプールとゾーンを持っています。

私は地域をしようとするからあなたを阻むだろう、「GCが遅い」発言に

0

リージョンベースのメモリ管理については、TofteとTalpinの論文から始めることができます。

+0

TofteとTalpinのリファレンスはノーマン・ラムゼイの返信で既に引用されている... Good試してみてください;-) –