スタックベース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) 引数をとるようになる。スタックからいくつ分の要素を削除すれば良いか指定する