簡體   English   中英

C / C ++編譯器如何工作?

[英]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源代碼

http://bellard.org/otcc/

根據您確切想知道的內容,您應該查看管道和過濾器模式,因為據我所知,在過去幾年中,許多編譯器都使用了這種(或類似的東西)。

當我的編譯器知識不是太過時它的工作原理如下:

將源代碼解析為符號表示

清理符號表示,做一些規范化

基於特定規則的符號樹優化

寫出基於符號樹的可執行代碼

當然,依賴性等也必須得到解決。

當然,查看gcc或javac源代碼可能有助於獲得更詳細的理解。

獲取和讀取編譯器的源代碼也可能很有價值。 我懷疑海灣合作委員會是最好的首選,因為它充分兼容20多年的語言發展。 但我也確信,在其中一本內部參考手冊的指導下閱讀其來源將具有教育意義。

我認真考慮查看內部編譯為虛擬機字節碼的腳本語言的源代碼。 有幾種語言符合這種描述,但我會從Lua開始。 語言很小,VM很新穎。 源代碼也很小,我看過的內容非常清楚,雖然輕微評論。

看看萬花筒 您可以使用LLVM在幾天內編寫自己的編譯器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM