関連する質問: スタック トレース/同様のデバッグ機能はどのように表示されますか?
これがばかげた質問でしたらすみませんが、私は低レベルのプログラミングについてあまり知りません。ほとんどの CPU にはスタックに関連する命令があることは知っていますが、適切に最適化されたスタックレス言語は本当にそれほど遅くなるでしょうか?
関連する質問: スタック トレース/同様のデバッグ機能はどのように表示されますか?
これがばかげた質問でしたらすみませんが、私は低レベルのプログラミングについてあまり知りません。ほとんどの CPU にはスタックに関連する命令があることは知っていますが、適切に最適化されたスタックレス言語は本当にそれほど遅くなるでしょうか?
簡単な答え: 問題がスタックを必要とする場合、言語/ハードウェアに組み込まれているスタックは、おそらく、記述できるスタックよりもはるかに高速です。
「スタックレス言語」とは何かを考えてみましょう。
元の Fortran 言語には、スタックの概念がありませんでした。あなたが書くことができたのは、1 つの大きな MAIN プログラムだけでした。その後、サブルーチンを作成して呼び出すことができると信じられないほど便利であることが判明したため、値を返す関数とともに追加されました。しかし、私が個人的に発見したように、MAIN がサブルーチン A を呼び出し、それが B を呼び出すと、どういうわけか B が再び A を呼び出していることに気付くでしょう。A が MAIN に戻ろうとすると、代わりに B に戻り、それが A に戻るというように、マシンは「リターン ループでハング」します。戻るために複数のことを覚える方法はありませんでした。
そのため、その Fortran では、独自のスタックを作成しないと問題を解決できない問題がありました。つまり、配列と、その配列にインデックスを付けることで次に何をするかを追跡する整数変数があり、後で「プッシュ」および「ポップ」と呼ばれるようになることを行うことになります。
これは非常に便利であることが判明し、後の言語に組み込まれました。それを行うにはさまざまな方法があります。マシンにスタックが組み込まれるようになる前は、PL/1 などの言語は、有効化レコードのリンク リストの形式で効果的にスタックを作成し、常に割り当てと削除を行っていました。(あまり効率的ではありませんが、うまくいきました。)
したがって、あなたの言語にスタックがなく、特定の問題を解決しようとする場合、生きている言語から独自のスタックを切り出さなければなりません。このような問題の例として、深さ優先のツリー ウォーキングがあります。
それができるとすれば、その言語は「スタックレス」ですか?