如何實現 C 語言編譯器?
想學習編譯原理,想實現一個C語言的編譯器,後端是生成X86的機器代碼,請問大大們,我該怎麼一步一步實現,有什麼書籍推薦嗎?本人學生,時間比較多,數據結構還行.
「既然 C++ 的模板和 constexpr 是圖靈完全的」完全用 constexpr 實現的 C 編譯器 kw-udon/constexpr-8cc,使用了 elvm 作為後端(elvm 還有十幾個後端,比如 brainfxxk……)。
有回答提到C4…這玩兒短是短但是對初學者來說一點也不友好。對它感興趣的話歡迎參考另一個回答:有沒有關於c4-in four function 編譯器的文章? 看不懂 - RednaxelaFX 的回答
rswier/c4 · GitHub
上面是一個簡化的C編譯器,用C實現的,實際代碼500行不到,比較容易上手。感受一下。Hacker News的討論(C4 – C in 4 functions)中提到了一本直接能下載到的參考書:《Compiler Construction》。
另外就是諸位提到的龍書。找一個1萬多行的開源的C編譯器來閱讀,太龐大的GCC和LLVM不適合初學者。並不是要把龍書讀完 了,再去讀C編譯器源代碼。在不少實際的編譯器中,語法分析採用的還是手工打造parser的技術路線,因為可以更準確地報錯,而並不會採用自動化的LR分析。LR分析有其巨大的實用和理論價值,但許許多多的初學者,滿懷著鑽研的精神想搞明白編譯器是怎麼工作的,卻在龍書等編譯原理的LR分析這一關被卡住了。比較符合認知規律的方法是從感性認識到理性認識。
推薦直接去看UCC編譯器的源代碼(小米公司MIUI首席架構師的傑作),代碼結構和函數命名比LCC更清楚。與之配套的一本書為《C編譯器剖析》 http://product.dangdang.com/23973799.html
只有從源代碼中,才能比較徹底地搞懂編譯器是如何工作的。如果沒有源代碼的支撐,編譯原理的書就成了理論課,其實編譯器是計算機工程技術的精華。在不少學校中,這門課在某種意義上成為需要背誦名詞解釋和定義的課程,這不得不說是種遺憾。看龍書和C標準,也可以實現一個子集,或者自己造個和C類似的語言,至於具體實現手段,非常不推薦用C來寫,我寫編譯器都是用python,文本和邏輯處理非常方便
// Update1: 2016-11-19
最近發現 9cc(huangguiyang/9cc), 名字源自8cc,但是作者做了很多優化。預處理器比8cc快不少。語義分析也很全。後端沒有細看,應該是龍書上的三地址碼,寄存器分配應該也是龍書上面的。生成的代碼和gcc -O0 應該是差不多的, 非常不錯的編譯器, 不可多得的學習素材~// End of update1
推薦8cc GitHub - rui314/8cc: A Small C Compiler 比起tcc lcc這些比較古老的tiny c 編譯器, 8cc的代碼好讀太多。
或者,也可以看看我最近寫的GitHub - wgtdkp/wgtcc: a tiny C compiler in C++。
以及在這裡的回答,如何寫一個簡單的編譯器? - wgtsam 的回答 - 知乎
編譯器本身比較完善,包括基本完整的語法,精簡的語義與類型檢查,x86-64代碼生成,以及預處理器。
那篇回答介紹了寫一個小的C編譯器的方方面面,以及一些實用的建議。- 除了編譯原理,還可以看csapp。它涉及c語言,彙編語言,機器語言三者的對應關係,以及程序是如何運作的,可以幫助你更深刻的理解c語言
- 推薦項目
1 lotabout/write-a-C-interpreter
一個基於rswier/c4的項目,附上教程write-a-C-interpreter-02 rspivak/lsbasi用python實現Pascal編譯器,可能和題目沒啥關係,但是教程Let』s Build A Simple Interpreter. Part 1.寫的很清楚詳細,所以推薦一下
業。寫一個精簡版的C,支持大部分語法功能,除了goto和case幾乎所有的常用語法都支持。wereFluke / compiler2015 - Bitbucket然後是用遞歸下降,一趟式直接生成IR的再從IR到MIPS,支持自舉。
寫一個編譯器前端簡單,編譯器最耗時間的是後端.如果你說的是寫一個c語言前端,可以利用llvm後端寫一個
參見未來程序改
以上各位都提到了最近比較新的編譯器前段/後端技術。我的建議時看樓主是想玩前端(詞法/語法分析,生成語法樹)還是後端(生成byte code或機器碼),或者是兩者都。我這裡假設樓主是來學習和練手的,如果是實際項目里用的話。。。那就是另外一個話題了。前端的話,建議不要用其他庫或開源,直接用bison/flex開始擼,直到實現語法樹(AST),這個可以充分的演練教科書里每個環節。如果不需要後端(或者沒時間實現)但希望能驗證運行結果的話,可以簡單實現一個解釋器。後端的話,你可以直接用LLVM,也可以仿照其架構自己輪子一個。當然也可以硬擼。比如TCC : Tiny C Compiler 雖然是上古時代的東西,但在同期可能沒有更好的了。實現上,它包沒有明顯的區分前端和後端,直接上來parse後就code gen了。
建議實現C語言的子集。過程就是詞法分析,語法分析,語義分析,代碼生成。推薦《編譯器工程》。
既然是說C編譯器,有書啊,這本:a retargetable c compiler design and implementation還可以看看這個問題:怎樣去寫一個編譯器(用C語言寫C語言編譯器),需要哪些知識做鋪墊,可以給一下相關網站和書籍的推薦嗎? - 編程語言
很簡單的,我寫過一個,大概1000行代碼,py寫的。
只是簡單的編譯器,重複造輪子沒多大意義,只是理解下編譯器的工作原理。不要看國人的書,看 萊斯大學教授寫的 編譯器設計 ,第二版,看不懂,多看幾遍就懂了.從此,再也不怕別人裝逼了.
推薦閱讀: