為什么我們編寫的C語言要進行編譯?什么是編譯?編譯時發(fā)生了什么?
機器無法理解我們編寫的C語言,而編譯就是將面向人類的高級語言轉(zhuǎn)換成為面向機器的機器語言的過程,圖1是GCC編譯器進行編譯的過程,編譯時主要分為了4個階段,每個階段的具體作用將在接下來進行介紹。
注:預(yù)處理中的cpp不是 c plus plus,而是c pre-process
Part1預(yù)處理
命令:gcc -E hello.c -o hello.i
編譯過程的第一步預(yù)就是預(yù)處理,預(yù)處理結(jié)束后會產(chǎn)生一個后綴為(.i)的臨時文件,這一步由預(yù)處理器完成。預(yù)處理器主要完成以下任務(wù)。
1.1 頭文件展開
#include :在系統(tǒng)指定路徑下尋找stdio.h;
#include "stdio.h" :在當前路徑下尋找stdio.h 如果找不到則在系統(tǒng)指定路徑下尋找stdio.h。
1.2 條件編譯
根據(jù)不同情況編譯不同代碼、產(chǎn)生不同目標文件的機制,稱為條件編譯。條件編譯是預(yù)處理程序的功能,不是編譯器的功能;
這些操作都是在預(yù)處理階段完成的,多余的代碼以及所有的宏都不會參與編譯,不僅保證了代碼的正確性,還減小了編譯后文件的體積;
條件編譯主要處理內(nèi)容為:#if,#ifdef,#ifndef, #if defined(AAA), #if defined AAA。
1.3 #define替換
將宏定義的常量或函數(shù)進行替換。
Part2編譯
命令:gcc -S hello.c -o hello.s
C 中的編譯階段使用內(nèi)置編譯器軟件將 (.i) 臨時文件轉(zhuǎn)換為具有匯編級指令(低級代碼)的匯編文件 (.s)。為了提高程序的性能,編譯器將中間文件轉(zhuǎn)換為程序集文件;
匯編代碼是一種簡單的英文語言,用于編寫低級指令(在微控制器程序中,我們使用匯編語言)。整個程序代碼由編譯器軟件一次性解析(語法分析),并通過終端窗口告訴我們源代碼中存在的任何語法錯誤或警告。
Part3匯編
命令:gcc -c hello.c -o hello.o。
使用匯編程序?qū)⒊绦蚣壌a(.s 文件)轉(zhuǎn)換為機器可理解的代碼(二進制/十六進制形式)。匯編程序是一個預(yù)先編寫的程序,它將匯編代碼轉(zhuǎn)換為機器代碼。它從程序集代碼文件中獲取基本指令,并將其轉(zhuǎn)換為特定于計算機類型(稱為目標代碼)的二進制/十六進制代碼;
生成的文件與程序集文件同名,在 DOS 中稱為擴展名為 .obj 的對象文件,在 UNIX 操作系統(tǒng)中擴展名為 .o;
如圖2顯示了組裝階段如何工作的示例。程序集文件 hello.s 將轉(zhuǎn)換為具有相同名稱但擴展名不同的對象文件 hello.o。
圖2
Part4鏈接
命令:gcc hello.c -o hello
鏈接是將庫文件包含在我們的程序中的過程。庫文件是一些預(yù)定義的文件,其中包含機器語言中的函數(shù)定義,這些文件的擴展名為.lib。一些未知語句寫入我們的操作系統(tǒng)無法理解的對象 (.o/.obj) 文件中。你可以把它理解為一本書,里面有一些你不知道的單詞,你會用字典來找到這些單詞的含義。同樣,我們使用庫文件來為對象文件中的一些未知語句賦予意義。鏈接過程會生成一個可執(zhí)行文件,其擴展名為 .exe 在 DOS 中為 .out,在 UNIX 操作系統(tǒng)中為 .out;
如上圖2,顯示了鏈接階段如何工作的示例,我們有一個具有機器級代碼的對象文件,它通過鏈接器傳遞,鏈接器將庫文件與對象文件鏈接以生成可執(zhí)行文件。
Part5****結(jié)論
- C中的編譯過程也稱為將人類可理解代碼(C程序)轉(zhuǎn)換為機器可理解代碼(二進制代碼)的過程;
- C語言的編譯過程包括四個步驟:預(yù)處理、編譯、匯編和鏈接;
- 預(yù)處理器執(zhí)行刪除注釋、宏擴展、文件包含。這些命令在編譯過程的第一步執(zhí)行;
- 編譯器可以提高程序的性能,并將中間文件轉(zhuǎn)換為匯編文件;
- 匯編程序有助于將匯編文件轉(zhuǎn)換為包含機器代碼的對象文件;
- 鏈接器用于將庫文件與對象文件鏈接。這是編譯中生成可執(zhí)行文件的最后一步。
-
處理器
+關(guān)注
關(guān)注
68文章
19166瀏覽量
229151 -
C語言
+關(guān)注
關(guān)注
180文章
7598瀏覽量
136208 -
程序
+關(guān)注
關(guān)注
116文章
3777瀏覽量
80853 -
編譯
+關(guān)注
關(guān)注
0文章
654瀏覽量
32809
發(fā)布評論請先 登錄
相關(guān)推薦
評論