標籤:
軟體的構建分解為4個步驟,分別是預先處理(Prepressing),編譯(Compilation),彙編(Assembly),連結(Linking)。
下面以C語言為例,分別對這4步做簡單說明:
預先處理
預先處理主要是將源檔案中以"#"開始命令進行處理,主要為:
1、將宏定義(#define)在源檔案引用位置原封原樣的展開(所以使用宏定義要多用括弧打包整個定義)。
2、處理條件先行編譯(#ifdef ...),得出正確的條件流程。
3、在包含檔案的先行編譯處(#include )將對應的標頭檔展開,如果標頭檔也有包含其他檔案,則遞迴展開。
4、刪除代碼中的注釋
5、添加行號和檔案名稱標識,便於編譯器調試或警告等可以顯示行號
6、保留編譯器設定指令(#pragma),用於編譯器
預先處理後的檔案為".i"尾碼,我們可以查看此檔案來判斷整理後的代碼是否正確。
編譯
編譯就是把預先處理過程的".i"檔案處理為".s"彙編檔案,這個過程會經曆詞法分析、文法分析、語義分析和最佳化步驟。
詞法分析:
將代碼逐個掃描,根據當前所使用語言的規則分離出關鍵字、標識符、特殊符號、字面量等,分類產生有序的表格。
文法分析:
根據使用語言的文法規則,將詞法分析的表格進行語法檢查,並產生文法樹。文法樹也是表明了一行代碼中啟動並執行優先順序及順序等。
若有語法錯誤,在這步就會報錯。
語義分析:
將文法樹進行語義分析,經過語言分析後,標識符的類型就能夠被確定(判斷是否需要強制轉換等等)。
若有語義錯誤,在這步就會報錯(比如兩個指標相乘)。
最佳化:
將最後的文法樹轉換為中間代碼後最佳化,最終產生和硬體有關的彙編代碼。
彙編
彙編將編譯產生的彙編檔案根據硬體構架而轉換成對應的機器碼檔案,也叫目標檔案(Object File),為".o"尾碼。
注意:此時彙編而成的檔案中,內部變數及函數等的最終地址需要通過連結才能確定。
連結
連結將多個目標檔案中指令及其對其他符號的地址引用修正,產生可執行檔檔案。
主要包括地址和空間分配(Address and Storage Allocation)、符號決議(Symbol Resolution)、重定位(Relocation)等步驟。
軟體構建基礎-->構建流程