Skip to content

Instantly share code, notes, and snippets.

@ympbyc
Created August 9, 2012 10:09
Show Gist options
  • Select an option

  • Save ympbyc/3302927 to your computer and use it in GitHub Desktop.

Select an option

Save ympbyc/3302927 to your computer and use it in GitHub Desktop.
3impのVMの内部動作再入門。けっこう忘れてた。
((lambda (A) A) 1)
-> compile ->
(frame (halt) (constant 1 (argument (close (A) (refer A (return)) (apply)))))
------- VM ---------
a - アキュムレータ 一時的な値を保存しておく
x - (今回実行するインストラクション [引数,...] (次に実行するインストラクション [引数,...] (...))
e - 環境。applyのタイミングでribに入っている値をクロージャのローカル変数に束縛してクロージャの環境に追加してここに保存する。
r - 未束縛の実引数
s - コールスタック 関数呼び出しの前にreturn後のコードと現在のVMのe r sを保存しておく
ある関数Aの外で別の関数Bが作られるときは、returnによってA定義前の環境が復元されるから、BからAのローカル変数は参照できなくなる。===レキシカルスコープ
frame (halt) - s:((halt) nil nil nil)<=(x e r s)
nextと現在のVMのe r sの状態をコールスタックに保存
constant 1 - a:1
Aをアキュムレータにそのまま積む
argument - r:(1)<=a
アキュムレータの内容を未束縛の引数リストrに加える
close vars body - a:((refer A (return)) nil<=env (A))
クロージャ(本体 現在の環境 未評価の仮引数)を作ってアキュムレータに詰む
apply - e:(((A)<=a 1<=r))
x:(refer A (return))<=a
r:nil
クロージャの仮引数リストと、ribの実引数リストから環境を作ってクロージャの環境に追加したものを環境eにセット
クロージャのbodyをxにセット
refer A - a:1<=e
環境からAを検索して結果をアキュムレータに積む
return - x:(halt)<=s
e:nil<=s
r:nil<=s
s:nil<=s
x e r sをスタックから復元する
halt - 1
アキュムレータを返却する
--------- ダンプ ---------
acum: nil
xecu: (frame (halt) (constant 1 (argument (close (A) (refer A (return_)) (apply)))))
env : nil
rib : nil
stak: nil
acum: nil
xecu: (constant 1 (argument (close (A) (refer A (return_)) (apply))))
env : nil
rib : nil
stak: ((halt) nil nil nil)
acum: 1
xecu: (argument (close (A) (refer A (return_)) (apply)))
env : nil
rib : nil
stak: ((halt) nil nil nil)
acum: 1
xecu: (close (A) (refer A (return_)) (apply))
env : nil
rib : (1)
stak: ((halt) nil nil nil)
acum: ((refer A (return_)) nil (A))
xecu: (apply)
env : nil
rib : (1)
stak: ((halt) nil nil nil)
acum: ((refer A (return_)) nil (A))
xecu: (refer A (return_))
env : (((A) 1))
rib : nil
stak: ((halt) nil nil nil)
acum: 1
xecu: (return_)
env : (((A) 1))
rib : nil
stak: ((halt) nil nil nil)
acum: 1
xecu: (halt)
env : nil
rib : nil
stak: nil
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment