私のクラス プロジェクトでは、(単純な) Scheme コンパイラを実装する必要があります。
この時点で、さまざまな機能を実装する方法についてブレインストーミングを行っています。
典型的なSchemeの実装が複雑なGCに悩まされるのはなぜですか? コードが真に機能する (副作用がない) 場合、現在実行されていない関数は、割り当てられたメモリを保持できません。これまで!(漏れでなければ!)
C
したがって、スタック割り当てなど、ほとんどの命令型言語が従う戦略を使用しないのはなぜですか。(define (foo ..)
新しいレキシカル コンテキスト (または)が入力されるたびに(letrec ...
、変数ストレージをスタックに割り当て、コンテキストが終了したらスタック ポインターを調整します。
スキームにはmalloc()
事前定義されたタイプの割り当てしかなく、許可されているため、単純な実装ではプーリングまたはゾーン アロケーターを使用できるため、「スタック」は決して断片化されません。
クロージャーを実装する必要はありませんが、バインドされた値を、クロージャー状態を排他的に追跡するために使用される別のスタックにコピーすることで、同じように実装できると思います。
考え?