編譯方式
? ? ? ? 編譯程序的功能就是把高級語言書寫的源程序翻譯成與之等價(jià)的目標(biāo)程序(匯編語言或機(jī)器語言)。
編譯程序的工作過程
詞法分析
? ? ? ? 在詞法分析階段,源程序可以簡單的看做是一個(gè)多行的字符串。詞法分析階段是編譯過程的第一階段,主要任務(wù)是對源程序從前到后(從左到右)逐個(gè)字符進(jìn)行掃描,從中識別出一個(gè)個(gè)“單詞”符號。詞法分析程序輸出的”單詞“常采用二元組的方式,即單詞類別和單詞自身的值。詞法分析過程依據(jù)的語言的此法規(guī)則,即描述“單詞”結(jié)構(gòu)的規(guī)則。
? ? 詞法分析器一般來說有兩種方法構(gòu)造:手工構(gòu)造和自動(dòng)生成。手工構(gòu)造可使用狀態(tài)圖進(jìn)行工作,自動(dòng)生成使用確定的有限自動(dòng)機(jī)來實(shí)現(xiàn)。
? ? 詞法分析器的功能輸入源程序,按照構(gòu)詞規(guī)則分解成一系列單詞符號。單詞是語言中具有獨(dú)立意義的最小單位,包括:
? ? ? ?(1)關(guān)鍵字 是由程序語言定義的具有固定意義的標(biāo)識符。
? ? ? ?(2)標(biāo)識符 用來表示各種名字,如變量名,數(shù)組名,過程名等等。
? ? ? ?(3)常數(shù)? 常數(shù)的類型一般有整型、實(shí)型、布爾型、文字型等。
? ? ? ?(4)運(yùn)算符 如+、-、*、/等等。
? ? ? ?(5)界符? 如逗號、分號、括號、等等。
語法分析
? ? ? ? 編譯程序的語法分析器以單詞符號作為輸入,分析單詞符號串是否形成符合語法規(guī)則的語法單位,如表達(dá)式、賦值、循環(huán)等,最后看是否構(gòu)成一個(gè)符合各類語法的構(gòu)成規(guī)則,按該語言使用的語法規(guī)則分析檢查每條語句是否有正確的邏輯結(jié)構(gòu),程序是最終的一個(gè)語法單位。
? ? 語法分析的方法分為兩種:自上而下分析法和自下而上分析法。自上而下就是從文法的開始符號出發(fā),向下推導(dǎo),推出句子。而自下而上分析法采用的是移進(jìn)歸約法,基本思想是:用一個(gè)寄存符號的先進(jìn)后
出棧,把輸入符號一個(gè)一個(gè)地移進(jìn)棧里,當(dāng)棧頂形成某個(gè)產(chǎn)生式的一個(gè)候選式時(shí),即把棧頂?shù)倪@一部分歸約成該產(chǎn)生式的左鄰符號。
? ? 語法分析只考慮構(gòu)成該句子的語法單位是否符合語法規(guī)則。例如在分析除法表達(dá)式時(shí)在語法分析階段只分析運(yùn)算符左右兩邊是否為變量、常量、表達(dá)式等,而不去管除數(shù)是否為 0 。
語義分析
? ? ? ? 語義分析階段主要是檢查源程序是否存在語義錯(cuò)誤,并收集類型信息供后面的代碼生成階段使用,只有語法和語義都正確的源程序才能翻譯成正確的目標(biāo)代碼。語義分析的主要工作是進(jìn)行各類型分析和檢查。
? ? ?比如語義分析的一個(gè)工作是進(jìn)行類型審查,審查每個(gè)算符是否具有語言規(guī)范允許的運(yùn)算對象,當(dāng)不符合語言規(guī)范時(shí),編譯程序應(yīng)報(bào)告錯(cuò)誤。如有的編譯程序要對實(shí)數(shù)用作數(shù)組下標(biāo)的情況報(bào)告錯(cuò)誤。再如分析除法表達(dá)式時(shí)在語義分析階段就要分析該表達(dá)式的除數(shù)是否為零等。
? ? ?在高級程序設(shè)計(jì)語言翻譯中,語義分析階段的工作不與目標(biāo)機(jī)器的體系結(jié)構(gòu)密切相關(guān),而目標(biāo)代碼生成階段的工作與目標(biāo)機(jī)器的體系結(jié)構(gòu)密切相關(guān)。
中間代碼生成
? ? ? ? 中間代碼生成階段的工作是根據(jù)語義分析的輸出生成中間代碼。中間代碼是一種簡單且含義明確的記號系統(tǒng),可以有若干種形式,常見的有 逆波蘭記號、四元式、三元式和樹 。他們的共同特征是代碼的方式與具體的機(jī)器無關(guān)。中間語言的復(fù)雜性介于源程序語言和機(jī)器語言之間。中間代碼實(shí)際上起一個(gè)編譯器前段與后端分水嶺的作用,目的是 便于編譯器的開發(fā)和移植和代碼的優(yōu)化。它既與機(jī)器指令的結(jié)構(gòu)相近,又與具體的機(jī)器無關(guān) 。 并不是所有的編譯程序都生成中間代碼,一般快速編譯程序直接生成目標(biāo)代碼,沒有將中間代碼翻譯成目標(biāo)代碼的額外開銷 。
?
代碼優(yōu)化
? ? ? ? 代碼優(yōu)化是指對程序進(jìn)行多種等價(jià)變換,使得從變換后的程序出發(fā),能生成更有效的目標(biāo)代碼。所謂等價(jià),是指不改變程序的運(yùn)行結(jié)果。所謂有效,主要指目標(biāo)代碼運(yùn)行時(shí)間較短,以及占用的存儲空間較小。這種變換稱為優(yōu)化。
? ? ?兩類優(yōu)化:一類是對語法分析后的中間代碼進(jìn)行優(yōu)化,它不依賴于具體的計(jì)算機(jī);另一類是在生成目標(biāo)代碼時(shí)進(jìn)行的,它在很大程度上依賴于具體的計(jì)算機(jī)。對于前一類優(yōu)化,根據(jù)它所涉及的程序范圍可分為 局部優(yōu)化 、 循環(huán)優(yōu)化 和 全局優(yōu)化 三個(gè)不同的級別。
?
目標(biāo)代碼生成
? ? ? ? 目標(biāo)代碼生成是編譯的最后一個(gè)階段。目標(biāo)代碼生成器把語法分析后或優(yōu)化后的中間代碼變換成目標(biāo)代碼。 目標(biāo)代碼生成階段的工作與目標(biāo)機(jī)器的體系結(jié)構(gòu)密切相關(guān)。 目標(biāo)代碼有三種形式:
? ? ? ? ?① 可以立即執(zhí)行的機(jī)器語言代碼,所有地址都重定位;
? ? ? ? ?② 待裝配的機(jī)器語言模塊,當(dāng)需要執(zhí)行時(shí),由連接裝入程序把它們和某些運(yùn)行程序連接起來,轉(zhuǎn)換成能執(zhí)行的機(jī)器語言代碼;
? ? ? ? ?③ 匯編語言代碼,須經(jīng)過匯編程序匯編后,成為可執(zhí)行的機(jī)器語言代碼。
? ? 目標(biāo)代碼生成階段應(yīng)考慮直接影響到目標(biāo)代碼速度的三個(gè)問題:一是如何生成較短的目標(biāo)代碼;二是如何充分利用計(jì)算機(jī)中的寄存器,減少目標(biāo)代碼訪問存儲單元的次數(shù);三是如何充分利用計(jì)算機(jī)指令系統(tǒng)的特點(diǎn),以提高目標(biāo)代碼的質(zhì)量。
?
出錯(cuò)處理
???????? ? ? 用戶編寫的源程序不可避免的會(huì)有一些錯(cuò)誤,這些錯(cuò)誤大致可以分為 靜態(tài)錯(cuò)誤 和 動(dòng)態(tài)錯(cuò)誤 。動(dòng)態(tài)錯(cuò)誤也稱動(dòng)態(tài)語義錯(cuò)誤,它們發(fā)生在程序運(yùn)行時(shí),例如除數(shù)為 0 、引用數(shù)組元素下標(biāo)錯(cuò)誤等。靜態(tài)錯(cuò)誤是之編譯階段發(fā)現(xiàn)的程序錯(cuò)誤,可分為語法錯(cuò)誤和靜態(tài)語義錯(cuò)誤,如單詞拼寫錯(cuò)誤、標(biāo)點(diǎn)符號錯(cuò)誤、表達(dá)式缺少操作數(shù)、括號不匹配等有關(guān)語言結(jié)構(gòu)上的錯(cuò)誤稱為語法錯(cuò)誤,而語義分析時(shí)發(fā)現(xiàn)的運(yùn)算符與運(yùn)算對象不合法等錯(cuò)誤屬于靜態(tài)語義錯(cuò)誤。 語義分析階段主要檢查源程序是否包含靜態(tài)語義錯(cuò)誤,而一般的編譯器很難檢查出動(dòng)態(tài)語義錯(cuò)誤 。
?
解釋方式
? ? ? ? 解釋程序是另一種語言處理程序,在詞法、語法和語義分析方面與編譯程序的工作原理基本相同,但在運(yùn)行時(shí)直接執(zhí)行源程序或源程序的內(nèi)部形式,即解釋程序不產(chǎn)生源程序的目標(biāo)程序,這點(diǎn)是它與編譯程序的主要區(qū)別。
? ? ?解釋程序通常可以分為兩部分:
? ? ? ? 第一部分是分析部分,包括通常的詞法分析、語法分析和語義分析程序,經(jīng)語義分析后把源程序翻譯成中間代碼,中間代碼常用逆波蘭式表示。
? ? ? ? 第二部分是解釋部分,用來對第一部分產(chǎn)生的中間代碼進(jìn)行解釋執(zhí)行。
解釋程序?qū)崿F(xiàn)高級語言的三種方式
?
編譯與解釋的區(qū)別
? ? ? ? ? 編譯和解釋是語言處理的兩種基本方式。編譯過程包括詞法分析、語法分析、語義分析、中間代碼生成、代碼優(yōu)化和目標(biāo)代碼生成等階段,以及符號表管理和出錯(cuò)處理模塊。解釋過程在詞法、語法和語義分析方面與編譯程序的工作原理基本相同,但是在運(yùn)行用戶程序時(shí),它直接執(zhí)行源程序或源程序的內(nèi)部形式。
? ? ?這兩種語言處理程序的根本區(qū)別是:在編譯方式下,機(jī)器上運(yùn)行的是與源程序等價(jià)的目標(biāo)程序,源程序和編譯程序都不再參與目標(biāo)程序的執(zhí)行過程;而在解釋方式下,解釋程序和源程序(或其某種等價(jià)表示)要參與到程序的運(yùn)行過程中,運(yùn)行程序的控制權(quán)在解釋程序。解釋器翻譯源程序時(shí)不產(chǎn)生獨(dú)立的目標(biāo)程序,而編譯器則需將源程序翻譯成獨(dú)立的目標(biāo)程序。
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
