中圖分類號(hào):G434文獻(xiàn)標(biāo)識(shí)碼:A論文編號(hào):1674—2117(2025)12-0090—07
前言
“編譯原理”課程是計(jì)算機(jī)專業(yè)的核心課程之一,主要介紹編譯程序構(gòu)造的一般原理和基本方法,內(nèi)容涵蓋了語言和文法、詞法分析、語法分析、語法制導(dǎo)翻譯、中間代碼生成、存儲(chǔ)管理、代碼優(yōu)化和目標(biāo)代碼生成等。通過該課程的學(xué)習(xí),使學(xué)生在了解編程語言的設(shè)計(jì)理念和實(shí)現(xiàn)機(jī)制的同時(shí),能更好地理解計(jì)算機(jī)如何處理和執(zhí)行代碼。同時(shí),通過理解編譯過程,學(xué)生能夠更好地編寫高效、可維護(hù)的代碼,避免常見的編程錯(cuò)誤,提高代碼的可讀性和可重用性。這對(duì)于學(xué)生未來從事編程開發(fā)、語言/編譯器設(shè)計(jì)或相關(guān)領(lǐng)域的工作具有重要意義。上述目標(biāo)的實(shí)現(xiàn)除了要學(xué)習(xí)編譯理論外,還需要大量的實(shí)踐。然而在教學(xué)實(shí)施過程中,由于理論教學(xué)內(nèi)容多、課時(shí)少且?guī)熧Y缺乏,實(shí)驗(yàn)教學(xué)課時(shí)往往不足,實(shí)驗(yàn)內(nèi)容的深度和廣度也不夠,使得學(xué)生雖然學(xué)習(xí)了編譯原理課程,卻難以自己動(dòng)手去實(shí)現(xiàn)一個(gè)編譯器或解釋器。筆者研究發(fā)現(xiàn),現(xiàn)有的編譯原理教學(xué)體系,特別是實(shí)驗(yàn)教學(xué),存在以下幾個(gè)問題,無法滿足新質(zhì)生產(chǎn)力對(duì)人才培養(yǎng)的需求。
一是,實(shí)驗(yàn)內(nèi)容的碎片化。大多數(shù)編譯原理實(shí)驗(yàn)內(nèi)容是理論課程配套的小實(shí)驗(yàn),如DFA、NFA自動(dòng)機(jī)、LL/LR分析器、語法制導(dǎo)翻譯等,這些實(shí)驗(yàn)雖然與理論授課進(jìn)度同步,有助于學(xué)生理解課堂學(xué)習(xí)的知識(shí),但人為分裂了編譯程序的完整性,導(dǎo)致學(xué)生不能學(xué)習(xí)到一個(gè)完整的編譯器的開發(fā)運(yùn)行過程。
二是,教學(xué)偏重理論。教學(xué)內(nèi)容過多放在詞法分析、語法分析及代碼優(yōu)化上,對(duì)實(shí)際編程語言及目標(biāo)機(jī)器翻譯較少。學(xué)習(xí)難度大,導(dǎo)致學(xué)生興趣不高。編譯原理課程內(nèi)容仍然是基于過程式語言展開的,沒有及時(shí)跟進(jìn)程序設(shè)計(jì)從傳統(tǒng)的過程式轉(zhuǎn)向函數(shù)式、對(duì)象式、組件型的變化,導(dǎo)致學(xué)生感到學(xué)習(xí)這門課程沒有實(shí)際意義且太難。
三是,實(shí)驗(yàn)設(shè)計(jì)不合理。實(shí)驗(yàn)設(shè)計(jì)往往要求學(xué)生完成小型模型語言的完整編譯程序,但這樣的任務(wù)對(duì)于部分學(xué)生來說難以完成,不能激發(fā)他們的興趣。同時(shí),實(shí)驗(yàn)周期短、模塊間銜接復(fù)雜,不易立即看到整體效果,缺乏可用的實(shí)驗(yàn)教學(xué)資料。
四是,缺乏實(shí)驗(yàn)教材和工具。教材偏重理論,缺乏對(duì)具體實(shí)現(xiàn)的介紹,對(duì)一些新的編譯技術(shù)如組合子解析器、Pratt解析器沒有涉及,實(shí)驗(yàn)工具使用LEX/YACC等,基本沒有引入如ANTLR、LLVM、CLANG、WASM等新型的前后端編譯工具,內(nèi)容陳舊。學(xué)生對(duì)開發(fā)工具和環(huán)境不熟悉,語言描述不夠詳細(xì),導(dǎo)致實(shí)驗(yàn)項(xiàng)目難以順利進(jìn)行。
針對(duì)上述問題,筆者重新設(shè)計(jì)了編譯原理課程的實(shí)驗(yàn)內(nèi)容,目的是使學(xué)生能夠掌握一個(gè)完整的函數(shù)式編程語言的編譯器/解釋器的實(shí)現(xiàn)。
實(shí)驗(yàn)教學(xué)內(nèi)容設(shè)計(jì)
1.設(shè)計(jì)目標(biāo)
設(shè)計(jì)一個(gè)完整的實(shí)驗(yàn)教學(xué)方案,學(xué)生可以在32個(gè)實(shí)驗(yàn)課時(shí)內(nèi),系統(tǒng)地學(xué)習(xí)編譯器的構(gòu)建過程,并完成一個(gè)完整的編譯器實(shí)現(xiàn)。通過這一過程,培養(yǎng)學(xué)生的理論知識(shí)和實(shí)踐技能,提高他們的問題解決能力和創(chuàng)新思維。
2.設(shè)計(jì)思路
① 使用一個(gè)簡(jiǎn)單但足夠復(fù)雜的函數(shù)式編程語言。
② 簡(jiǎn)化詞法分析和語法分析,聚焦語義分析和代碼生成。
③ 采用多趟(PASS)、多段(STAGE)設(shè)計(jì),編譯器各段之間相互獨(dú)立。
④ 覆蓋解釋器、虛擬機(jī)、編譯器。
⑤ 采用Python編程實(shí)現(xiàn)。
3.主要內(nèi)容
① 先將編譯器的實(shí)現(xiàn)過程分解為若干個(gè)模塊,如詞法分析、語法分析、語義分析、中間代碼生成、代碼優(yōu)化和目標(biāo)代碼生成等,再通過具體的編程語言案例,引導(dǎo)學(xué)生逐步構(gòu)建編譯器,并圍繞一個(gè)簡(jiǎn)單的語言,完成相應(yīng)各環(huán)節(jié)的設(shè)計(jì)和實(shí)現(xiàn)。
② 鼓勵(lì)學(xué)生以小組形式合作,共同討論和解決問題,同時(shí)要求每個(gè)學(xué)生獨(dú)立完成部分模塊的實(shí)現(xiàn),以確保每個(gè)人都能掌握關(guān)鍵技能。在每個(gè)階段結(jié)束時(shí),進(jìn)行代碼審查和測(cè)試,確保學(xué)生的工作進(jìn)度和質(zhì)量,并提供及時(shí)的反饋和指導(dǎo)。在課程結(jié)束時(shí),要求學(xué)生展示他們的編譯器實(shí)現(xiàn),并進(jìn)行性能測(cè)試和比較。設(shè)計(jì)合理的評(píng)估體系,其中包括實(shí)驗(yàn)報(bào)告、代碼質(zhì)量、項(xiàng)目展示和個(gè)人貢獻(xiàn)等多個(gè)維度。
③ 設(shè)計(jì)相應(yīng)的實(shí)驗(yàn)指導(dǎo)書,內(nèi)容包括理論基礎(chǔ)、實(shí)驗(yàn)步驟、代碼示例和常見問題解答。
實(shí)驗(yàn)包含三個(gè)模塊,包括一個(gè)解釋器、兩個(gè)編譯器,其中一個(gè)編譯器的目標(biāo)機(jī)器為堆棧式虛擬機(jī),另一個(gè)編譯器的目標(biāo)機(jī)器為RV32I指令集的RISC-V處理器(如圖1)。
模塊一實(shí)現(xiàn)一個(gè)解釋器,通過該模塊使學(xué)生掌握詞法分析、語法分析、語義分析(可選,用于介紹類型自動(dòng)推導(dǎo))的基本技術(shù),以及編程語言的解釋實(shí)現(xiàn)。
在模塊一基礎(chǔ)上,模塊二實(shí)現(xiàn)一個(gè)目標(biāo)為堆棧式虛擬機(jī)的編譯器。在模塊二中,直接使用模塊一里面的詞法分析器、語法分析器、語義分析等。使用堆棧式虛擬機(jī)作為目標(biāo)機(jī)器的好處在于,機(jī)器指令數(shù)少,不用考慮寄存器分配,同時(shí)利用宿主語言的特性可以簡(jiǎn)化內(nèi)存的使用和管理。此外,學(xué)生可以通過虛擬機(jī)的實(shí)現(xiàn)了解底層機(jī)器工作機(jī)制,為模塊三的以RISC-V為目標(biāo)的編譯器提供基礎(chǔ)。
模塊三設(shè)計(jì)實(shí)現(xiàn)一個(gè)面向RISC-V機(jī)器(RV32I指令集)的編譯器。RISC-V的設(shè)計(jì)簡(jiǎn)單而精簡(jiǎn),RV32I指令集只有47條指令,尋址模式簡(jiǎn)單,指令功能正交化,大的寄存器文件,使得編譯器開發(fā)相對(duì)容易。此外,使用RISC-V模擬器RARS,RARS自帶了一個(gè)圖形化的集成開發(fā)和仿真環(huán)境,包括編輯器、匯編器和模擬器,編譯器生成的RISC-V匯編代碼可以直接在RARS中編譯、調(diào)試、執(zhí)行,不需要專門的RISC-V開發(fā)板或像QEMU的仿真環(huán)境。
Cilly語言描述
考慮到現(xiàn)有的高級(jí)語言太復(fù)雜,不適合一學(xué)期的實(shí)驗(yàn)教學(xué),筆者設(shè)計(jì)了一個(gè)動(dòng)態(tài)類型、支持閉包的函數(shù)式編程語言Cilly。
使用動(dòng)態(tài)類型可以大大簡(jiǎn)化語法,同時(shí)只支持?jǐn)?shù)值(整數(shù)和浮點(diǎn)數(shù))、字符串、布爾值、數(shù)組、結(jié)構(gòu)體(類似于JSON對(duì)象)等基本和復(fù)合數(shù)據(jù)類型,實(shí)現(xiàn)if/for/while等基本控制流語法。這使得詞法、語法分析及語義分析代碼行數(shù)只需要700\~800行Python語句就可以實(shí)現(xiàn)。
筆者還在語言中引入嵌套函數(shù)、閉包。目前,大多數(shù)編譯原理教材沒有介紹閉包,主流的編程語言如C、Java等也很少支持嵌套函數(shù)。但筆者認(rèn)為利用嵌套函數(shù)和閉包可以實(shí)現(xiàn)很多語法特性(如對(duì)象、流等),雖然增加了實(shí)現(xiàn)的復(fù)雜性,但有助于學(xué)生更好地理解編程語言。
主要實(shí)驗(yàn)內(nèi)容
1.基于遞歸下降分析的詞法分析器
Cilly語言的詞法屬于正則文法。正則文法可以使用確定性有限自動(dòng)機(jī)(DFA)來實(shí)現(xiàn),lex/bison等工具可以根據(jù)詞法自動(dòng)生成詞法分析器,供后續(xù)的語法分析器如yacc調(diào)用。手工去實(shí)現(xiàn)這樣的分析器比較復(fù)雜。在組合子解析器實(shí)現(xiàn)中,通常在語法分析過程中直接使用正則表達(dá)式來進(jìn)行token的識(shí)別,不需要單獨(dú)的詞法分析器。
遞歸下降分析傳統(tǒng)上用來處理上下文無關(guān)文法,而正則文法也屬于上下文無關(guān)文法,因此完全可以用來實(shí)現(xiàn)詞法分析。而有些語言如Python,其詞法屬于上下文無關(guān)文法,不能用lex來解析。遞歸下降分析很適合于手工編寫,因此本實(shí)驗(yàn)采用遞歸下降分析來實(shí)現(xiàn)Cilly的詞法分析。
token的表示——筆者定義了三個(gè)函數(shù)mk_tk、tk_tag、tk_val來封裝token,具體實(shí)現(xiàn)使用Python的數(shù)組list來表示,這里忽略了token所在的行號(hào)等位置信息(如圖2)。
詞法分析器Cilly_Lexer輸入為字符串,輸出為token的list,其實(shí)現(xiàn)如圖3所示。
Cilly_lexer中反復(fù)調(diào)用函數(shù)token,直到讀到文件結(jié)束符,該函數(shù)每次返回當(dāng)前位置下的詞法單元。函數(shù)token實(shí)現(xiàn)如圖4所示。
函數(shù)token首先跳過所有的空白字符和注釋,然后調(diào)用peek查看當(dāng)前字符,再根據(jù)不同類型來分別識(shí)別數(shù)字、標(biāo)識(shí)符、字符串、運(yùn)算符和其他符號(hào)。
2.基于遞歸下降分析和Pratt解析器的語法分析器
Cilly的語法分析器cilly_parser的輸人為cilly_lexer產(chǎn)生的token數(shù)組,輸出為抽象語法樹(也可以根據(jù)實(shí)際后續(xù)任務(wù),輸出其他形式的語法樹,如用于集成開發(fā)環(huán)境中語法高亮、代碼輸人自動(dòng)完def cilly_parser(tokens):def program:stats σ=σ []while peek!='eof':stats.append( statement)return['program',stats]return program成等)。
抽象語法樹ast的節(jié)點(diǎn)采用Python的數(shù)組實(shí)現(xiàn),通過兩個(gè)輔助函數(shù)node_tag和node_val得到節(jié)點(diǎn)的類型和值,如上頁圖5所示。
Cilly_parser的主函數(shù)為program,該函數(shù)反復(fù)調(diào)用statement函數(shù),將識(shí)別到的語句添加到數(shù)組stats中,直到讀到EOF詞法單元,然后構(gòu)建ast的父節(jié)點(diǎn)“program”返回(如圖6)。
函數(shù)statement則是根據(jù)當(dāng)前的詞法單元來分別處理不同的語句,如圖7所示。
表達(dá)式expr的解析使用了Pratt解析器。在傳統(tǒng)的遞歸下降分析中,處理表達(dá)式中的左遞歸、運(yùn)算符的優(yōu)先級(jí)和結(jié)合性,必須進(jìn)行語法改造,消除左遞歸,把表達(dá)式語法變成如圖8所示的分層表示。
這使得程序里多了很多個(gè)結(jié)構(gòu)類似、重復(fù)的非終結(jié)符的實(shí)現(xiàn)。本實(shí)驗(yàn)引入了Pratt解析器,可以非常優(yōu)雅地同時(shí)處理左遞歸、運(yùn)算符優(yōu)先級(jí)和結(jié)合性問題。Pratt解析器也稱為自頂向下的運(yùn)算符優(yōu)先級(jí)解析器,由VaughanPratt在1973年提出,實(shí)際上它是一種更通用的解析技術(shù)。
Pratt算法為每個(gè)一元運(yùn)算符或二元運(yùn)算符(也適用于像C語言這樣的多元運(yùn)算符)定義了左、右的結(jié)合力(BindPower),如假定 ?+, 的左、右結(jié)合力分別為10、20, ‘*’的左、右結(jié)合力分別為30、40,如圖9所示。則在表達(dá)式 1+2+3*4 中,由于2左邊的 ‘*’的右結(jié)合力大于2右邊的'+' 的左結(jié)合力,因此,上式應(yīng)該解析為 (1+2)+3*40 同樣,3的兩邊結(jié)合力分別為20和30,因此3要先和‘*’結(jié)合: (1+2)+(3*4)。
一元前綴運(yùn)算符只有右結(jié)合力,后綴運(yùn)算符可以視為二元運(yùn)算符的特殊情況。上述思想可以用如圖10所示的算法實(shí)現(xiàn),其中parse_uniop和parse_binop分別用于解析一元表達(dá)式和二元表達(dá)式。這樣只要定義了不同運(yùn)算符的結(jié)合力,不同優(yōu)先級(jí)的一元、二元表達(dá)式都可以用上述函數(shù)來解析。
3.Cilly解釋器及REPL執(zhí)行環(huán)境
解釋cilly_eval_使用cilly_parse生成的抽象語法樹作為輸入。解釋器還有一個(gè)輸入變量為求值環(huán)境env,環(huán)境用于查找變量。
筆者使用訪問器模式來實(shí)現(xiàn)解釋器,每個(gè)節(jié)點(diǎn)都有一個(gè)求值函數(shù),存放在visitors的字典中,在主程序中定義visit函數(shù),根據(jù)節(jié)點(diǎn)類型來調(diào)用相應(yīng)的求值函數(shù)(如圖11)。
如節(jié)點(diǎn)program和打印的求值函數(shù)為ev_program.ev_print,其實(shí)現(xiàn)如圖12所示。
解釋器主要難點(diǎn)包括變量(全局變量、嵌套函數(shù)里的變量)的定義、引用和賦值,函數(shù)的定義(閉包)、調(diào)用等,此處不詳細(xì)介紹。
在Cilly_eval函數(shù)基礎(chǔ)上,可以實(shí)現(xiàn)一個(gè)類似于Python的交互式命令行repl(如圖13)。
4.虛擬機(jī)及編譯
模塊二實(shí)現(xiàn)了一個(gè)目標(biāo)機(jī)器為虛擬機(jī)的編譯器。
(1)虛擬機(jī)的實(shí)現(xiàn)
筆者定義了一個(gè)類似于Python虛擬機(jī)的堆棧式虛擬機(jī)cilly_vm。該虛擬機(jī)有一個(gè)常量池、運(yùn)算堆、作用域棧(用于嵌套函數(shù)、閉包)、調(diào)用棧、代碼和程序指針pc,其實(shí)現(xiàn)如圖14所示。
設(shè)計(jì)的虛擬機(jī)的指令包括LOAD_CONST,LOAD_TRUE、LOAD_FALSE、LOAD_NULL、POP、LOAD_GLOBAL、STOREGLOBAL、BINOP_ADD、BINOPSUB、BINOP_MUL、BINOP_DIV、BINOP_GT、BINOP_GE、BINOP_LT、BINOP_LE、BINOP_EQ、BINOP_NE、UNIOP_NOT、UNIOP_NEG,JMP,JMP_TRUE、JMP_FALSE、PRINT_ITEM、PRINT_NEWLINE、LOAD_VAR、STORE_VAR、MAKEPROC、CALL、RETENTER_SCOPE,LEAVE_SCOPE等。
所有的指令使用一個(gè)整數(shù)表示,可以有0、1、2個(gè)參數(shù),如LOAD_CONSTi,表示把常數(shù)池中編號(hào)為i的常數(shù)壓人運(yùn)算棧,而BINOPADD指令沒有參數(shù),其作用是將棧頂兩個(gè)數(shù)彈出,然后把它們的和壓人運(yùn)算棧。
大部分指令的實(shí)現(xiàn)比較簡(jiǎn)單,"此處不詳細(xì)介紹。
(2)編譯器實(shí)現(xiàn)
編譯器cilly_vm_compiler將源程序的抽象語法樹翻譯成目標(biāo)代碼為上述虛擬機(jī)的機(jī)器碼。編譯器的輸出為生成的代碼和常量池:[code,consts]。編譯器采用與解釋器類似的訪問者模式實(shí)現(xiàn)(如圖15)。例如,頂層節(jié)點(diǎn)program及打印語句print的實(shí)現(xiàn)如圖16所示。
這兩個(gè)函數(shù)和解釋器中的對(duì)應(yīng)函數(shù)結(jié)構(gòu)基本類似,主要區(qū)別是這兒調(diào)用emit生成機(jī)器指令,而不是執(zhí)行語句。其余語句的翻譯也類似。
在解釋器中的變量都是通過環(huán)境來實(shí)現(xiàn)存儲(chǔ)、查找,在編譯器中變量的查找和引用分別是在編譯器和虛擬機(jī)中,因此必須將解釋器中環(huán)境的有關(guān)信息分別放在編譯器和虛擬機(jī)中。
注意,遍歷一次ast樹生成目標(biāo)代碼,因此一些轉(zhuǎn)移指令的目標(biāo)地址需要用回填技術(shù)來實(shí)現(xiàn)。
(3)反匯編器
為了檢查生成的機(jī)器碼是否正確,還要實(shí)現(xiàn)一個(gè)反匯編器,將數(shù)字形式的機(jī)器碼轉(zhuǎn)換為容易閱讀的匯編指令格式。反匯編器的結(jié)構(gòu)和虛擬機(jī)的實(shí)現(xiàn)類似,這里不做具體介紹,圖17是反匯編器的輸出示例。
5.Cilly語言的risc-v編譯器實(shí)現(xiàn)
這部分內(nèi)容是模塊三的主要內(nèi)容。此處,筆者采用RARS這樣的RISC-V模擬器,該模擬器只實(shí)現(xiàn)了用戶模式,但對(duì)編譯器應(yīng)用來說足夠了,學(xué)生可以利用RARS來編譯和運(yùn)行所生成的匯編程序。此外,該模擬器自帶的匯編器語法基本與risc-v的gcc匯編器類似,學(xué)生很容易將生成的代碼轉(zhuǎn)換為gcc所支持的匯編代碼。
與虛擬機(jī)編譯器不同的是,cilly_risc_compiler需要處理內(nèi)存管理,包括在內(nèi)存中分配、查找常量、變量,維護(hù)記錄棧以及堆的變化。此處筆者沒有處理內(nèi)存的釋放,也沒有實(shí)現(xiàn)垃圾回收機(jī)制,這么做也是為了簡(jiǎn)化實(shí)現(xiàn)。常量放在data區(qū),為了支持閉包和嵌套函數(shù),將參數(shù)和局部變量放在堆上,而不是堆棧上,堆棧上存放調(diào)用時(shí)的返回地址以及作用域指針。
cilly_riscv_compiler的輸出為RARS格式的匯編代碼,實(shí)現(xiàn)方式和前面的解釋器和堆棧虛擬機(jī)的編譯器結(jié)構(gòu)類似,也采用了訪問者模式(如圖18)。
其中,函數(shù)rars_output是將生成的代碼和數(shù)據(jù)合起來,輸出為RARS的匯編格式。
6.優(yōu)化
筆者提供了一些如常量合并、強(qiáng)度削弱等的優(yōu)化模塊,這些優(yōu)化通常作為一個(gè)獨(dú)立的階段在抽象語法樹上進(jìn)行。這么做的好處是可以將不同的優(yōu)化技術(shù)組合起來,盡管效率不高,但每個(gè)階段處理非常簡(jiǎn)單。
教學(xué)實(shí)踐效果總結(jié)
筆者在承擔(dān)的“編譯原理”課程教學(xué)中對(duì)上述實(shí)驗(yàn)教學(xué)內(nèi)容實(shí)施過一次,共有三個(gè)班(兩個(gè)計(jì)科專業(yè)班、一個(gè)信息安全班,二年級(jí)下),學(xué)生90人左右。由于實(shí)驗(yàn)教學(xué)內(nèi)容調(diào)整較大,內(nèi)容較多,而總課時(shí)不能調(diào)整,因此壓縮或去除了部分理論教學(xué)內(nèi)容(詞法分析中的子集法及自動(dòng)機(jī)理論,語法分析中的LR文法,中間代碼生成、數(shù)據(jù)流分析等),多出來的時(shí)間用于實(shí)驗(yàn)課時(shí)。同時(shí),采用翻轉(zhuǎn)課堂(學(xué)生提前自學(xué)相關(guān)理論部分)、課后自主實(shí)驗(yàn)(不占課內(nèi)時(shí)間)等形式,這樣基本保證了32課時(shí)的實(shí)驗(yàn)課時(shí)。實(shí)驗(yàn)教學(xué)形式采用教師課堂上編寫程序框架,介紹實(shí)驗(yàn)原理,學(xué)生課后填充細(xì)節(jié)。要求所有學(xué)生完成模塊一所有內(nèi)容,并對(duì)完整的解釋器運(yùn)行結(jié)果進(jìn)行展示,模塊二和模塊三選做。期末考核包括兩部分: ① 模塊一的任務(wù) (40%) ‘ ② 大作業(yè) (60%) ,實(shí)現(xiàn)logo語言解釋器或SQL語言解釋器。
通過一個(gè)學(xué)期的教學(xué)實(shí)踐,整體下來,學(xué)生對(duì)“編譯原理”課程的興趣有較大提升,基本掌握了遞歸下降分析、表達(dá)式分析以及解釋器、編譯器等各環(huán)節(jié)原理和實(shí)現(xiàn)方法,能夠完成如json、sql、mermaid等的語法分析,以及l(fā)ogo、lisp這類動(dòng)態(tài)語言的解釋器實(shí)現(xiàn),為進(jìn)一步深入學(xué)習(xí)編譯技術(shù)打下了基礎(chǔ)。
受教學(xué)課時(shí)等因素的限制,本實(shí)驗(yàn)沒有采用像llvm、gcc等之類的前后端,也沒有使用真實(shí)的編程語言,這使得學(xué)生對(duì)生產(chǎn)環(huán)境下的編譯工具和編譯技術(shù)缺乏了解。筆者希望在后面的教學(xué)實(shí)踐中逐漸改進(jìn),使實(shí)驗(yàn)教學(xué)內(nèi)容更貼合實(shí)際應(yīng)用。
參考文獻(xiàn):
[1]RARS—RlSC—VAssemblerandRuntime Simulator[EB/OL].https://github.com/TheThirdOne/rars.
[2]KeithCooperamp;LindaTorczon.編譯器設(shè)計(jì)[M].北京:人民郵電出版社,2012.
[4]海納.自已動(dòng)手寫Python虛擬機(jī)M.北京:北京航空航天大學(xué)出版社,2019.
[5]RobertNystrom,CraftinghterpretersM].GeneverBenning,2021.
[6]索斯藤·鮑爾.用Go語言自制解釋器M.北京:人民郵電出版社,2022.
[7]Harold Abelson,GeraldJay Sussmanamp;JuieSusman.計(jì)算機(jī)程序的構(gòu)造和解釋(第二版)[M].北京:機(jī)械工業(yè)出版社,2004.e