Haskellで再帰関数をプログラミングしているときに質問がありました。特定の言語(またはHaskell)のコールスタックが特定の時点でメモリ不足になる可能性はありますか?
ありがとう :)
Haskellで再帰関数をプログラミングしているときに質問がありました。特定の言語(またはHaskell)のコールスタックが特定の時点でメモリ不足になる可能性はありますか?
ありがとう :)
メモリの量には限りがあり、呼び出しスタックの各フレームがゼロ以外のバイト数を使用する場合(末尾呼び出しの最適化により、これは少し複雑になります)、十分に深い再帰でリソースを使い果たすことができなければなりません。 。基本的なロジック。
とはいえ、どれだけ深く進むことができるかは、スタックの実装によって異なります。スタックが通常の割り込みスタック(その言語との関連付けからCスタックとも呼ばれる)に実装されている場合、使用可能なスペースは非常に限られており、小さなフレームでかなり深くなるのに十分ですが、フレームサイズが大きくなると実際に制限されます(より大きなタイプのより多くの変数を使用)。すべての言語が割り込みスタックを使用するわけではなく、代わりにスタックをヒープスペース(はるかに大きい)に配置します。
通常、スタックサイズはCの場合のように、Haskellの実装では問題になりません。これは、非標準の仮想マシンを備えた関数型言語であるためです。つまり、その関数呼び出しはプロセススタックフレームに直接マップされません。それらは管理されており、ヒープ(Stackless Pythonなど)に割り当てることができます。ただし、サイズは有限であり、とにかくスタックオーバーフローが発生する可能性があります。
はい、できます。それはその特定のプログラムのスタックに割り当てられたリソースに依存しますが、それがあまりにも熱心である場合、それは最終的にスタックオーバーフローで終わります。ウィキペディアでより多くの情報と例を見つけることができます。
はい。スタックは単なるメモリの領域であるため、有限のリソースであり、悪用すると不足する可能性があります。C ++では、これは再帰だけでなく、ヒープではなくスタック上に作成される変数が多すぎるか(または大きすぎる)場合に適用されます。