2009-04-28 6 views
14

この回答これらのプログラミング言語ですスタックレスプログラミング言語がスタックレスなのはどういう意味ですか?

それらをスタックレスであるために、それが本当に何を意味するのでしょうか?コールスタックを使用しないという意味ですか?コールスタックを使用しない場合は、何を使用しますか?

+0

回答を参照してください。http://stackoverflow.com/questions/1016218/how-does-a-stackless-language-work/1053159#1053159 –

+0

ページが存在しません。http://stackoverflow.com/questions/551950/what-stackless-programming-languages-are-available/671296#671296 –

答えて

14

スタックレスであることは本当に何を意味していますか?コールスタックを使用しないという意味ですか?

はい、ほぼ正しいです。

コールスタックを使用していない場合はどうしますか?

正確な実装は、もちろん言語によって異なります。 Stackless Pythonには、一番上のフレームとその結果を使ってPythonインタプリタを起動するディスパッチャがあります。インタプリタは、オペコードをCALL_FUNCTION opcode(関数に入力しようとしている信号)に達するまで、必要に応じて1つずつ処理します。これにより、ディスパッチャは、関連情報を含む新しいフレームを構築し、アンワインドフラグを用いてディスパッチャに戻る。そこから、ディスパッチャが新たに始まり、インタプリタを一番上のフレームに向ける。

スタックレス言語はいくつかの理由からスタックを避けますが、多くの場合、特定のプログラミング構造を実装するのがはるかに簡単になるように使用されています。標準的なものはcontinuationsです。継続は非常に強力な、非常に単純な制御構造で、おそらく既に慣れ親しんでいるかもしれない通常の制御構造を表すことができます(whiledoifswitchなど)。

それは混乱だ場合、あなたはWikipediaの記事の周りにあなたの頭をラップ試してみたい、特にキュート継続サンドイッチ類推ことは:

あなたは冷蔵庫の前に台所にいると言いますサンドイッチを考えてあなたはそこに続けて、あなたのポケットに貼り付けます。その後、冷蔵庫から七面鳥やパンを取り出し、自分でサンドイッチにして、今カウンターに座っています。あなたはあなたのポケットの連続を呼び出すと、あなたはサンドイッチを考えて冷蔵庫の前に再び立ちます。しかし、幸いなことに、カウンターにはサンドイッチがあり、それを作るために使われた材料はすべて消えています。だからあなたはそれを食べる。

10

continuation-passing styleで動作するため、コールスタックは使用しません。テールコールの最適化に慣れていない場合は、これが何を意味するのかを理解するための第一歩です。

このモデルで従来のコール/リターンをエミュレートするには、リターンアドレスをプッシュする代わりに、フレームの残りの部分をそのままにしておくと、残りのコードと残りの変数解放される)。次に、呼び出し先へのテールコールを実行し、この継続を引数として渡します。呼び出し先が「返る」とき、戻り値を引数として渡して、この継続を呼び出すことで呼び出します。

これまでのところ、関数呼び出しを行うのは単なる複雑な方法です。ちょうどあなたが引数として一つの「リターン」の継続を渡すことができれば、あなたは、2(またはそれ以上)を渡すことができます -

  1. 例外/最終的には/ etcブロックが非常に容易にモデル化されています。しかし、それは、より複雑なシナリオに非常にうまく一般化簡単に。 lisp-y "条件ハンドラ"ブロック(呼び出し側に制御を返す場合としない場合があります)も簡単です。この関数の残りの部分を渡します。
  2. 同様に、複数の戻り値も簡単に作成できます。継承に複数の引数を渡します。
  3. 戻り値の一時的なコピーはもはや関数の引数渡しとは異なりません。これにより、一時的なものを排除しやすくなります。
  4. テール再帰の最適化は簡単です。呼び出し元は、新しいものを取得するのではなく、受け取った「戻る」継続を単純に渡します。
関連する問題