私は高水準言語を設計しており、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.
}
}
これは実用的なように見えるのか?レキシカルではないスコープの参照カウント領域を追加する必要がありますか?オブジェクトを参照できる弱い変数を追加する必要がありますが、領域の削除をチェックする必要がありますか?このシステムで使用するのが難しいアルゴリズムや、漏れてしまうアルゴリズムについて考えることはできますか?
また、GC管理メモリの割り当てを避けるために、MLtonは領域推論も行います。 –