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 レジスタに保存したを取り出し実行を再開する。