1. 預處理:負責執行C語言中的#include, #if, #else 等預處理指令。注意,這里是去執行這些預處理指令。這些預處理指令的作用是根據你的系統環境配湊出最終版的源代碼。
C語言
2. 詞法分析:把你定義的函數名、變量名、預留的關鍵字等抽象化,用一個符號來代替,方便編譯程序處理。例如上圖中的main, return, printf等單詞,都被看作一個符號,轉換成M, R, P。在這個過程中,會檢查你的變量名、函數名名稱是否正確。
3. 語法分析:經過詞法分析處理之后,程序代碼已經變成一堆符號了,例如 I S T F ... M I R P(放心,人已經不認識了,但是計算機能認識)。這時的符號是打散的,語法分析負責把這些符號按照一定的結構組織起來,形成一個抽象語法樹(這個結構跟你寫的程序代碼的結構是對應起來的)。
C語言
4. 語義分析:當構造出這樣一個樹的結構之后,編譯就就會檢查語法是否正確,并且去掃描這棵樹。根據這棵樹的結構,生成中間指令了。這個中間指令已經非常接近匯編。中間指令跟匯編還是有區別的,因為不同廠家的CPU指令有所不同,所以還要根據不同廠家的CPU指令集,把這個中間指令轉換成匯編。
C語言
5. 優化:因為程序員有時代碼寫的不太好,會導致一些多余的操作,或者效率低的指令。優化過程可以找出這些毛病,自動替換成更好的指令。
6. 鏈接:以上過程只編譯了一個模塊,一個大型程序往往包含好多個模塊。最后的鏈接過程負責把所有模塊組裝起來,構造出最后可以執行的程序。 |