私は高水準言語を設計しており、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.
}
}
これは実用的ですか?非レキシカル スコープの参照カウント領域を追加する必要がありますか? 任意のオブジェクトを参照できる弱い変数を追加する必要がありますが、領域の削除をチェックする必要がありますか? このシステムで使用するのが難しい、または漏洩する可能性のあるアルゴリズムは何か考えられますか?