VM で compiler.scm を実行したらスタックオーバーフローになったので原因を調べる。古いVMでは起きなかったので設計ミスやバグが予想される。
まずは VM に仕掛けをほどこし、最大でスタックをどれだけ消費したかを実行後に出力するようにした。新旧 VM にいくつかのコードを食わせてスタック消費量を比較。
項目 | 旧VMの消費量 | 新VMの消費量 | 備考 |
---|---|---|---|
簡単な100回再帰 | 8 | 12 | FRAME2回分の差 |
wikiのコード | 37 | 68 | |
compilerでwikiをコンパイル | 409 | 930 | |
A正規化したcompilerでwikiをコンパイル | 391 | 2301 |
結果的には
- FRAME 命令で以前と比べてスタックを多く消費するようになった
- A正規化で let1 がたくさん出てくる
の2つが原因で大きなバグではなさそう。