web-dev-qa-db-ja.com

スタックベースの言語でのガベージコレクションの必要性はありますか?

スタックベースの言語でのガベージコレクション(GC)の必要性は何ですか? Forth または [〜#〜] rpl [〜#〜]HP電卓 )のような言語では、ゴミが必要ですかコレクション?

出力がスタックからポップされるので、必要はないと思います。何か不足していますか?

16
Todd Moses

GCは通常、ヒープに割り当てられたメモリに適用されます。私はForthやRPLに精通していませんが、ヒープがなく、すべてがグローバルスタックに格納されている場合、GCが行うことは何もありません。

14
Mike Baranczak

はい、あなたが正しい。しかし、スタックベースは全体の一部にすぎません。たとえば、Javaバイトコードインタープリターはスタックベースでもあります(コンパイルされたコードは-効率上の理由で-動作が異なります)。これにより、どの言語もスタックに変換できることがわかります言語。

重要なのは、スタック外のオブジェクト、つまり現在のメソッドの実行よりも長く存続できるオブジェクトです。言語にmallocnewのようなものがない限り、そのようなオブジェクトはなく、deleteもGCも必要ありません。

動的メモリ割り当てが不足している言語は、その有用性がかなり制限されています。

13
maaartinus

言語が動的データ構造を本質的にサポートする場合は、ガベージコレクションが必要です。 Cのレベルを超えて何かを実行したい場合、これはほとんど必要です。それがないと、固定サイズのデータ​​構造だけでスタックして、自分でメモリを管理できます。もちろん、これは元のForthが行っていることですが、低レベルのシステムコーディングしか行っていない場合を除いて、今日はそうしたくないでしょう。

1
trans

言語がスタック割り当てではなく静的割り当てを使用する場合、ガベージコレクションは必要ありません。たとえば、Fortran 77で -s(静的ストレージ) オプションを使用すると、プログラムの起動時にすべてのメモリが割り当てられるため、実行時に解放されるメモリ割り当ては発生しません。ある程度の訓練が必要ですが、プログラム、特に静的メモリ割り当てを使用するシミュレーションを作成することは可能です。静的割り当てはメモリリークを削除し、コンパイラは静的分析を使用して何をキャッシュにロードするかを決定できるため、キャッシュのパフォーマンスが向上します。

1
Michael Shopsin