スタックベースVMで継続 - Scheme VM のお勉強

Continuation の実装。
このあたりは以前死ぬほどやったので簡単。

(compile '(call/cc (lambda (c) 1)) '() ())
=> (frame () (conti (argument (close (constant 1 (return 2)) (apply)))))

conti 命令で closure を作る。
save-stack でまるごとスタックの中身をヒープにコピーする。
closure body に nuate 命令、コピーしたスタック、return 命令をセットしてする。
closure は accumulator に置かれる。


nuate 命令ではスタックを restore して、スタックポインタも restore する。
その後、closure の中に閉じこまれていた return により処理を再開する。


論文では筆者は

  • Continuation の作成/復帰 はスタックのまるごとコピーが発生するので expensive である
  • しかし Continuation は closure call や変数参照と比べて使われる頻度が少ない
  • この Continuation 実装で、closure call や変数参照のコストは変わらない(重くならない)から良い

と書いていて僕も全く同意見。