2011-12-15 7 views
4

私はプログラミング言語の作成を検討しています。私が思っているのは、参照のような構造を含む言語では、新しい/ malloc演算子を持たないことは実現可能なのでしょうか?つまり、すべての変数はスタックのどこかに格納されるか、または静的に割り当てられます。汎用プログラミング言語でヒープを持たないことは可能でしょうか?

ガベージコレクタを実際に持たずに、より安全な型の安全性と「フリーガベージコレクション」が得られるという考えがあります。

私はあまりにも多くのスクリプト言語に精通していないので、すでにこれを行っている場合は、それを指摘してください。

(ダイナミック/未知のサイズのデータ​​構造は、ユーザの背中の後ろに、ヒープ上で)明らかに(処理される動的なリスト構造によって処理されるだろう。)

+1

私はここにあなたが何を持っているか正確にはわかりません。どのようにあなたの提案された言語は、配列を作成し、それへの参照を返す関数を扱うでしょうか?スタックにない場合は、その配列をどこに割り当てるべきですか?また、未知のサイズのオブジェクトをヒープ上の「動的リスト」に入れた場合、ガベージコレクションの必要性をどのように乗り越えるかはわかりません。 – sepp2k

+0

関数は配列を作成せず、参照を返しません。配列は呼び出し関数で作成する必要があります。また、動的リスト内のオブジェクトは、必然的に既知のサイズである必要があります。 – Dan

+0

私はあなたが私の2番目の質問を誤解したと思います。あなたは "動的/未知のサイズのデータ​​構造は動的なリスト構造によって処理される"と述べた。ガベージコレクションの必要性をどのように乗り越えるのかを知りたかっただけです。ある時点でリストからオブジェクトを削除する必要があります。そうしないと、メモリがリークします。 – sepp2k

答えて

-1

絶対にそのあなたのすべての要件がありませんスタックまたはヒープを実装する必要があります。 Cはスタックを指定しません。実際、多くの言語では気にする必要はなく、変数のための余裕を作るための実装(コンパイラ、解釈など)を指定するだけで、おそらくどれくらい長くかかります。

あなたの言語の通訳者は(仮定して)int main(void) { char memory[1048576]; run_script_from_stdin_using(memory); }を行うことができます。匿名のメモリブロックを取得して変数を隠すためにmmap(2)を呼び出すこともできます。オブジェクトがどこにあるかは関係ありません。スタック/ヒープは互換性があるという意味で疑問のある用語です。

+1

すべてのことが当てはまりますが(スタックとヒープという用語は互換性がありますが、それが何を意味するのかは分かりませんが)、OPに非常に役立つとは思いません。私が理解しているように、彼の目的は、ガベージコレクションまたは手動メモリ管理の必要性を回避することでした。オブジェクトをグローバル配列または 'mmap'されたメモリに格納する場合、それらを漏らさないようにするには、最終的にそれらを削除する必要があります。もちろん、「十分なメモリがあり、プログラムが終了するまでオブジェクトを放置させましょう」と言うこともできますが、ヒープ上で簡単に行うことができます。 – sepp2k

0

メソッドを終了した後に参照されないことがわかっている場合は、スタックにオブジェクトを割り当てることができます。これは、オブジェクトがメソッド(例えば、一時オブジェクト)のみで使用されること、またはネストされた呼び出しに起因するメソッドでのみ使用されることを意味します。しかし、これは厳しい制限です。この方向に行くいくつかの動的最適化があります(少なくとも一時オブジェクトの最適化)。おそらく、この制限を強制する静的なチェックメカニズムを持つこともできますし、ヒープとスタックオブジェクトを型で区別することもできます。

2

Fortranは常に「汎用」言語でしたが、動的メモリ割り当て。

通常、大きな配列を静的に割り当て、その上に独自のメモリ管理をシミュレートします。

GCと手動メモリ管理の両方を取り除く方法があなたが探しているものであれば、region analysisが助けになるかもしれませんが、ごく限られたケースでしかありません。

1

Region-based memory managementは、伝統的な意味でヒープを管理しないための1つの方法でした。これはとMLKitのような言語で明らかになりました。

関連する問題