ここ数日苦労していたこと解決 - Scheme VM を書く

数日前に、合成命令を導入するとその前後でどのように速度に変化があるか?を調べていたのだけど、コンパイラに合成命令を吐かせるのに苦労していました。


苦労していた点は

  • コンパイラが(自分にとって相対的に)複雑になってきたことによる改修コストの増加
  • 命令列の一部に即値で命令列のオフセットが入っていた事

の2点。


例えば FRAME 10 みたいにオペランドにオフセットが入ってしまうものがある。
この命令の後にあった CONSTANT 0 PUSH を CONSTANT0_PUSH とかやるとオフセットがずれてしまうという問題。


こんなのをだましだましやっていたんですが、コンパイラが遅くなったりコードが追えなくなりそうになって悩んでいました。
今日やっとコンパイラの構造を変更し、オフセットの埋め込みを遅延させるような構造が完成。


ついでに合成命令をパターンマッチで簡単に出力できるようにし環境がやっと整いました。
ふぅ。いや大変だったが勉強になった。


ちなみに Gauche は合成命令の生成を code.c の Scm_CompiledCodeEmitという関数でやっています。