この答えによると
これらのプログラミング言語はすべてスタックレスです
- スタックレスPython
- PyPy
- 舌足らずの発音
- 図式
- Tcl
- ルア
- Parrot VM
彼らがスタックレスであるとはどういう意味ですか?コールスタックを使用しないということですか?コールスタックを使用しない場合、何を使用しますか?
この答えによると
これらのプログラミング言語はすべてスタックレスです
彼らがスタックレスであるとはどういう意味ですか?コールスタックを使用しないということですか?コールスタックを使用しない場合、何を使用しますか?
彼らがスタックレスであるとはどういう意味ですか?コールスタックを使用しないということですか?
はい、その通りです。
コールスタックを使用しない場合、何を使用しますか?
もちろん、正確な実装は言語ごとに異なります。Stackless Pythonには、最上位のフレームとその結果を使用してPythonインタープリターを起動するディスパッチャーがあります。CALL_FUNCTION
インタプリタは、関数に入力しようとしている信号であるオペコードに到達するまで、必要に応じて一度に1つずつオペコードを処理します。これにより、ディスパッチャは関連情報を使用して新しいフレームを作成し、アンワインドフラグを使用してディスパッチャに戻ります。そこから、ディスパッチャが新たに開始し、インタプリタを最上部のフレームに向けます。
スタックレス言語は、さまざまな理由でコールスタックを避けますが、多くの場合、特定のプログラミング構造の実装がはるかに簡単になるように使用されます。標準的なものは継続です。継続は非常に強力で非常に単純な制御構造であり、おそらくすでに使い慣れている通常の制御構造(、、、、など)のいずれかを表すことwhile
がdo
できif
ますswitch
。
それが紛らわしい場合は、ウィキペディアの記事、特にかわいい継続サンドイッチの例えに頭を包んでみてください。
冷蔵庫の前のキッチンにいて、サンドイッチのことを考えているとしましょう。あなたはすぐそこに続きを取り、あなたのポケットにそれを貼り付けます。次に、冷蔵庫から七面鳥とパンを取り出し、サンドイッチを作ります。サンドイッチは現在、カウンターに座っています。ポケットの中で継続を呼び出すと、サンドイッチのことを考えて、再び冷蔵庫の前に立っていることに気づきます。しかし、幸いなことに、カウンターにはサンドイッチがあり、それを作るために使用されていたすべての材料がなくなっています。だからあなたはそれを食べます。
継続渡しスタイルで動作するため、コール スタックを使用しません。テール コールの最適化に慣れていない場合は、これが何を意味するのかを理解するための最初のステップとして最適です。
このモデルで従来の呼び出し/戻りをエミュレートするために、戻りアドレスをプッシュしてフレームの残りの部分が変更されないことを期待する代わりに、呼び出し元はコードの残りの部分とまだ必要な変数を閉じます (残りは解放されます)。次に、この継続を引数として渡して、呼び出し先への末尾呼び出しを実行します。呼び出し先が「戻る」ときは、この継続を呼び出し、戻り値を引数として渡すことによってそうします。
上記の限りでは、関数呼び出しを行うための複雑な方法にすぎません。ただし、より複雑なシナリオにうまく一般化できます。