總結篇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>

注:上面的ev-sequence-last-exp實現尾遞歸

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>

推薦閱讀:

TAG:虛擬機 | 解釋器 | Lisp |