編譯過程

初識編譯器

我們通常所說的編譯器是一個廣義的概念,其實編譯器是有幾個模塊組成的,具體如下:

11.PNG

從上圖可知編譯器由4部分組成;

每當我們在集成開發環境下寫完代碼,點擊build的時候 編譯器的工作原理如下:

22.PNG

可以看到,編譯代碼的過程其實就是編譯器讓這些模塊協同工作的過程。

第一步:預處理器將.c和.h文件編譯器.i中間文件。

第二步:.i中間文件被編譯器進行語法,語義分析,生成.s彙編文件。

第三步:.s文件經過彙編器編譯成.o二進制文件。


編譯器做了什麼

1.預編譯(文本處理工作)

-處理所有註釋,以空格代替

-將所有的#define刪除,並且展開所有的宏定義

-處理條件編譯指令#if,#ifdef,#elif,#else,#endif

-處理#include,展開被包含的文件

-保留編譯器需要使用的#pragma指令


預處理指令示例:

gcc -E file.c -o file.i


-o:指定生成的輸出文件;
-E:僅執行編譯預處理;
-S:將C代碼轉換爲彙編代碼;
-wall:顯示警告信息;
源代碼的單步編譯示例:

11.PNG

33.PNG

打開預編譯器處理過後的19-1.i文件可以看到  裏面的註釋和#define都沒有了,預編譯器將#define的內容進行文本替換,並且19-1.h裏面的內容也被加載進來了

當預編譯器處理完成之後 ,真正意義上的額編譯器就出場了

2.編譯

-對預處理文件進行詞法分析,語法分析和語義分析

 .詞法分析:分析關鍵字,標識符,立即數等是否合法

 .語法分析:分析表達式是否遵循語法規則

 .語義分析:在語法分析的基礎上進一步分析表達式是否合法

-分析結束後進行代碼優化生成相應的彙編代碼文件


編譯指令示例:

 gcc -S file.i -o file.s


編譯器將源程序編譯成彙編代碼

44.PNG

彙編

-彙編器將彙編代碼轉變爲機器的可執行指令

-每條彙編語句幾乎都對應一條機器指令


彙編指令示例:

gcc -c file.s -o file.o

55.PNG

運行.o文件發現權限不夠 ,這個時候需要連接器來完成(.o文件是一個二進制文件,並不是可執行文件)連接器的作用是將.o文件合在一起得到一個可執行程序。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章