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