本書內容是
編寫編譯器和解譯器。強調“
編寫”是因為真的是寫了很龐大數量的代碼。如果你想學習怎麼去寫編譯器、解譯器,互動式源碼級調試器,帶圖形介面(GUI)的整合式開發環境(IDE),那麼本書很適合你。所有代碼使用Java編寫,我會解釋裡面的細節。本書不是講寫編譯器隱含的理論,那是教科書乾的事。如果你想學理論,它不適合你。不過我希望你順著本書完成代碼後,能有股衝動去學習相應的基礎理論。
本書的第一版使用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測試程式。