編譯程序是一種翻譯程序,編譯程序是將一種語(yǔ)言形式翻譯成另一種語(yǔ)言形式。它將高級(jí)語(yǔ)言所寫(xiě)的源程序翻譯成等價(jià)的機(jī)器語(yǔ)言或匯編語(yǔ)言的目標(biāo)程序。
整個(gè)編譯過(guò)程一般可以劃分為 5 個(gè)階段:詞法分析、語(yǔ)法分析、語(yǔ)義分析及中間代碼生成、中間代碼優(yōu)化和目標(biāo)代碼生成。我們以一個(gè)簡(jiǎn)單的程序段為例,分別介紹這 5 個(gè)階段所完成的任務(wù)。例如,計(jì)算圓柱體表面積的程序段如下:
float r,h,s;
s = 2 * 3.1416 * r * (h + r);
詞法分析
詞法分析階段的任務(wù)是對(duì)構(gòu)成源程序的字符串進(jìn)行從左到右的掃描和分解,根據(jù)語(yǔ)言的詞法規(guī)則,識(shí)別出一個(gè)一個(gè)具有獨(dú)立意義的單詞(也稱單詞符號(hào),簡(jiǎn)稱符號(hào))。
語(yǔ)言的詞法規(guī)則是單詞符號(hào)的形成規(guī)則,它規(guī)定了哪些字符串構(gòu)成一個(gè)單詞符號(hào)。上述源程序通過(guò)詞法分析,根據(jù)語(yǔ)言的詞法規(guī)則識(shí)別出如下單詞符號(hào):
- 基本字(關(guān)鍵字) float
- 標(biāo)識(shí)符 r,h,s
- 常數(shù) 3.1416,2
- 運(yùn)算符 *,+
- 界符 () ; ,
單詞符號(hào)的類型有:關(guān)鍵字、標(biāo)識(shí)符、常數(shù)、運(yùn)算符、界符。
語(yǔ)法分析
語(yǔ)法分析的任務(wù)是在詞法分析的基礎(chǔ)上,根據(jù)語(yǔ)言的語(yǔ)法規(guī)則,從單詞符號(hào)串中識(shí)別出各種語(yǔ)法單位(如表達(dá)式、說(shuō)明、 語(yǔ)句等)并進(jìn)行語(yǔ)法檢查,即檢查各種語(yǔ)法單位在語(yǔ)法結(jié)構(gòu)上的正確性。
語(yǔ)言的語(yǔ)法規(guī)則是語(yǔ)法單位的形成規(guī)則。它規(guī)定了如何從單詞符號(hào)形成語(yǔ)法單位。上述源程序通過(guò)語(yǔ)法分析,根據(jù)語(yǔ)言的語(yǔ)法規(guī)則識(shí)別單詞符號(hào)串 s = 2 * 3.1416 * r * (h + r),其中 s 是 <變量>,單詞符號(hào)串 2 * 3.1416 * r * (h + r) 組合成 <表達(dá)式 > 這樣的語(yǔ)法單位, 則由 <變量> = <表達(dá)式> 構(gòu)成 <賦值語(yǔ)句> 這樣的語(yǔ)法單位。在識(shí)別各類語(yǔ)法單位的同時(shí)進(jìn)行語(yǔ)法檢查,可以看到上述源程序是一個(gè)語(yǔ)法上正確的程序。
語(yǔ)義分析及中間代碼生成
定義一種語(yǔ)言除了要求定義語(yǔ)法外,還要求定義其語(yǔ)義,即對(duì)語(yǔ)言的各種語(yǔ)法單位賦予具體的意義。
語(yǔ)義分析的任務(wù)是首先對(duì)每種語(yǔ)法單位進(jìn)行靜態(tài)的語(yǔ)義審查,然后分析其含義,并用另一種語(yǔ)言形式(比源語(yǔ)言更接近于目標(biāo)語(yǔ)言的一種中間代碼或直接用目標(biāo)語(yǔ)言)來(lái)描述這種語(yǔ)義。例如,上述源程序中,賦值語(yǔ)句的語(yǔ)義為:計(jì)算賦值號(hào)右邊表達(dá)式的值,并把它送到賦值號(hào)左邊的變量所確定的內(nèi)存單元中。語(yǔ)義分析時(shí),先檢查賦值號(hào)右邊表達(dá)式和左邊變量的類型是否一致,然后再根據(jù)賦值語(yǔ)句的語(yǔ)義,對(duì)它進(jìn)行翻譯可得到如下形式的四元式中間代碼:
其中,T1、T2、T3、T4 是編譯程序引進(jìn)的臨時(shí)變量,存放每條指令的運(yùn)算結(jié)果。上述每一個(gè)四元式所表示的語(yǔ)義為:
這樣,我們將源語(yǔ)言形式的賦值語(yǔ)句翻譯為四元式表示的另一種語(yǔ)言形式,這兩種語(yǔ)言在結(jié)構(gòu)形式上是不同的,但在語(yǔ)義上是等價(jià)的。
中間代碼優(yōu)化
中間代碼優(yōu)化的任務(wù)是對(duì)前階段產(chǎn)生的中間代碼進(jìn)行等價(jià)變換或改造,以期獲得更為高效的,節(jié)省時(shí)間和空間的目標(biāo)代碼。優(yōu)化主要包括局部?jī)?yōu)化和循環(huán)優(yōu)化等,例如上述四元式經(jīng)局部?jī)?yōu)化后得:
其中,2 和 3.1416 兩個(gè)運(yùn)算對(duì)象都是編譯時(shí)的已知量,在編譯時(shí)就可計(jì)算出它的值 6.28,而不必等到程序運(yùn)行時(shí)再計(jì)算,即不必生成(*,2,3.1416,T1)的運(yùn)算指令。
目標(biāo)代碼生成
目標(biāo)代碼生成的任務(wù)是將中間代碼變換成特定機(jī)器上的絕對(duì)指令代碼或可重定位的指令代碼或匯編指令代碼。
表格管理 & 錯(cuò)誤處理
在編譯程序的各個(gè)階段中,都要涉及表格管理和錯(cuò)誤處理。
編譯程序的重要功能之一,是記錄源程序中所使用的變量的名字,并且收集與名字屬性相關(guān)的各種信息。名字屬性包括一個(gè)名字的存儲(chǔ)分配、類型、作用域等信息。如果名字是一個(gè)函數(shù)名,還會(huì)包括其參數(shù)數(shù)量、類型、參數(shù)的傳遞方式以及返回類型等信息。符號(hào)表數(shù)據(jù)結(jié)構(gòu)可以為變量名字創(chuàng)建記錄條目,來(lái)登記源程序中所提供的或在編譯過(guò)程中所產(chǎn)生的這些信息,編譯程序在工作過(guò)程的各個(gè)階段需要構(gòu)造、查找、修改或存取有關(guān)表格中的信息,因此在編譯程序中必須有一組管理各種表格的程序。
如果編譯程序只處理正確的程序,那么它的設(shè)計(jì)和實(shí)現(xiàn)將會(huì)大大簡(jiǎn)化。但是程序設(shè)計(jì)人員還期望編譯程序能夠幫助定位和跟蹤錯(cuò)誤。無(wú)論程序員如何努力,程序中難免總會(huì)有錯(cuò)誤出現(xiàn)。雖然錯(cuò)誤很常見(jiàn),但很少有語(yǔ)言在設(shè)計(jì)的時(shí)候就考慮到錯(cuò)誤處理問(wèn)題。大部分程序設(shè)計(jì)語(yǔ)言的規(guī)范沒(méi)有規(guī)定編譯程序應(yīng)該如何處理錯(cuò)誤;錯(cuò)誤處理方法由編譯程序的設(shè)計(jì)者決定。 因此,從一開(kāi)始就計(jì)劃好如何進(jìn)行錯(cuò)誤處理,不僅可以簡(jiǎn)化編譯程序的結(jié)構(gòu),還可以改進(jìn)錯(cuò)誤處理方法。一個(gè)好的編譯程序在編譯過(guò)程中, 應(yīng)具有廣泛的程序查錯(cuò)能力,并能準(zhǔn)確地報(bào)告錯(cuò)誤的種類及出錯(cuò)位置,以便用戶查找和糾正,因此在編譯程序中還必須有一個(gè)出錯(cuò)處理程序。
編譯程序
編譯過(guò)程的這 5 個(gè)階段的任務(wù)分別由 5 個(gè)程序完成,這 5 個(gè)程序分別稱為詞法分析程序、語(yǔ)法分析程序、語(yǔ)義分析及中間
代碼生成程序、中間代碼優(yōu)化程序和目標(biāo)代碼生成程序,另外再加上表格管理程序和出錯(cuò)處理程序。這些程序便是編譯程
序的主要組成部分,一個(gè)典型編譯程序的結(jié)構(gòu)框圖如圖所示。
需要注意的是,圖中所給出的各個(gè)階段之間的關(guān)系是指它們之間的邏輯關(guān)系,不一定是執(zhí)行時(shí)間上的先后關(guān)系。實(shí)際
上,可按不同的執(zhí)行流程來(lái)組織上述各階段的工作,這在很大程度上依賴于編譯過(guò)程中對(duì)源程序掃描的遍數(shù)以及如何劃分各遍掃描所進(jìn)行的工作。
此處所說(shuō)的 “遍”,是指對(duì)源程序或其等價(jià)的中間語(yǔ)言程序從頭到尾掃描一遍,并完成規(guī)定加工處理工作的過(guò)程。例如,可以將前述 5 個(gè)階段的工作結(jié)合在一起,對(duì)源程序從頭到尾掃描一遍來(lái)完成編譯的各項(xiàng)工作,這種編譯程序稱為一遍掃描的編譯程序。對(duì)于某些程序設(shè)計(jì)語(yǔ)言,用一遍掃描的編譯程序去實(shí)現(xiàn)比較困難,可采用多遍掃描的編譯程序結(jié)構(gòu),每遍可完成上述某個(gè)階段的一部分、全部或多個(gè)階段的工作,且每一遍的工作是從前一遍獲得的工作結(jié)果開(kāi)始的,最后一遍的工作結(jié)果是目標(biāo)語(yǔ)言程序,第一遍的輸入則是用戶書(shū)寫(xiě)的源程序。
多遍掃描的編譯程序較一遍掃描的編譯程序少占存儲(chǔ)空間,遍數(shù)多一些,可使各遍所要完成的功能獨(dú)立而單純,其編譯程序邏輯結(jié)構(gòu)清晰,但遍數(shù)多勢(shì)必增加輸入輸出開(kāi)銷,這將降低編譯效率。一個(gè)編譯程序究竟應(yīng)分成幾遍和它所面臨的源語(yǔ)言的特征、機(jī)器規(guī)模、設(shè)計(jì)的目標(biāo)等因素有關(guān),很難統(tǒng)一劃定。一般在主存可能的前提下,還是遍數(shù)少一點(diǎn)為好。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-491604.html
參考資料
《編譯原理(第4版)》1.2 編譯過(guò)程和編譯程序的基本結(jié)構(gòu)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-491604.html
到了這里,關(guān)于編譯程序的任務(wù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!