Scheme VM のお勉強

手続き呼出し

(a 3) のような手続き呼出しの実行を見る。

コンパイルすると以下のように

(a 3)
=> (frame () (constant 3 (argument (refer a (apply)))))

frame 命令は current value rib を空にし、指定された next expression とその時点での env/rib/stack を stack に保存する。
ここでいう stack は構造が stack なのではなくてレジスタの名前が stack なだけなので注意。


constant 命令は accumulator に 3 をセットして next expression に (argument ...) をセットする。
accumulator はデータを次の命令に引き継ぐときに使われる、next expression は次に VM に処理される命令である。


argument 命令は current value rib に accumulator の値を追加する。
argument が繰り返されれば、current value rib には引数のリストがたまっていく。


refer 命令は env で a を lookup して accumulator に値をセットする。
apply 命令。
apply される closure は accumulator にあり、(body e vars) の構造をしている。
これを取り出し
next expression を bodyにする。
vars と current value rib と closure 作成時の environment を元に environment を作りなおす。
current value rib を () にする。

(return)
frame 命令が stack レジスタに保存したを取り出し実行を再開する。