好書妙評之《編譯器設計》

傅志紅發表於2012-11-01

亞馬遜書評:

1、非常好的編譯器圖書,5星

有用:6/6

作者:Dr. Bruce Watson(帕羅奧多,美國)

我是一名教授,曾經寫過編譯器,也買過很多相關圖書,比如Aho、Ullman、Goos、Waite、Wirth等作者的書,是編譯器圖書的超級粉絲。很欣慰,在過去幾年裡出版了一些涵蓋現代編譯器工程的好書,這本書(第1版和第2版)就是這類圖書中最佳的一本。其他的圖書還有:

  • Aho/Sethi/Ullman/Lam的Compilers: Principles, Techniques, and Tools:好書,龍書的新版,不過太厚,難於用在教學上。說實話,有點越來越複雜。
  • Allen/Kennedy的Optimizing Compilers for Modern Architectures: A Dependence-based Approach:另一本好書,涉及了一些優化的最佳結果。有點像最新版的龍書,不過我的學生努力學後,還是沒法領悟。
  • Muchnick的Advanced Compiler Design & Implementation:也是一本好書,只是沒有更新。

相比之下,這本書表述清晰,又不過於簡潔,不僅容易消化,而且涵蓋了有趣的新演算法和資料結構,既能應用於當今類似(與資料結構相關的,比如SSA)優化和程式碼生成的熱點話題,也能應用於前端。比如,詞法分析一章講述了Brzozowski的極小化演算法。總而言之,這是現代編譯器工程的一本極好的圖書。

2、最好的編譯器優化的理論圖書,4星

有用:3/4

作者:Andrew Pape(墨爾本,澳大利亞)

這是一本純理論圖書,不過,我從書名上看不出來。

如果你還沒有寫過自己的編譯器,那麼建議去看看其他書。比如Brinch Hansen on Pascal Compilers,它包含的理論較少,有很多程式碼,這些程式碼很容易明白,理解後你可以修改自制的編譯器。

我寫過編譯器(大部分基於Hansen的方式),使用“自下而上”的方法,這很便於編碼。那本書雖然是編譯器很好的入門書,但沒有討論“自底向上”解析或程式碼優化。

這本書的前半部分幫我很好地複習了編譯技術。我可以很輕鬆地閱讀,瞭解之前從Hansen那本書知道的內容。剩下的部分就不同了,因為它很好地解釋了“自底向上”解析。我在讀龍書或其他書時,都沒有發現它們講述這種解析方式。我對前半部分的印象很深。

第二部分關於優化。這個主題,Hansen的書要麼是簡單地提及(但沒有給出具體的實現),要麼就是沒說。Hansen的方式是使用基於棧的機器,對於優化程式碼只能是簡單為之,並不好。在這本新書裡,作者沒有使用基於棧的方法,而是暫存器方法,這樣可以應對很多型別的優化。這是很費勁的工作。書中有一些圖,但對我來說還是覺得有些少。虛擬碼用來解釋每種優化技術,但是工作中總是有特例。我喜歡不斷地總結,但當我面對章末的問題時,我很快意識到我還不能完全理解書中的內容,我也意識到我無法使用當前的虛擬碼實現程式碼優化。

從書中,我學到了無數種優化程式碼的技術,這裡展示了編譯器的研究領域。我有不少疑惑,但還是能很好地理解優化理論。很多技術用了縮寫詞,可是我總是記不清它們代表什麼,這阻礙了我學習。

對於一學期課程,Hansen的書最好,因為它實踐性強。這本書對於你鞏固相關的知識,為將來進行研究是有好處的。還有其他關於優化的書,但這本已經包含了足夠的主題和理論。

這是本好書,我少給了一個星,就是覺得它有點太理論了。

3、編譯器的最佳圖書 (針對第1版),5星

有用:105/105

作者:Jos van Roosmalen,阿姆斯特丹自由大學

這真是一本編譯器的超級好書,也是你能買到的最新的編譯器書。

首先,這是一本偏理論的書。如果你想買的書是“編碼/構建編譯器”,你肯定會失望。所以,如果你要找一本學習編碼的書,這本書就不適合你。與其他偏理論的圖書相比,這本書的文字並不枯燥,它有很好的結構佈局,給出了豐富的例項,所有主題都銜接、聯絡得很好。這本書讓母語不是英語的讀者也能讀來暢快,更何況是從小就說英語的人呢。

讀這本書就像讀一本小說……它包含了很多的圖表,但並沒有擠得滿滿的,一切都解釋得很清晰。

你可以把這本書當做編譯器的入門書,我強烈建議把這本書推薦給大學本科以上的學生閱讀。你不需要獲得數學的碩士學位,一樣能看明白這本書,所有的數學內容都講得很清楚。你若是有演算法、虛擬碼等方面的知識,那理解起來就更輕鬆了。對於沒有接受過正規電腦科學教育的讀者,我建議你先讀本比較實用的圖書,因為你會發現這本書有點太理論了。

這本書主要講述的是程式碼優化。按作者(還有我)的想法,編譯器前端(掃描/解析等)如今已經變成了商品元件,而後端(程式碼生成)是差別所在。所以,如果你要找一本編譯器優化的書,這本正合適。

如果你找的是更實用的書,我建議你去讀Watt & Brown寫的Programming Language Processors in Java,那本書講述瞭如何用Java語言構建棧式虛擬機器,其高階特性包括記錄、過程/函式、陣列等。要是能結合這本Engineering a Compiler,你會在實踐上得到一些領悟。如果你要找本語言設計圖書,我建議你讀Programming Language Pragmatics。這兩本書都值得你買。

相關文章