5

私のクラス プロジェクトでは、(単純な) Scheme コンパイラを実装する必要があります。

この時点で、さまざまな機能を実装する方法についてブレインストーミングを行っています。

典型的なSchemeの実装が複雑なGCに悩まされるのはなぜですか? コードが真に機能する (副作用がない) 場合、現在実行されていない関数は、割り当てられたメモリを保持できません。これまで!(漏れでなければ!)

Cしたがって、スタック割り当てなど、ほとんどの命令型言語が従う戦略を使用しないのはなぜですか。(define (foo ..)新しいレキシカル コンテキスト (または)が入力されるたびに(letrec ...、変数ストレージをスタックに割り当て、コンテキストが終了したらスタック ポインターを調整します。

スキームにはmalloc()事前定義されたタイプの割り当てしかなく、許可されているため、単純な実装ではプーリングまたはゾーン アロケーターを使用できるため、「スタック」は決して断片化されません。

クロージャーを実装する必要はありませんが、バインドされた値を、クロージャー状態を排他的に追跡するために使用される別のスタックにコピーすることで、同じように実装できると思います。

考え?

4

2 に答える 2

7

クロージャーがなくても、エイリアシングは難しい部分です。具体的には、プロシージャーが構造化されたデータを作成し、その一部を返すとしますか? どの部分を解放するかをどのように決定しますか? この問題を解決できれば...まあ、ガベージ コレクションを再発明したことになります。

Rust (www.rust-lang.org) は、領域を使用し、プログラマーが所有権を明示的に追跡することを要求することで、プログラマーがすべての GC を回避できるようにするシステムレベルの言語です。さまざまなポインター型を使用します。

于 2013-04-26T16:43:19.560 に答える