17

この答えによると

https://stackoverflow.com/questions/551950/what-stackless-programming-languages-are-available/671296#671296

これらのプログラミング言語はすべてスタックレスです

  • スタックレスPython
  • PyPy
  • 舌足らずの発音
  • 図式
  • Tcl
  • ルア
  • Parrot VM

彼らがスタックレスであるとはどういう意味ですか?コールスタックを使用しないということですか?コールスタックを使用しない場合、何を使用しますか?

4

2 に答える 2

17

彼らがスタックレスであるとはどういう意味ですか?コールスタックを使用しないということですか?

はい、その通りです。

コールスタックを使用しない場合、何を使用しますか?

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

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

それが紛らわしい場合は、ウィキペディアの記事、特にかわいい継続サンドイッチの例えに頭を包んでみてください。

冷蔵庫の前のキッチンにいて、サンドイッチのことを考えているとしましょう。あなたはすぐそこに続きを取り、あなたのポケットにそれを貼り付けます。次に、冷蔵庫から七面鳥とパンを取り出し、サンドイッチを作ります。サンドイッチは現在、カウンターに座っています。ポケットの中で継続を呼び出すと、サンドイッチのことを考えて、再び冷蔵庫の前に立っていることに気づきます。しかし、幸いなことに、カウンターにはサンドイッチがあり、それを作るために使用されていたすべての材料がなくなっています。だからあなたはそれを食べます。

于 2009-04-28T04:32:59.297 に答える
12

継続渡しスタイルで動作するため、コール スタックを使用しません。テール コールの最適化に慣れていない場合は、これが何を意味するのかを理解するための最初のステップとして最適です。

このモデルで従来の呼び出し/戻りをエミュレートするために、戻りアドレスをプッシュしてフレームの残りの部分が変更されないことを期待する代わりに、呼び出し元はコードの残りの部分とまだ必要な変数を閉じます (残りは解放されます)。次に、この継続を引数として渡して、呼び出し先への末尾呼び出しを実行します。呼び出し先が「戻る」ときは、この継続を呼び出し、戻り値を引数として渡すことによってそうします。

上記の限りでは、関数呼び出しを行うための複雑な方法にすぎません。ただし、より複雑なシナリオにうまく一般化できます。

  1. exception/finally/etc ブロックは非常に簡単にモデル化できます。1 つの「リターン」継続を引数として渡すことができれば、2 つ (またはそれ以上) を同じように簡単に渡すことができます。Lisp-y の「条件ハンドラー」ブロック (呼び出し元に制御を返す場合と返さない場合がある) も簡単です。この関数の残りの部分に継続を渡します。これは、呼び出される場合と呼び出されない場合があります。
  2. 複数の戻り値も同様に簡単になります - いくつかの引数を継続に渡します。
  3. 戻り一時/コピーは、関数の引数の受け渡しと変わらなくなりました。これにより、多くの場合、一時的なものを簡単に削除できます。
  4. 末尾再帰の最適化は些細なことです。呼び出し元は、新しいものをキャプチャするのではなく、受け取った「リターン」継続を単に渡します。
于 2009-04-28T04:51:01.750 に答える