編譯和鏈結

2021-08-08 09:36:23 字數 1189 閱讀 1571

編譯鏈結可以分解為4個步驟:預處理、編譯、彙編、鏈結。

預處理主要處理源**中以 # 開始的預編譯指令。主要處理規則如下:

編譯過程就是對預處理完的檔案進行一系列詞法分析語法分析語義分析優化後產生相應的彙編**檔案

將彙編**轉換變成機器可以執行的指令,每乙個彙編語句幾乎都對應一條機器指令。

鏈結的主要內容就是把各個模組之間的相互引用的部分都處理好,使得各個模組之間能夠正確的銜接。

將源**輸入到掃瞄器,掃瞄器簡單的進行語法分析,運用一種類似於有限狀態機的演算法將源**的字串行分割成一系列的記號。

詞法分析產生的記號一般分為如下幾類:關鍵字、識別符號、字面量和特殊符號

語法分析器將對由掃瞄器產生的記號進行語法分析產生語法樹。生成的語法樹就是以表示式為節點的樹。

語法分析僅僅是完成了對表示式的語法層面的分析,但是它並不了解這個語句是否真正有意義。比如c語言裡的兩個指標做乘法運算是沒有意義的,但是這個語句在語法上是合法的。

語義分析器能夠分析的語義是靜態語義,即在編譯器可以確定的語義。

靜態語義通常包括宣告和型別的匹配,型別的轉換。比如當乙個浮點數賦值給乙個整型表示式時,其中隱含了浮點型到整型的轉換,語義分析過程需要完成這個步驟。

動態語義一般是指在執行期出現的語義相關的問題,比如將 0 作為除數是乙個執行期語義錯誤。

直接在語法樹上做優化比較困難,所以源**優化器往往將整個語法樹轉換成中間**

編譯器前端負責產生機器無關的中間**,編譯器後端負責將中間**轉換成目標機器**。

編譯器後端主要包括**生成器目標**優化器

**生成器將中間**轉換成目標機器**,這個過程依賴於機器,因為不同的機器有著不同的字長、暫存器、整數資料型別和浮點數型別等。

目標**優化器對上述之**進行優化,比如選擇合適的定址方式、使用位移來代替乘法運算、刪除多餘的指令等。

編譯和鏈結

一般來說,無論是c c 首先要把原始檔編譯成中間 檔案,在windows下也就是 obj 檔案,unix下是 o 檔案,即 object file,這個動作叫做編譯 compile 然後再把大量的object file合成執行檔案,這個動作叫作鏈結 link 編譯時,編譯器需要的是語法的正確,函式與...

編譯和鏈結

在多道程式的實現中,要想使原始檔生成可執行檔案通常需要兩個步驟編譯和鏈結,其中編譯是指將原始檔編譯為中間 檔案,在linux中為 o檔案,其實質就是由c或c 等高階語言生成組合語言。生成可執行檔案,我們以編譯c c 為例,在windows中編譯生成的為.obj檔案,在linux unix中生成.o檔...

編譯和鏈結

平時,我們口頭上並不嚴格區分 編譯 compile 與 鏈結 link 這兩個專業術語。例如我們總是說 把那個 c檔案編譯成可執行檔案 寫成命令就是 gcc example.c 這個命令馬上給我們產生乙個 a.out 如果程式沒有錯誤的話 實際上,整個工作至少要分成四個階段,分別由不同的程式完成 第...