通過(guò)一句話來(lái)簡(jiǎn)單理解一個(gè)程序的編譯過(guò)程到底是做什么
我們都知道,程序都需要編譯以后才能運(yùn)行,那么,編譯過(guò)程大概是做什么事情呢?

上圖是一個(gè)編譯過(guò)程的簡(jiǎn)單示意圖。
詞法分析程序必須按照一定的分類標(biāo)準(zhǔn)將源程序中的單詞進(jìn)行識(shí)別并進(jìn)行預(yù)加工處理。
語(yǔ)法分析程序的任務(wù)是將單詞符號(hào)串分解成各類語(yǔ)法單位,即確定一個(gè)程序的結(jié)構(gòu)。
語(yǔ)法單位即:短語(yǔ)、句子、子程序、函數(shù)、程序等。
語(yǔ)義分析是根據(jù)程序設(shè)計(jì)語(yǔ)言的語(yǔ)義定義(形式的或非形式的),確認(rèn)(識(shí)別)程序中各構(gòu)成組合到一起的含義,并作相應(yīng)的語(yǔ)義處理。
語(yǔ)義處理大概表示為:

這是對(duì)可執(zhí)行語(yǔ)句生成中間表示或目標(biāo)代碼。
目標(biāo)代碼指計(jì)算機(jī)科學(xué)中編譯器或匯編器處理源代碼后所生成的代碼,它一般由機(jī)器代碼或接近于機(jī)器語(yǔ)言的代碼組成。

下面以一句英語(yǔ)和一段最簡(jiǎn)單的程序?qū)Ρ葋?lái)進(jìn)行說(shuō)明。
句子:The teacher asked the student to bring the book to her
程序:int?i,s=0;
for(i=1;i<=100;i++)
s+=i;
printf("s=%d",s);
對(duì)于那句英語(yǔ),我們首先要檢查的就是那句話里面是不是每一個(gè)單詞都是正確的,檢查的方法就是看看那句話里面的單詞是不是都屬于英語(yǔ)字典里面已有的單詞。
對(duì)于下面那段程序,同樣的要先看看里面的每一個(gè)標(biāo)識(shí)符、符號(hào)、數(shù)字或者函數(shù)名是否有錯(cuò)誤,這一步在編譯中叫詞法分析。
詞法分析以后就要進(jìn)行語(yǔ)法分析,對(duì)于上面那句英語(yǔ),我們就要按照語(yǔ)法規(guī)則,看看這個(gè)句子是否符合主謂賓等語(yǔ)法規(guī)定;對(duì)于計(jì)算機(jī)程序,語(yǔ)法分析就是看其中的每一條語(yǔ)句是否符合相關(guān)規(guī)定,比如x=3+i是符合語(yǔ)法規(guī)定的,因?yàn)?號(hào)和=號(hào)的的兩邊都是數(shù)字或者變量。
語(yǔ)法分析以后就是語(yǔ)義分析。對(duì)于那句英語(yǔ)來(lái)說(shuō),就是要分析那句話中包含了什么意思,就是讓學(xué)生把一本書(shū)從某個(gè)地方拿到另一個(gè)地方。
對(duì)于程序來(lái)說(shuō),它的語(yǔ)義就是要把1到100的和求出來(lái)。
為了達(dá)成上述目標(biāo),在英語(yǔ)句子中的那個(gè)學(xué)生就必須準(zhǔn)備用腳走路,用手拿那本書(shū),也就是說(shuō),要為下面真正的動(dòng)作做好準(zhǔn)備。
對(duì)于程序來(lái)說(shuō),要實(shí)現(xiàn)加法,比如其中的語(yǔ)句s+=i,也就是s=s+i,為了真正實(shí)現(xiàn)這個(gè)加法運(yùn)算,這個(gè)時(shí)候就要為s和i兩個(gè)變量分配好存儲(chǔ)空間,然后把這兩個(gè)變量的值輸入到加法器電路的兩個(gè)輸入端,如圖2所示,并把加法運(yùn)算的結(jié)果值保留在變量s中。
上述工作都做好了以后,我們知道,計(jì)算機(jī)最終能夠執(zhí)行的指令只有匯編指令或者機(jī)器語(yǔ)言,因此,最后要把上述的高級(jí)語(yǔ)言指令轉(zhuǎn)化為匯編指令,也就是機(jī)器指令,最后生成可執(zhí)行程序,這大概就是一個(gè)計(jì)算機(jī)程序的整個(gè)編譯過(guò)程。

簡(jiǎn)單說(shuō)來(lái),編譯過(guò)程就是
1:詞法分析
2:語(yǔ)法分析
3:語(yǔ)義分析
4:生成目標(biāo)代碼