學編譯原理有什麼好書?
認真問的,別的領域都有過得去的書,編譯原理這塊似乎完全沒有能用的書。
我覺得之所以很多人不懂這塊完全是因為這塊的書太渣了。我對一本完整的書不抱希望,如果能有 理論、字元串解析、代碼生成等單獨技術的書的組合就很不錯了。————————————————那個。。。補充一下:
- 我是幫新手問問,再好的書跟我也沒什麼關係了,就算看到我也只會感到遺憾而已……
- 龍書這種渣書就算了,我懶得噴。
- LLVM這種,是軍刀,是工具,是STL,不適合拿來初學知識
我當年入門編譯原理的時候,是看了一本《遊戲腳本高級編程》的書。這本書雖然寫得拖泥帶水,內容也特別淺,但正是這本書讓我知道了如何從頭到尾實際地寫一個parser + 虛擬機,讓我入了門。後來我在 @vczh 的指點下看了Parsing Techniques,自己寫了一個正則表達式匹配和LR(K) Parser (類似於yacc)。但重要的是這本書讓我理解了如何手寫Parser(這是從不會到會的飛躍)。
後來我自己寫了一個功能更加全面的類似於javascript的函數式動態腳本語言順帶支持了面向對象,進一步加深了理解。
再後來,我看了《Engineering a Compiler》,通過這本書全面的學習了後端優化知識。
再再後來,我閱讀了LLVM的代碼,陸陸續續寫了四五個compiler,目前自認為算是基本了解了這個領域。
總的感覺是,雖然看書重要,但是如果不親自實現一遍很難真的學會。
我覺得龍書會被首推為學編譯原理的書是因為它出版的早(1986年第一版,應該是編譯原理書的鼻祖),幾乎所有編譯原理相關資料的參考資料都會引用它。個人覺得龍書對於初學者來說寫的很不好懂,大家看這本書基本都是看得雲里霧裡。在看過一些資料之後硬著頭皮寫編譯器(解釋器)之後再看書會好很多。我目前看過的幾本編譯原理書裡面,《Engineering a Compiler》是寫的最好的,基本概念都講解的很清晰,不會像看龍書那樣似懂非懂。總的來說,編譯原理沒有一本書是TheOne,多看幾本書相互參考比較好。虎書以例子貫穿,鯨書主講後端,《Parsing Techniques》講前端,都是很好的參考。
Engineering a Compiler, Second Edition (豆瓣)
mit的某大神,julia lang的核心開發者之一jeff告訴我,他沒有專門學過什麼書或者dragon book有些old fashion,他入門看的是一個叫做 90min scheme2c的教程。
我後來搜了這個視頻一直沒來得及看前端看Parsing Techniques,後端看鯨書,都是最好的。
傳說中的三本書,最近正打算看:龍書 虎書 鯨書
A retargetable C compiler: Design and Implementation, 可實踐性很強。
essential of programming language
有人回答了《編譯器設計 第二版》,我覺得有些地方作者的ppt比書上講的更清楚些。https://www.clear.rice.edu/comp412/希望能幫到別人
其實感覺任何一本都不怎麼夠,但兩三本左右還不錯的書
( 比如《龍書》+《編譯器設計第二版》
(就是 目前排名第一的 藍色大大 推薦的那本的中文版,翻譯還湊合吧) 一起看就不錯 (其實這兩本書都挺好的,龍書理論方面比較詳細,但個人感覺有些地方組織的不夠條理,而編 譯器設計那本書的層次結構比較條理)(這堆括弧嵌套的。。。SICP「遺毒」) )互相對照著看就好很多,其實還是要砸時間,看著麻煩的多磨磨就過去了。第一哈,龍書並不渣,就是新手不太友好(不然你去看看鯨書,一個數據流分析就夠酸爽的了)。
第二呢,龍書偏於理論,實踐方面比不上其他書(我本科編譯考了98,實驗課滿分,刷龍書還是沒有一個清晰的概念,可能是我腦子不夠用),龍書理論方面還是很紮實的。
如果對編程語言設計方面感興趣,想對編程語言和編譯器設計有大概的概念,可以看看PLP。
想快速實踐可以看《自製腳本語言》,《engineer a compiler》和《編程語言實現模式》。還是那句話,多做少說,實現一遍,比啥都好使。隨便一本講編譯原理的教材都可以。先入門,然後再討論別的。入門以後,你才會知道你還缺哪方面內容,這時候再去有目的的去找其他書。你現在看到的別人的回答通常都是基於回答者本人的經驗,是否適合你你根本無法判斷。
不請自來。龍書對前端詞法、語法分析講的過多,理論很深。實際中一般不會用到—除了考試,一般到會用工具如flexyacc 和antlr即可。龍書後面的數據流分析很好,實際中會用。因此,建議直接上工具書學習編譯器前端,建議使用antlr,書籍推薦Language Implementation Patterns: Create Your Own Domain-Specific and General Programming Languages這本書中也講了編譯器前端的知識,結合工具中的例子學習更快。
之後數據流分析可以看看龍書, 虎書。
龍書
我就是直接看龍書,每天還要上班,就上下班路上看,周末看,現在看了一年,已經快看完第11章了,全部看懂理解,而且總結了書中一些小錯誤,中文整體翻譯還是很好的,有些地方還有譯者仔細思考後的小注釋,但是建議在看不懂時和英文原版對照一下。看書最重要的是理解演算法的本質,我有時一個演算法會想幾天才真正理解。另外第11章要求線性代數的知識,否則看不懂。
虎書、鯨書、龍書為啥我看編譯原理,直接把軟體工程給顛覆了。
推薦兩個:scheme from scratch:peter.michaux.casicp編譯器最好的學習方式,莫過於自己實現一個小型的編譯器
CSDN上的有個專欄博客:
C編譯器剖析_前言 - SheIsC的專欄 - CSDN博客,書名叫《C 編譯器剖析》。
該書以剖析C語言編譯器源代碼的方式,講解編譯原理。
書的第1章剖析了一個迷你類C語言編譯器(約800行),第2-6章剖析一個完整的C語言編譯器UCC(約20,000行)。
蕭大神這麼厲害,可以直接上這個http://llvm.org/docs/tutorial/index.html做的過程中涉及到的概念,都有wiki鏈接的。配合龍書+wiki,大神入門應該會很快的。
好像沒有人提到 Modern Compiler Design第二版(Springer 2012)。絕對好書。
推薦閱讀:
※如何理解C++中「引用作為函數的返回值」概念?
※計算機系的高數,離散,線代都是用在哪些方面的?
※「計算」會改變信息量么?
※中文字元Unicode和UTF-8的編碼為什麼不能一樣?
※在可遇見的未來中,有什麼高科技產品將會被淘汰?