總結篇4-1 虛擬機擴展2——解釋運行高級語言
- 0 虛擬機解釋器擴展概述
- 0-1 解釋器擴展意義
- 0-2 解釋器擴展結構
- 0-3 解釋器擴展代碼
- 1 界面
- 1-1 解釋器初始化啟動
- 1-2 解釋器輔助函數
- 2 結構
- 2-0 虛擬機
- 2-1 寄存器擴展
- 2-2 操作擴展
- 2-3 控制代碼
- 2-4 解釋器環境
- 3 控制代碼
- 3-1 簡單表達式(simple-controller)
- 3-2 變數表達式(var-controller)
- 3-3 條件表達式(if-controller)
- 3-4 序列表達式(sequence-controller)
- 3-5 應用表達式(app-controller)
- 4 核心
- 4-1 解析入口(eval-controller)
- 4-2 過程應用(apply-controller)
0 虛擬機解釋器擴展概述
0-1 解釋器擴展意義
解釋器擴展用來擴展虛擬機實現解釋運行高級語言代碼
這裡的高級語言是scheme的基礎語法組成的語言解釋器擴展在寄存器機器的基礎上擴展了語言解析功能
0-2 解釋器擴展結構
界面: 解釋器虛擬機初始化與啟動
結構:解釋器的底層結構主要有虛擬機結構,解釋器結構控制代碼 : 解釋器高級語法的解析實現
核心 : 代碼解析與過程運行的核心
0-3 解釋器擴展代碼
以SICP第五章5.4代碼注釋為主
包含一部分解釋器與虛擬機的定義代碼
1 界面
1-1 解釋器初始化啟動
;定義全局環境(define the-global-environment (setup-environment));啟動解釋器虛擬機(start eceval)
1-2 解釋器輔助函數
解釋器虛擬機
(define eceval (make-machine ;寄存器擴展 (exp env val proc argl continue unev) ;操作列表擴展 eceval-operations ;控制代碼序列 (<all-controller>) ))
操作列表擴展
(define eceval-operations (list (list self-evaluating? self-evaluating) <op-list> <完整操作列表見 2 結構-虛擬機操作擴展> ))
控制代碼
;所有控制代碼<all-controller> ;求值循環控制代碼 <loop-controller> ;其他控制代碼 <other-controller></all-controller>;求值循環控制代碼;包括求值循環控制,輸出控制,錯誤控制三部分<loop-controller>read-eval-print-loop ;清空堆棧,列印輸入提示語 (perform (op initialize-stack)) (perform (op prompt-for-input) (const ";;;EC_Eval input:")) ;初始化exp env continue分別為待解析代碼,全局環境,最頂層返回棧 (assign exp (op read)) (assign env (op get-global-environment)) (assign continue (label print-result)) ;跳轉到解析入口 (goto (label eval-dispatch))print-result ;列印輸出提示語,輸出val中運行結果 (perform (op announce-output) (const ";;;EC-Eval value:")) (perform (op user-print) (reg val)) ;跳轉到列印循環入口等待輸入 (goto (label read-eval-print-loop))unknown-expression-type ;解析錯誤信息 (assign val (const unknown-expression-type-error)) (goto (label signal-error))unkonw-procedure-type (restore continue) ;運行錯誤信息 (assign val (const unknown-procedure-type-error)) (goto (label signal-error))signal-error ;輸出錯誤信息 (perform (op use-print) (reg val)) ;返回求值循環等待輸入 (goto (label read-eval-print-loop))</loop-controller>;解釋運行控制代碼;見3 控制代碼和4 核心<other-controller> <simple-controller> <set-controller> <if-controller> <sequence-controller> <app-controller> <eval-controller> <apply-controller></other-controller>
2 結構
2-0 虛擬機
虛擬機基礎結構 見 總結篇4 虛擬機——VM
2-1 寄存器擴展
- unev: 緩存表達式寄存器(緩存待解析的表達式)
- exp: 當前表達式寄存器(存儲當前解析的表達式)
- proc: 運算符寄存器
- argl: 實參寄存器
- val: 返回值寄存器
- continue: 返回棧寄存器
- env: 環境寄存器
val 存儲exp表達式的解析結果
proc和argl只用作app表達式的解析過程中,存儲運算符operator解析
結果和運算對象operands解析結果
exp 主要要來保存當前解析的表達式,調用eval-dispatch對exp中的表達式解析解析,
unev 用在形參解析中多個待解析形參的保存,序列解析中多個待解析表達式序列的保存
continue存儲子調用的返回地址。可以是解析時的子解析完返回地址,也可以是運行時的子調用返回地址。
env 存儲變數的環境
壓棧的內容通常是unev continue env等,這裡的順序按照unev env continue進行壓棧和出棧
2-2 操作擴展
操作擴展 包含解釋器虛擬機應用到的自定義過程,
過程的定義散落在解釋器與虛擬機總結篇中。這裡只是簡單羅列,具體定義查看對應總結篇[x],
<op-list> (list .. ...) (list ... ....)</op-list>
2-3 控制代碼
控制代碼虛擬機的解釋器功能
控制代碼具體內容見3 控制代碼和4 核心
這裡只簡單羅列控制代碼列表
<simple-controller> ;簡單表達式<var-controller> ;變數表達式<if-controller> ;條件表達式<sequence-controller> ;序列表達式<app-controller> ;應用表達式<eval-controller> ;解析入口<apply-controller> ;過程應用
2-4 解釋器環境
這裡的解釋器環境與解釋器總結篇的環境操作一致
主要包括環境初始化,環境變數添加,環境變數修改,環境變數查找這裡簡單羅列環境操作,具體的環境操作定義見 解釋器總結篇
the-empty-environment ;初始環境為空setup-environment ;安裝環境extend-environment ;擴展環境變數lookup-variable-value ;查找環境變數
3 控制代碼
3-1 簡單表達式(simple-controller)
簡單表達式控制代碼
主要是簡單值的表達式,數字和字元串,過程體,符號數據
<simple-controller>ev-self-eval (assign val (reg exp)) (goto (reg continue))ev-lambda ;unev 形參,exp 過程體 (assign unev (op lambda-parameters) (reg exp)) (assign exp (op lambda-body) (reg exp)) ;構造過程 (assign val (op make-procedure) (reg unev) (reg exp) (reg env) ) (goto (reg continue))ev-quoted (assign val (op text-of-quotation) (reg exp)) (goto (reg continue))</simple-controler>
3-2 變數表達式(var-controller)
變數表達式控制代碼
主要是變數定義 變數修改 變數查找
<var-controller>ev-definition ;保存variabel-name,只可以從寄存器保存到棧 (assign unev (op definition-variable) (reg exp)) (save unev) ;解析variable-value環境初始化 (assign exp (op definition-value) (reg exp)) ;保存解析調用上下文 (save env); (save continue) ;解析variavle-value後的返回地址 (assign continue (label ev-definition-1)) ;開始解析variable-value (goto (label eval-dispatch))ev-definition-1 ;恢復解析調用上下文 (restore continue) (restore env) (restor unev) ;存儲變數定義到env (perform (op define-variable!) (reg unev) (reg val) (reg env) ) ;解析成功返回值 (assign val (const ok)) ;返回定義調用棧繼續執行 (goto (reg continue))ev-assignment ;保存賦值變數名稱variable-name (assign unev (op assignment-vairable) (reg exp)) (save unev) ;解析賦值內容variable-value環境初始化 (assign exp (op assignment-value) (reg exp)) ;保存解析上下文 (save env) (save continue) ;解析完variable-value的返回地址 (assign contine (label ev-assignment-1)) ;開始解析variavle-value (goto (label eval-dispatch))ev-assignment-1 ;恢復解析上下文 (restore continue) (restore env) (restore unev) ;修改變數的值 (perform (op set-variable-value!) (reg unev) (reg val) (reg env) ) ;賦值成功返回值 (assign val (const ok)) ;返回賦值調用棧繼續執行 (goto (reg continue))ev-variable ;查找變數值,保存到val (assign val (op lookup-variable-value) (reg exp) (reg env)) ;返回變數查找調用棧繼續運行 (goto (reg continue))</var-controller>
3-3 條件表達式(if-controller)
if表達式控制代碼
主要是if表達式入口,if謂詞解析,if假分支解析,if真分支解析
<if-controller>ev-if ;保存解析上下文 (save exp) (save env) (save continue) ;解析謂詞decide初始化 (assign continue (label ev-if-decide)) (assign exp (op if-predicate) (reg exp)) ;開始解析謂詞decide (goto (label eval-dispatch))ev-if-decide ;解析環境恢復 (restore continue) (restore env) (restore exp) ;判斷謂詞decide解析結果 (test (op true?) (reg val)) ;是否調整真分支還是繼續運行假分支 (branch (label ev-if-consequent))ev-if-alternative (assign exp (op if-alternative) (reg exp)) (goto (label eval-dispatch))ev-if-consequent (assign exp (op if-consequent) (reg exp)) (goto (label eval-dispatch))</if-controller>
3-4 序列表達式(sequence-controller)
begin表達式控制代碼
主要是begin表達式解析入口,序列解析循環
<sequence-controller>ev-begin ;獲取begin表達式操作序列 (assign unev (op begin-actions) (reg exp)) ;保存begin解析上下文 (save continue) ;開始解析begin表達式操作序列 (goto (label ev-squence))ev-squence ;獲取begin表達式操作序列第一個表達式 (assign exp (op first-exp) (reg unev)) ;檢查是否最後一條表達式,表達式序列循環跳出判斷 (test (op last-exp?) (reg unev)) (branch (label ev-sequence-last-exp)) ;保存解析上下文 (save unev) (save env) ;操作序列表達式解析完後的返回地址 (assign continue (label ev-sequence-continue)) ;開始解析當前操作序列表達式 (goto (label eval-dispatch))ev-sequence-continue ;恢復解析上下文 (restore env) (restore unev) ;獲取操作序列的其餘表達式 (assign unev (op rest-exps) (reg unev)) ;再次進入序列解析 (goto (label ev-sequence))ev-sequence-last-exp ;恢復解析返回棧, ;最後一條表達式解析完後直接返回調用棧 (restore continue) ;解析最後一條表達式 (goto (label eval-disptach))</sequence-controller>
3-5 應用表達式(app-controller)
app表達式控制代碼
主要是app表達式解析入口,app運算符解析,app運算對象解析循環,
<app-controller> ev-application ;保存解析上下文 (save continue) (save env) (assign unev (op operands) (reg exp)) (save unev) ;運算符operator解析環境初始化 (assign exp (op operator) (reg exp)) ;運算符operator解析後的返回地址 (assign continue (label ev-appl-did-operator)) ;開始解析運算符operator (goto (label eval-dispatch))ev-appl-did-operator ;恢復解析上下文,準備解析運算對象operands (restore unev) (restore env) ;初始化運算對象operand解析結果argl為empty-arglist (assign argl (op empty-arglist)) ;運算符operator解析結果保存到proc (assign proc (reg val)) ;檢查形參是否為空參 (test (op no-operands?) (reg unev)) ;空參直接跳轉過程應用 (branch (label apply-disptach)) ;非空參 保存運算符解析結果proc (save proc) ev-appl-operand-loop ;保存operands解析結果 (save argl) ;初始化operands解析環境 (assign exp (op first-operand) (reg unev)) ;檢查是否最後一個operands (test (op last-operand?) (reg unev))</app-controller>
4 核心
4-1 解析入口(eval-controller)
eval解析入口控制代碼
主要是各種表達式解析入口用來解析exp寄存器保存的表達式
解析結果保存到val然後返回解析後地址continue
<eval-controller>eval-dispatch ;解析self-evaluating表達式 (test (op self-evaluating?) (reg exp)) (branch (label ev-self-eval)) ;解析lambda表達式 (test (op lambda?) (reg exp)) (branch (label ev-lambda)) ;解析quoted表達式 (test (op quoted?) (reg exp)) (branch (label ev-quoted)) ;解析define表達式 (test (op definition?) (reg exp)) (branch (label ev-definition)) ;解析set表達式 (test (op assignment?) (reg exp)) (branch (label ev-assignment)) ;解析variabel表達式 (test (op variable?) (reg exp)) (branch (label ev-variable)) ;解析if表達式 (test (op if?) (reg exp)) (branch (label ev-if)) ;解析begin表達式 (test (op begin?) (reg exp)) (branch (label ev-bengin)) ;解析app表達式 (test (op application?) (reg exp)) (branch (label ev-application)) ;其他表達式報錯 (goto (label unknown-expression-type))</eval-controller>
4-2 過程應用(apply-controller)
apply過程應用控制代碼
主要是原子過程與自定義過程的求值在app表達式解析完成後調用
app表達式的解析結果為運算符proc和運算對象argl然後調用apply-dispatch進行過程求值
<apply-controller>apply-dispatch ;檢查是否為原子過程,在app表達式解析完成後調用 (test (op primitive-procedure?) (reg proc)) (branch (label primitive-apply)) ;檢查是否為自定義過程,在app表達式解析完成後調用 (test (op compound-procedure?) (reg proc)) (branch (label compound-apply)) ;其他過程保存 (goto (label unknown-procedure-type))primitive-apply ;調用原子過程結果保存到val (assign val (op apply-primitive-procedure) (reg proc) (reg argl) ) ;恢復調用原子過程返回棧continue (restore continue) ;返回調用棧continue (goto (reg continue))compund-apply ;調用複合過程求值過程體表達式序列 ;unev中保存argl對應的vars部分 (assign unev (op procedure-paramters) (reg proc)) ;env參數獲取 (assign env (op procedure-environment) (reg proc)) ;擴展env (assign env (op extend-environment) (reg unev) (reg argl) (reg env) ) ;unev中保存過程體procedure-body表達式序列 (assign unev (op procedure-body) (reg proc)) ;執行表達式序列 (goto (label ev-sequence))</apply-controller>
推薦閱讀: