誰看完過龍書虎書鯨書?全部看完是不是就有能力寫一個C語言的編譯器了?
RT
我看完過虎書和鯨書,龍書最近在參考著看。這三本書的地位在編譯器界應該和UNIX編程界的APUE和UNP差不多。如果你將這三本書全部看完,你也不一定可以寫出來一個C語言編譯器,但是這三本書會涵蓋你寫一個C語言編譯器的理論基礎。同時,也需要看你寫怎麼樣的一個C語言編譯器了,如果是Mini C語言應該是比較輕鬆的事情(如果你只寫編譯器前端,然後對接現成的編譯器後端的話)。
如果你想寫一個完備的C語言編譯器(如針對C99標準),大概的思路如下。除了編譯器的知識,你還需要去閱讀C語言標準(這是做C語言編譯器前端的必備參考之一),我想你搞清楚那個標準,一些光景應該已經過去了。與此同時,你需要設定好一個中間代碼格式,這方面比較典型的是LLVM IR,IBM編譯器的WCode等。你當然可以不設定中間代碼格式而直接與後端連接(如果你自己寫著玩的話),如果你要設定的話,又是一些光景過去了吧。然後你從中間代碼格式到後端開始集成,一個步驟是代碼優化,這裡面包括了消除死代碼,過程間分析等優化方法,與此同時,針對C語言,Pointer Alias我想你應該去做一下吧,我想又是一些光景過去了。然後你需要生成特定平台的彙編語言,這個時候假設是生成x86(因為如果來新的硬體,我想你吃不消了),這個時候看你怎麼處理了,你可以自己來做這個事情(如果這樣的話,你需要去閱讀x86架構的參考手冊,比如Intel的幾本參考手冊,又是一些光景過去了),當你達到這步驟後,恭喜你,編譯器基本上快要成功了。還有什麼呢?到了這步後,你需要做什麼呢?與彙編器連接,然後再是交給鏈接器,直到最後生成目標代碼。(如果你的心夠大,能力強悍,歡迎你自己實現彙編器與鏈接器,當然如果這樣的話,你還需要額外去了解PE和ELF這樣的文件格式,當然又是一些光景過去了)。嗯,差不多了吧,你也可以看看多少個光景過去了,而這些光景加起來多少個歲月,我想我也不知道,看你的能力了。
另外,推薦你先閱讀虎書,再考慮鯨書。鯨書主要講優化(雖然有些老了,但是還是很不錯),不利於你前期學習編譯原理參看,不過鯨書是我唯一見到一本提到過IBM編譯器Montana的書籍,希望鯨書可以有再次更新的機會。
Update:針對評論一個匿名用戶所說的有關中間代碼與目標代碼的回復(由於評論不能插入圖片,所以貼在這裡)- 不生成機器代碼:可以
- 使用 LLVM 等生成機器代碼:可以
- 自己一個人搞定:你還需要看 Intel 那本 6000 多頁的 x86 手冊……
標準有很多tricky的地方,寫一個可以play的編譯器可能可以,但是寫一個完全符合標準的,基本不可能。計算機編程 是一個工程學,意思是說,這東西更注重實現,而非理論。書本教會我們理論原理,但是編譯器難在於實現,原理我們都懂。
上面都回答的差不多了,說句題外的,比起龍書來,我更推薦《Engineering a Compiler》,我覺得這本書各方面都比龍書講的清晰。
寫編譯器(解釋器),學了這幾本書前端基本沒問題,後端的話,各種平台相關的東西太多,水太深,不是短時間內搞的定的,要不自己寫VM,要不用LLVM。建議直接看這個,一本即可,看完就能寫個lcc;可變目標C編譯器 我更喜歡ANTLR之父這本:
編程語言實現模式 (豆瓣)
另外,我覺得看google re2或者LUA的代碼更有趣啊JIT - λ-calculus(驚愕到手了歐耶,GetBlogPostIds.aspx)
這個是我上大學的時候做的一個C語言到內存x86代碼的記錄,題主僅供參考
看完龍書就可以了,寫個簡單的,跑的超慢的,只能是玩具的C語言的不完全子集的編譯器了
那是過時的技術,複雜而且細節少,和現實差距大。語法解析很複雜,類型推導也很複雜,代碼生成更是和另外一門語言有關。
要深入理解計算機語言的要素,也要理解低級語言和高級語言的數據類型模型完全不同,要理解語法的真正含義,類型的含義,描述語法本身是一種語言,描述數據結構和類型,也是一種語言。這要看你用不用llvm之類的現有的後端了,如果用,你只要看到IR生成部分就行了,但是編譯器的難點在於後端,前端差不多做爛了,至少是沒有什麼大的研究價值了。
推薦閱讀:
※c++有哪些像__gcd這樣的編譯器自帶函數?
※為什麼 VC 不允許 x64 內聯彙編?
※什麼語言最適合寫編譯器/解釋器?
※vector<vector<int> >中>>之間的空格是否是必須的?
※Visual Studio 為何沒有 64 位的版本?