stack machine in Common Lisp

http://www.hpcs.is.tsukuba.ac.jp/~msato/lecture-note/comp2007/note8.html を参考に、スタックマシンを作成してみる。


まず最初につくったスタックマシンとの大きな違いは、ジャンプ命令があるところ。
今まではコンパイルされた push, add, sub のリストを順番に処理していたが、今度はそんなわけにはいかない。ちゃんとどこを実行しているか、保存しておく場所がいる。これがプログラムカウンタで、 vm クラスのスロット(Java でいうフィールドか)に持たせる。gauche の src/vm.c でも、Tiny C スタックマシンのソースでも、switch 文と無限ループ(相当)で書かれている部分。


それからスタックも、今は只のリストだけど、ちゃんと有限の長さにして、スタックのトップを示す SP を vm に持たせておく。
これは必須じゃないかもしれないが、SP の操作といわれてまごつかないようにするためやっておく。


まだぼんやりとしか分かっていないのが、関数呼び出しのためにあるらしい FP や LOAD, STORE 関連の命令。手を動かしたり、Cのコードを眺めて順番に理解する必要がある。
希望としては、Tiny C 用のこの vm が、簡易 Lisp の実装にも使えるくらい汎用的だと嬉しい。Tiny C をまるごと試すのはちょっと骨なので。ただしおそらくそうはなっていないだろうなぁ。