編譯鏈結可以分解為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 如果程式沒有錯誤的話 實際上,整個工作至少要分成四個階段,分別由不同的程式完成 第...