この回答これらのプログラミング言語ですスタックレスプログラミング言語がスタックレスなのはどういう意味ですか?
- StacklessのPythonの
- PyPy
- の
すべてによるLispの
- スキーム
- のTcl
- Luaの
- オウムのVM
それらをスタックレスであるために、それが本当に何を意味するのでしょうか?コールスタックを使用しないという意味ですか?コールスタックを使用しない場合は、何を使用しますか?
この回答これらのプログラミング言語ですスタックレスプログラミング言語がスタックレスなのはどういう意味ですか?
すべてによるLispの
それらをスタックレスであるために、それが本当に何を意味するのでしょうか?コールスタックを使用しないという意味ですか?コールスタックを使用しない場合は、何を使用しますか?
スタックレスであることは本当に何を意味していますか?コールスタックを使用しないという意味ですか?
はい、ほぼ正しいです。
コールスタックを使用していない場合はどうしますか?
正確な実装は、もちろん言語によって異なります。 Stackless Pythonには、一番上のフレームとその結果を使ってPythonインタプリタを起動するディスパッチャがあります。インタプリタは、オペコードをCALL_FUNCTION
opcode(関数に入力しようとしている信号)に達するまで、必要に応じて1つずつ処理します。これにより、ディスパッチャは、関連情報を含む新しいフレームを構築し、アンワインドフラグを用いてディスパッチャに戻る。そこから、ディスパッチャが新たに始まり、インタプリタを一番上のフレームに向ける。
スタックレス言語はいくつかの理由からスタックを避けますが、多くの場合、特定のプログラミング構造を実装するのがはるかに簡単になるように使用されています。標準的なものはcontinuationsです。継続は非常に強力な、非常に単純な制御構造で、おそらく既に慣れ親しんでいるかもしれない通常の制御構造を表すことができます(while
、do
、if
、switch
など)。
それは混乱だ場合、あなたはWikipediaの記事の周りにあなたの頭をラップ試してみたい、特にキュート継続サンドイッチ類推ことは:
あなたは冷蔵庫の前に台所にいると言いますサンドイッチを考えてあなたはそこに続けて、あなたのポケットに貼り付けます。その後、冷蔵庫から七面鳥やパンを取り出し、自分でサンドイッチにして、今カウンターに座っています。あなたはあなたのポケットの連続を呼び出すと、あなたはサンドイッチを考えて冷蔵庫の前に再び立ちます。しかし、幸いなことに、カウンターにはサンドイッチがあり、それを作るために使われた材料はすべて消えています。だからあなたはそれを食べる。
continuation-passing styleで動作するため、コールスタックは使用しません。テールコールの最適化に慣れていない場合は、これが何を意味するのかを理解するための第一歩です。
このモデルで従来のコール/リターンをエミュレートするには、リターンアドレスをプッシュする代わりに、フレームの残りの部分をそのままにしておくと、残りのコードと残りの変数解放される)。次に、呼び出し先へのテールコールを実行し、この継続を引数として渡します。呼び出し先が「返る」とき、戻り値を引数として渡して、この継続を呼び出すことで呼び出します。
これまでのところ、関数呼び出しを行うのは単なる複雑な方法です。ちょうどあなたが引数として一つの「リターン」の継続を渡すことができれば、あなたは、2(またはそれ以上)を渡すことができます -
回答を参照してください。http://stackoverflow.com/questions/1016218/how-does-a-stackless-language-work/1053159#1053159 –
ページが存在しません。http://stackoverflow.com/questions/551950/what-stackless-programming-languages-are-available/671296#671296 –