スタックベースVMの概要 - Scheme VM のお勉強
dynamic link => 呼出し側の call frame をポイント
ヒープベースで使われていた stack レジスタはスタック構造ではなく、ヒープ上に alloc されたリンクリストだった。
スタックベースでは本当にスタック構造が使われる。
VM のレジスタの違い
- accumulator / next expression は同じ使われかたをする
- environment は相変わらず env 情報を保持する役割だが、一つ外側の call frame を指すスタックポインタになる
- stack は現在のスタックトップを指すスタックポインタになる
- rib は廃止。引数はスタックに直接置かれるようになる
VM instruction の違い
- (halt) 同じ
- (refer var x) スタックの中の static link をたどる
- (constant obj x) 同じ
- (closure vars body x) 現時点では closure ではなく functional を作る
- (test then else) 同じ
- (assign var x) スタックの中の static link をたど
- (conti x) 現時点ではサポートされない
- (nuate s var) 現時点ではサポートされない
- (frame x ret) dynamic link(カレントフレームポインタ)と ret を push する
- (argument x) current rib を使うのをやめスタックに引数を push する
- (apply) 大体挙動は同じ。rib に追加するのではなく、static link を push する
- (return n) 引数をとるようになる。スタックからいくつ分の要素を削除すれば良いか指定する