怎樣去寫一個編譯器(用C語言寫C語言編譯器),需要哪些知識做鋪墊,可以給一下相關網站和書籍的推薦嗎?

參考王垠『怎樣寫一個解釋器』


題主專門指定問「用C寫C編譯器」,那有本書專門就是講這個的:A Retargetable C Compiler。有中文版不過翻譯得不太好,勉強可讀。這本書以 lcc 為實例,從源碼實現的每個細節介紹了一個C語言編譯器如何用C語言來實現。

這本書的「缺點」是它就注重每個組件的具體實現,而只是簡單介紹了每個組件背後的原理,也沒有多展開介紹除了那種實現方式之外還有啥選擇。用這本書來搭配別的專門介紹原理的書來閱讀,例如龍書或虎書,效果會不錯。

嗯再次提醒如果讀中文版的話它的翻譯實在是比較費讀者的腦細胞…我忍了好久終於決定買了原版 ToT|||

另外放個傳送門給題主感受下C4… 有沒有關於c4-in four function 編譯器的文章? 看不懂 - RednaxelaFX 的回答


Amazon.com: A Retargetable C Compiler: Design and Implementation (9780805316704): David R. Hanson, Christopher W. Fraser: Books


謝謝邀請。

要學編譯器設計和實現,《編譯原理》是很多大學課程的入門必選。這本書素質一流,不過老實說,放到現在看已經有些老了,很多新的技術都沒有足夠的闡述,且偏重相對重量級的方法,比如LALR(1)文法。可惜我已經不看編譯原理多年,也不知那本書更合適一些。

我不贊同入門者從GCC或LLVM的源代碼開始。這幾個都是工業級別的產品,代碼龐大,尤其是GCC的中間層設計相當複雜且混亂,閱讀效果並不好(我自己大學時的印象,GCC 3.3.3,現在不知道好些了沒有)。如果把討論範圍限定在C語言編寫的C編譯器,那麼我強烈推薦http://bellard.org/tcc/。公開源代碼,且兼容GCC語法,代碼量也很少,適合入門。

如果從Java開始,那麼另一個可以選擇的輔助工具則是ANTLR。它不是編譯器,而是語法分析工具。可以幫助我們了解基本的LL(n)語法分析邏輯。


個人覺得該學學lex和yacc


如果只是想寫出來其實沒什麼難的,但想寫好想寫出優秀的堪比登天。

如果熟悉python 可以使用ply

如果熟悉C的話 學一下lexyacc

只要熟悉文法規則 會正則表達式就行,然後看幾個語言的lex和yacc的例子,就可以開動了。

至於裡面的理論知識,慢慢補就行,每做一步都問問為什麼要這樣做,編譯原理比較難讀,《編譯器設計》是本不錯的入門書,另外如果單獨進修文法,推薦:《編譯程序設計藝術:理論與實踐》 這本書對文法的描述,簡直登峰造極了。不過還有本spring出的關於文法分析的書也不錯,名忘了。


如果只是學習目的:建議學習編譯原理,用yacc一類的工具做到詞法和語法分析,更深入的可以找開源的編譯器源碼和設計學習。

如果是工程或者商業需求:注意編譯器現在已經是一個很綜合的工具鏈,不是簡單C語法分析這些語言層面的東西。沒有預編譯C也沒辦法使用,另外還有比如目標代碼生成,移植性,跨平台,調試器,優化等等。業界已經有很好開源的編譯器,如果不能發明更好的輪子,就不要重複發明輪子。


編譯原理

gcc或者llvm的源代碼(llvm也許更合適一些)


編譯器後端的實現還是很複雜的。建議你使用llvm作為後端,前面的詞法語法分析可以自己手寫。


龍書第一版


flex和yacc寫出來的只是前端,路還很遠。


有本書叫做 編譯器原理 又叫編譯原理(感覺第二個名字不準確)。看完就可以寫編譯器啦~或者學一下這門課,計算機類專業的必修課


哦哦,實習期剛用java寫了一個類似javacc的編譯器(只包括詞法分析語法分析,不含代碼生成等),之前沒學過java,也沒學過編譯原理。

由於覺得龍書晦澀難懂,一下子看完再編怕是精力全失,所以就一步步來,先看了詞法分析部分,然後動手寫了,有java的pattern包,所以不是很難(沒經歷DFA,NFA這種),最難的估計也就怎麼實現最長匹配。那個部分完成後,實現有一個token文件規定token,一個輸入文件,輸出token列表。

之後繼續看龍書的語法分析部分,使用了最基礎的LL(1)來做語法分析。按照書上的先first集合,再follow集合,建表。然後跟詞法分析部分進行連接。成功後,擴展成了LL(k)。

基本部分完成後,就開始加強功能了,一開始的grammar只支持BNF寫語法,後來擴展成可以用EBNF寫。

看過一個博客,是自己動手開發編譯器(零)序言 ,雖然真的coding的時候沒有怎麼參考,但是對於理論部分的理解還是有好處的。

然後,是看了一個EBNF轉BNF的演算法,對我們項目本身比較有用吧。EBNF CONVERT TO BNF


個人推薦Amazon.com: Compiler Design in C (Prentice-Hall software series) (9780131550452): Allen I. Holub: Books, 感覺曲線更平緩


推薦閱讀:

在哪裡買書比較好?為什麼噹噹亞馬遜等的書經常會有缺頁破損的情況?
噹噹網的電子閱讀器能否成為中國的 Kindle ?其主要競爭對手是誰,你最看好誰?
讀自己看不太懂或看不進去但一定好的書和能看懂的書里較好的書哪個更有益?
有哪些可以提升自己的書?
為什麼在台灣買書比買吃的貴?

TAG:編程語言 | 書籍 | 網站 | C編程語言 | 編譯器 |