前陣子在程式人雜誌參與了關於編譯器書籍的討論,我想說自己都打了一堆字,不如整理一下放上來。

講到編譯器書籍,很多人都會想起 Aho、Sethi、Ullman 和 Lam 的勇者鬥惡龍,這本書深度和廣度兼俱,所以被許多課程採用為教科書。但本書二版在 amazon 評價偏低,可見不符合許多人的期待。我認為每個人取向不同,不必妄想一本傳說中的經典就可以涵蓋理論與實務全面知識,而且對於學習者來說容不容易吸收也很重要。

我手邊有勇者鬥惡龍一和二版,我想一版就不必多說,這裡提供對二版的一些看法:

  • 二版自出版以來,就因為錯誤甚多而受到批評,有些錯誤確實會影響理解,最好配 errata 讀。我手邊的國際英文版(封面沒有龍...囧)似乎已經 patch 完第一張 errata,但仍然有第二張 errata 的錯誤。如果買原文最好能取得最近幾刷,我不知道中譯者有沒有主動修正這些問題。
  • 以一本現代編譯技術的教科書來說,介紹 SSA 的篇幅實在少得可憐 -- 只有一頁 -- 根本是放心酸的。
  • 10、11 章講解指令層級平行化和迴圈平行化算是本書的一個亮點,但是我想普通讀者用不上。

所以對於沒有基礎的自學者,我建議可以考慮勇者鬥惡龍以外的選擇,以下僅推薦幾本我覺得不錯的書。當然,我讀的書少,因此很歡迎網友補充被我錯過的好書。

編譯理論入門書(我知道下面這兩本書的時候,已經不再需要看這類書,所以只能算是大略翻過而已):

《Engineering a Compiler》2版,作者:Cooper and Torczon。

本書講解清楚,取材平衡。雖然只介紹了基本最佳化,對於單純想知道編譯器如何運作的讀者應已足夠,而且本書還有專門介紹基於 SSA 的最佳化,這是勇者鬥惡龍所欠缺的。特色之一是白邊非常大(不知道算好還算壞...),很多圖都沒有標號,內文會告訴你圖請看「margin」,然後讀者必須花點時間確認旁邊的圖確實是文中所指。如果適應這點的話,本書應該很不難吸收。

這本書採用「語法及語意分析=>中間碼生成=>靜態分析及最佳化=>目的碼生成」順序,而非許多書籍使用的「語法及語意分析=>中間碼生成=>目的碼生成=>靜態分析及最佳化」順序,我個人偏好後者。

《Crafting a Compiler》,作者:Fischer、Cytron、LeBlanc,2009年
感覺跟上一本屬性相同,都是偏向入門的理論書。編排順序較為合理,似乎也更淺顯。

實戰派:

《Language Implementation Patterns: Create Your Own Domain-Specific and General Programming Languages》by Terence Parr
本書重點在於如何實作語言機能、維護內部資料結構,適合不打算深入理論的實戰派。如果你正打算寫直譯器,希望獲得立即可用的招式,這本書大概是首選。本書使用 Java,有部份內容需要配合 ANTLR,不過也可以跳過。

對於更進階的讀者可以考慮:

《Compiler Design Handbook: optimizations and machine code generation》
本書其實是過去數年的論文綜整,由許多互相相獨立的單元所構成,對於想了解近期技術進展的讀者,本書可以省下不少閱讀論文的時間。這本書比較冷門,在一些大學圖書館借得到。

novus 發表在 痞客邦 PIXNET 留言(0) 人氣()