call時のスタックオーバーフローをチェックを実装した - Scheme VM を書く

以前は push 時にスタックオーバーフローをチェックしていたが、パフォーマンス上 call 時にチェックしたほうが速い(らしい)ので実装。

手順は

  1. コンパイル時:コンパイル時に各コード片のスタック使用量を計算しコンパイル結果に反映
  2. コンパイル時:CLOSURE 作成命令列にスタック使用量を紛れ込ませる
  3. VM実行時:CLOSURE命令時に Closure データ構造に想定最大使用量を記録
  4. VM実行時:手続きを call する命令(APPLY)時に残りスタックと想定最大使用量を比べてチェック

というもの。

コンパイラの構造変更がややこしかったので svn でブランチ的なものを作って作業をした。
小さな変更をしてコミット&テストを繰り返してやっと実装できた。

手元では fib(30) で1割くらい速くなったのだけどそんなに速くなってないという Gaku さんからの報告も。