gcc編譯原理

2021-07-03 20:37:01 字數 953 閱讀 2824

引言

gcc現在的意思是「gun編譯器集合」,這裡說的是上個世紀的意思「gun c語言編譯器」。

2.1程式的一般編譯過程

以gcc為例:

一般情況下,比如我們有乙個原始檔:main.c,裡面寫的是我們的**。想執行以下,gcc main.c,執行以下這個命令就會生成乙個a.out的檔案。然後./a.out就可以執行了。但是,這中間的過程可注意過嗎?這就是編譯原理要研究的內容了。這一節先說一下整個的處理過程,具體細節會在以後逐漸討論,包括,詞法分析,語法分析,中間**生成和優化,優化又包括機器無關優化,並行性和區域性性優化,等等這些內容。以及如何自己發明一種語言,然後自己動手寫乙個編譯器將其編譯!

分別加入引數可檢視各個階段的結果。

在上圖中,cpp是「預編譯」的縮寫,ast是「抽象語法樹」的縮寫,ssa是「靜態單賦值」的縮寫,rtl是「暫存器傳輸語言」的縮寫。各種含義,需要仔細品味一下,呵呵。

過程如下:

1》將不同語言,進行詞法分析,語法分析,得到對應語言的ast

2》這些ast之間有稍微的差別,然後把這些差別去除,生成通用ast

3》按照ast,生成中間**(三位址**,即:x=y op z)

4》對中間**進行優化,這部分的任務很艱鉅

5》根據目標機器的彙編描述,生成對應機器架構的組合語言

6》到此編譯器的任務就算完了,剩下的彙編器。

7》彙編器將其彙編成機器**(010100101000101010010101010000101011110.。。。。。)

8》聯結器ld將原始碼中呼叫的庫函式連線進來

9》最後,是載入器,將可執行檔案載入到記憶體,並執行之。

2.2編譯器的前端處理過程

下面是一句簡單的c語句的編譯過程。

如圖所示:

2.3小結

乙個高階語言寫的程式的執行,要經過很複雜漫長的過程。這個過程對我們程式設計師來說卻經常被忽視。

向編譯器創造者致敬。

gcc 編譯 鏈結原理

使用 ld linux.so.作為直譯器,是寫在二進位制檔案中的,比如上面編譯好的 demo 中。另外的,2 其它庫的查詢和載入,則是 ld linux.so.完成的。ldd 可執行檔名 檢視可執行檔案鏈結了哪些 系統動態鏈結庫 strip 可執行檔名 去除符號表可以給可執行檔案 ldconfig ...

gcc程式的編譯過程和鏈結原理

1.預處理 處理標頭檔案 預處理就是將要包含 include 的檔案插入原檔案中 將巨集定義展開 根據條件編譯命令選擇要使用的 最後將這些 輸出到乙個 i 檔案中等待進一步處理。gcc e o 001.i 001.c2.編譯編譯就是把c c 比如上面的 i 檔案 翻譯 成彙編 gcc s o 001...

gcc編譯過程

本文對gcc編譯器如何工作做乙個概要描述.更為詳細的資訊請參考編譯器手冊。當我們進行編譯的時候,要使用一系列的工具,我們稱之為工具鏈.其中包括 預處理器cpp,編譯器前端gcc g 彙編器as,聯結器ld.乙個編譯過程包括下面幾個階段 1 預處理。預處理器cpp將對原始檔中的巨集進行展開。2 編譯。...