継続を実装する方法は?

優れた要約は、Clinger、Hartheimer、および Ost による記事、Implementation Strategies for First-Class Continuations にあります。特に Chez Scheme の実装を見ることをお勧めします。

スタックのコピーはそれほど複雑ではなく、パフォーマンスを向上させるために利用できるよく理解されたテクニックがいくつかあります。ヒープ割り当てフレームの使用も非常に簡単ですが、明示的な継続を使用しない「通常の」状況では、オーバーヘッドが発生するというトレードオフがあります。

入力コードを継続渡しスタイル (CPS) に変換すると、スタックを完全になくすことができます。ただし、CPS は洗練されていますが、フロント エンドに別の処理ステップが追加され、特定のパフォーマンスへの影響を克服するために追加の最適化が必要になります。


あなたに役立つかもしれない記事を読んだことを覚えています:Cheney on the M.T.A. :-)

SISC など、私が知っているスキームの実装の中には、呼び出しフレームをヒープに割り当てるものがあります。

@ollie:すべての呼び出しフレームがヒープ上にある場合は、巻き上げを行う必要はありません。もちろん、パフォーマンスにはトレードオフがあります。ホイストにかかる時間と、すべてのフレームをヒープに割り当てるために必要なオーバーヘッドです。おそらく、インタープリターで調整可能なランタイムパラメーターにする必要があります。 :-P


ゼロから始める場合は、Continuation Passing Style (CPS) 変換を検討する必要があります。

良い情報源には、"LISP in small pieces" と Marc Feeley の 90 分間のプレゼンテーションが含まれます。