深入淺出編譯原理 2 gcc編譯器概覽

2021-08-27 01:16:19 字數 1098 閱讀 4535

引言

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

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

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

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

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

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

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

2.2編譯器的前端處理過程

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

如圖所示:

2.3小結

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

向編譯器創造者致敬。

編譯原理的學習過程一般比較枯燥,多乙個人同行,就多乙份趣味和快樂!

深入淺出編譯原理 3 詞法分析器

引言 編譯器的工作的開始,就是讀入原始碼 預編譯先不考慮 然後,去除一些空字元,然後經過詞素匹配,並和其屬性 可選 組成乙個的詞法單元,多個詞法單元,連線成詞法單元序列。自此,此法分析器的工作就算完成了。呵呵,就這麼簡單。可見,找到乙個詞素,是詞法分析器的核心工作,那,如何獲得乙個詞素呢?就是本節要...

Linux下程式設計工具的使用 2 GCC編譯器

對於gun編譯器來說,程式的編譯要經歷預處理 編譯 彙編 連線四個階段,如下圖所示 從功能上分,預處理 編譯 彙編是三個不同的階段,但gcc的實際操作上,它可以把這三個步驟合併為乙個步驟來執行。下面我們以c語言為例來談一下不同階段的輸入和輸出情況。在預處理階段,輸入的是c語言的原始檔,通常為 c。它...

Qt深入淺出(二)Qt編譯機制

使用qmake.exe 工具解析.pro檔案,然後生成makefile,通過makefile 32bit.exe解析makefile檔案來編譯,可通過檢視qt creator顯示的編譯資訊。先執行qmake命令解析class1 1.pro檔案,生成makefile.debug檔案 c qt qt5....