本書的第一版使用C作為實現語言,第二版用C++,第三版采用Java. 盡管我會保留早期版本的結構,理念和方法,但這是一次真正徹底的重寫。
你會學到什么東西?
通過本書你將學到如何采用高級語言編寫用於處理程序的編譯器和解釋器。(1) 你將會寫能夠執行程序的解釋器。(2) 在引入調試器后,你能夠在程序執行時,通過設置斷點與解釋器交互,顯示調用棧,查看和修改變量值,還有逐行的單步調試。(3)在引入IDE后你能在觀察屏幕程序過程中用鼠標做所有事情。(4)你還會學習到寫為JVM生成目標代碼的編譯器(也就是生成JVM 匯編代碼),這樣能夠在多個平台上運行編譯后的程序。當然,因為編譯器,解釋器,IDE都是用Java寫的,也能在多平台上運行他們。
你寫的編譯器解釋器將處理的源程序語言是Pascal。我基於幾個理由選擇Pascal。首先它是個真的編程語言,不是為本書需要杜撰的。Pascal是在70年代中期和80年代非常流程的面向過程的高級語言。這個語言有一個相對來說比較直白的語法但包含很多使編寫充滿樂趣的語言特性,比如結構化的用戶自定義類型,嵌套作用域,值傳參/引用傳參,完整的控制語句集等等。Pascal今天仍活着,你可在網上下載免費的Pascal編譯器和解釋器,與你自己寫的比比
軟件工程方法
編譯器和解釋器很復雜,搞成功不容易。為處理這種復雜度,我采用軟件工程方法諸如設計模式,統一建模語言(UML)圖和其它現代面向對象的設計實踐讓代碼更好理解好管理。
貫穿全書,特別是早期的篇章,設計筆記 指出相關設計要點比如用到的設計模式,我為何選用這種方式架構代碼等。
我堅信的方法是 增量開發,每一步完成少量代碼,基於上一步構建下一步可運行的代碼。基本上每章包含一個主工作程序和其它簡練的增量代碼。每章的程序構建以上一章的代碼為基礎。(提醒你不要跳躍式看書)
書的組織方式
第一章是簡介。第二章講述了編譯器和解釋器的框架,怎樣設計和測試框架為讓后續的成功編寫打下個好基礎。緊接着兩章關注基本(語言)轉換工作:詞法掃描(第三章),符號表(第四章)。接下的幾章會構建一個可運行的解釋器。基於增量開發方法,這些章會迭代語法分析和解釋好幾次,每次增加點新的語言特征。第五章分析表達式和賦值語句,第六章解釋她們;第七章分析控制語句,第八章解釋;第九章分析聲明(Declaration),第十章做語法檢查,第十一章分析過程(Procedure),函數(Function)和程序(Program)。第十二章完善解釋器使其能夠運行整個Pascal程序。
接下來的兩章基於前面的工作。第十三章增加了一個能夠通過命令行輸入命令與之交互的源碼級調試器。第十四章將命令行調試器以GUI封裝成為一個IDE,你初次通讀時可以跳過這兩章而不失連續性,但以后一定要看,因為它講了不少真的很NB的開發工具。
本書的最后部分講述基於前面章節開發編譯器。第十五章介紹了Java虛擬機(JVM)的結構和Jasmin即編譯器生成的JVM匯編語言。同樣還是增量方法,第十六章編譯程序,賦值語句和表達式。十七章編譯過程和函數調用以及字符串操作。十八章通過編譯控制語句,數組和Record(后續將會以紀錄稱呼)來完善整個編譯器。
末尾的19章簡要介紹前面章節沒有涉及到的編譯器編寫相關話題,比如代碼優化和表驅動詞法掃描和語法分析器。
哪兒能得到源程序
你能在網頁 http://www.apropos-logic.com/wci/ (不過建議你看每章中經過漢化改寫的中文版代碼,注釋更全面)下載本書用到的所有源程序。你會找到怎么下載,編譯,安裝,運行程序的介紹。上面還有很多Pascal測試程序。