[英]How do C/C++ compilers work?
經過十多年的C / C ++編碼,我注意到了以下模式 - 非常優秀的程序員傾向於詳細了解編譯器的內部結構。
我是一個相當優秀的程序員,我有一個特殊的編譯器“迷信”集合,所以我想重新啟動我的知識並從基礎開始。
有人可以推薦在線資源或喜歡的書籍鏈接嗎? 我對C / C ++編譯,優化,GCC和LLVM特別感興趣。
從龍書開始....(更多關注代碼優化和代碼生成)
繼續編寫一個玩具編譯器,用於教育編程語言,如Decaf或Cool ..,你可以使用解析器生成器(lex和yacc)作為你的前端(讓生活更輕松,專注於更多的東西)....
然后閱讀gcc internals book以及瀏覽gcc源代碼。
編譯器文本很好,但是對於自己教學來說它們有點沉重。 Jack Crenshaw有一本“書”,這是一系列文章,你可以下載並閱讀“Lets Build a Compiler”。 它遵循“邊做邊學”的方法,如果你沒有從這個主題的正式課程中得到任何東西,或者它已經花了太多年了(這是我的情況)。 它牽着你的手,引導你通過編寫編譯器,而不是用Lambda微積分和只有學術界關心的深層理論問題來打擾你。 這是一個很好的方式來激發那些只有在Vax(YEAH,那是一個VAX!)許多月前在學校寫東西的模糊記憶的腦細胞。 它的編寫非常簡單,易於坐下來閱讀,不像大多數教科書需要幾罐咖啡才能超越第一章。 一旦你有了理解的基礎,那么更多的傳統文本,如龍書,是擴展你的理解的偉大參考。 (而且我個人喜歡Dead Tree版本,我打印出Jack's,在舒適的位置閱讀比在筆記本電腦上閱讀更容易。而電子書閱讀器太昂貴了,因為某些東西實際上並不像你在閱讀真實的書。)
有些人可能稱之為“缺點”是它是用Pascal編寫的,但我認為這讓我更多地考慮它,而不是有人給我一個有效的C程序開始。 從那時起,它就以68000編寫,僅在此時才用於嵌入式系統。 對我而言,這不是一個問題,我知道68000 asm和68000 asm比其他一些asm更容易閱讀。
如果你想要死樹版,試試編譯器設計的藝術:理論與實踐 。
正如Pete Eddy所說,Jack Crenshaw的教程非常適合新手。 但是,如果你想看看如何將一個真實的,生產的C編譯器的工作原理 -酮這是由聰明的工程師設計的 ,而不是通過在牆投擲代碼中創建,直到東西卡,讓自己弗雷澤和漢森的副本一個可重定向C編譯器:設計和實現 ,其中包含非常干凈的lcc
編譯器的源代碼。 設計和實現的解釋與代碼混合在一起。 它不是初學者的第一本書,但它會報銷仔細研究,你可以花35美元得到一份二手書。
有關lcc
的更長lcc
,請參閱在Linux上編譯C更快 。
lcc網頁還包含許多優秀教科書的鏈接。 但是,我不知道我真正喜歡的介紹文本。
PS對不起你在Uni被扯掉了。
請參閱Fabrice Bellard的otcc源代碼
根據您確切想知道的內容,您應該查看管道和過濾器模式,因為據我所知,在過去幾年中,許多編譯器都使用了這種(或類似的東西)。
當我的編譯器知識不是太過時它的工作原理如下:
將源代碼解析為符號表示
清理符號表示,做一些規范化
基於特定規則的符號樹優化
寫出基於符號樹的可執行代碼
當然,依賴性等也必須得到解決。
當然,查看gcc或javac源代碼可能有助於獲得更詳細的理解。
看看萬花筒 。 您可以使用LLVM在幾天內編寫自己的編譯器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.