Created
August 9, 2012 10:09
-
-
Save ympbyc/3302927 to your computer and use it in GitHub Desktop.
3impのVMの内部動作再入門。けっこう忘れてた。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| ((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