版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
ch編譯原理引論ch編譯原理引論ch編譯原理引論為什么要學(xué)習(xí)編譯原理必修主干課程,操作系統(tǒng)和編譯系統(tǒng)構(gòu)成程序設(shè)計(jì)者與計(jì)算機(jī)之間的根本界面。通過(guò)學(xué)習(xí)該課程,掌握編譯的根本理論、常用的編譯技術(shù),了解編譯過(guò)程及編譯系統(tǒng)構(gòu)造和機(jī)理。能運(yùn)用所學(xué)技術(shù)解決實(shí)際問(wèn)題,能獨(dú)立編寫一個(gè)小型編譯系統(tǒng)。此外,通過(guò)學(xué)習(xí)編譯原理可以更好地理解程序語(yǔ)言的內(nèi)部機(jī)制,從而更好地理解和運(yùn)用程序設(shè)計(jì)語(yǔ)言。能運(yùn)用編譯程序構(gòu)造的原理和技術(shù)完成相關(guān)軟件工具的設(shè)計(jì)和開(kāi)發(fā)工作。ch編譯原理引論ch編譯原理引論ch編譯原理引論為什么要學(xué)習(xí)1為什么要學(xué)習(xí)編譯原理必修主干課程,操作系統(tǒng)和編譯系統(tǒng)構(gòu)成程序設(shè)計(jì)者與計(jì)算機(jī)之間的根本界面。通過(guò)學(xué)習(xí)該課程,掌握編譯的根本理論、常用的編譯技術(shù),了解編譯過(guò)程及編譯系統(tǒng)構(gòu)造和機(jī)理。能運(yùn)用所學(xué)技術(shù)解決實(shí)際問(wèn)題,能獨(dú)立編寫一個(gè)小型編譯系統(tǒng)。此外,通過(guò)學(xué)習(xí)編譯原理可以更好地理解程序語(yǔ)言的內(nèi)部機(jī)制,從而更好地理解和運(yùn)用程序設(shè)計(jì)語(yǔ)言。能運(yùn)用編譯程序構(gòu)造的原理和技術(shù)完成相關(guān)軟件工具的設(shè)計(jì)和開(kāi)發(fā)工作。為什么要學(xué)習(xí)編譯原理必修主干課程,操作系統(tǒng)和編譯系統(tǒng)構(gòu)成程序2課程內(nèi)容介紹編譯器構(gòu)造的一般原理和根本實(shí)現(xiàn)方法介紹的理論知識(shí):形式語(yǔ)言和自動(dòng)機(jī)理論、語(yǔ)法制導(dǎo)的定義和屬性文法、類型論等強(qiáng)調(diào)形式描述技術(shù)和自動(dòng)生成技術(shù)課程簡(jiǎn)介先行課程高等數(shù)學(xué)、C、離散數(shù)學(xué)、匯編語(yǔ)言、數(shù)據(jù)構(gòu)造課程內(nèi)容課程簡(jiǎn)介先行課程3參考資料國(guó)外編譯原理領(lǐng)域內(nèi)的3本權(quán)威書籍:當(dāng)代編譯技術(shù)三大圣經(jīng)!1、龍書〔Dragonbook〕參考資料國(guó)外編譯原理領(lǐng)域內(nèi)的3本權(quán)威書籍:當(dāng)代編譯技術(shù)三大42、鯨書〔Whalebook〕
2、鯨書〔Whalebook〕
53、虎書〔Tigerbook〕3、虎書〔Tigerbook〕6國(guó)內(nèi)編譯原理領(lǐng)域內(nèi)的權(quán)威書籍:1.陳意云?編譯原理?高等教育出版社ch編譯原理引論課件72.呂映芝?編譯原理?清華大學(xué)教育出版社;ch編譯原理引論課件83.陳英?編譯原理?清華工大學(xué)出版社3.陳英?編譯原理?清華工大學(xué)出版社94.蔣宗禮?編譯原理?高等教育出版社ch編譯原理引論課件105.劉磊?編譯原理及實(shí)現(xiàn)?機(jī)械工業(yè)出版社ch編譯原理引論課件11要求及學(xué)習(xí)方法課程特點(diǎn):理論性強(qiáng),算法復(fù)雜平時(shí)〔20%〕無(wú)故曠課:-5一本教材,認(rèn)真聽(tīng)課:以講義為主,做適當(dāng)?shù)墓P記認(rèn)真完成課堂和課后作業(yè)期末〔80%〕:閉卷筆試要求及學(xué)習(xí)方法課程特點(diǎn):理論性強(qiáng),算法復(fù)雜12第一章編譯概述掌握編譯程序中所涉及的有關(guān)名詞術(shù)語(yǔ)2.理解編譯程序總的框架,明確編譯程序工作的根本過(guò)程及各階段的根本任務(wù)教學(xué)目標(biāo)第一章編譯概述掌握編譯程序中所涉及的有關(guān)名詞術(shù)語(yǔ)教學(xué)目131.2.編譯的過(guò)程1.3.編譯程序的邏輯構(gòu)造1.4.編譯程序的生成1.5.編譯技術(shù)的應(yīng)用及開(kāi)展教學(xué)內(nèi)容教學(xué)內(nèi)容14
程序的翻譯語(yǔ)言和翻譯:語(yǔ)言是人類交流思想和信息的工具。如自然語(yǔ)言,世界上存在著許多種語(yǔ)言,各國(guó)之間要交流信息,就要有各種語(yǔ)言之間的翻譯。計(jì)算機(jī)語(yǔ)言同樣是豐富多彩的。程序的翻譯語(yǔ)言和翻譯:語(yǔ)言是人類交流思想和信息的工具。如1512/9/2022第16頁(yè)機(jī)器語(yǔ)言(machinelanguage)C70600000002匯編語(yǔ)言(assemblerlanguage)
MOVX,2高級(jí)語(yǔ)言(high-levellanguage)
X=2為什么要使用編譯程序?12/9/2022第16頁(yè)機(jī)器語(yǔ)言(machinelan16程序語(yǔ)言的分類低級(jí)語(yǔ)言〔LowlevelLanguage)機(jī)器語(yǔ)言、匯編語(yǔ)言特點(diǎn):與特定的機(jī)器有關(guān),成效高,但使用復(fù)雜、繁瑣、費(fèi)時(shí)、易出錯(cuò)。高級(jí)語(yǔ)言--Fortran、Pascal、C語(yǔ)言等特點(diǎn):不依賴具體機(jī)器,移植性好、對(duì)用戶要求低、易使用、易維護(hù)等。程序語(yǔ)言的分類低級(jí)語(yǔ)言〔LowlevelLanguage17計(jì)算機(jī)硬件只懂自己的指令系統(tǒng),那么它是如何識(shí)別除機(jī)器語(yǔ)言以外的另一種語(yǔ)言呢??解決這一問(wèn)題的方法:翻譯程序!!計(jì)算機(jī)硬件只懂自己的指令系統(tǒng),那么它是如何識(shí)別除機(jī)器語(yǔ)言以外18翻譯程序翻譯程序:能夠把某一種語(yǔ)言程序〔稱為源語(yǔ)言程序〕轉(zhuǎn)換成另一種語(yǔ)言程序〔稱為目標(biāo)語(yǔ)言程序〕的一個(gè)程序,而后者與前者在邏輯上是等價(jià)的。程序翻譯的方式通常有兩種,一種是編譯方式,另一種是解釋方式。源程序翻譯程序目標(biāo)程序翻譯程序翻譯程序:能夠把某一種語(yǔ)言程序〔稱為源語(yǔ)言程序〕轉(zhuǎn)換19編譯程序編譯程序:如果一個(gè)翻譯程序的源語(yǔ)言是某種高級(jí)語(yǔ)言,其目標(biāo)語(yǔ)言是相對(duì)于某一計(jì)算機(jī)的匯編語(yǔ)言或機(jī)器語(yǔ)言,那么稱這種翻譯程序?yàn)榫幾g程序〔或稱為編譯器〕。假設(shè)編譯生成的目標(biāo)程序不是機(jī)器代碼,而是匯編語(yǔ)言程序,那么還要增加一個(gè)會(huì)變程序?qū)⑵鋾?huì)變?yōu)闄C(jī)器代碼。源程序(高級(jí)語(yǔ)言編寫)編譯程序目標(biāo)程序(機(jī)器語(yǔ)言或匯編語(yǔ)言編寫)編譯程序編譯程序:如果一個(gè)翻譯程序的源語(yǔ)言是某種高級(jí)語(yǔ)言,其20匯編程序如果一個(gè)翻譯程序的源語(yǔ)言是某種匯編語(yǔ)言,其目標(biāo)語(yǔ)言是某一計(jì)算機(jī)的機(jī)器語(yǔ)言,那么稱這種翻譯程序?yàn)閰R編程序。源程序(匯編語(yǔ)言編寫)匯編程序目標(biāo)程序(機(jī)器語(yǔ)言編寫)匯編程序如果一個(gè)翻譯程序的源語(yǔ)言是某種匯編語(yǔ)言,其目標(biāo)語(yǔ)言是21解釋程序解釋程序:是一種語(yǔ)言處理程序,它以源程序作為輸入,但不產(chǎn)生目標(biāo)代碼,它將源程序中的語(yǔ)句按動(dòng)態(tài)順序,逐句翻譯成課執(zhí)行代碼,一旦具備執(zhí)行條件,那么立即執(zhí)行這一階段代碼得到局部結(jié)果。源程序(高級(jí)語(yǔ)言編寫)解釋程序計(jì)算結(jié)果特點(diǎn):與編譯系統(tǒng)比較,解釋系統(tǒng)較簡(jiǎn)單、可移植性好,易于查錯(cuò),但速度慢解釋程序解釋程序:是一種語(yǔ)言處理程序,它以源程序作為輸入,22編譯和解釋程序編譯程序的工作相當(dāng)于載翻譯一本原著,計(jì)算機(jī)運(yùn)行編譯后的目標(biāo)程序,相當(dāng)于閱讀一本譯著;而解釋程序的工作相當(dāng)于在進(jìn)展同聲翻譯,計(jì)算機(jī)運(yùn)行解釋程序,相當(dāng)于我們直接通過(guò)翻譯聽(tīng)外賓講話。編譯和解釋程序23程序的編譯執(zhí)行:輸入數(shù)據(jù)源程序編譯程序運(yùn)行系統(tǒng)目標(biāo)程序輸入數(shù)據(jù)源程序編譯程序運(yùn)行系統(tǒng)目標(biāo)程序24程序的解釋執(zhí)行:如:BASIC、Prolog,問(wèn)題:效率低下解釋程序源程序輸入數(shù)據(jù)計(jì)算結(jié)果為什么解釋運(yùn)行的工作效率低于編譯方式??程序的解釋執(zhí)行:解釋程序源程序輸入數(shù)據(jù)計(jì)算結(jié)果為什么解釋運(yùn)行25編譯程序與解釋程序的差異根本區(qū)別:是否生成目標(biāo)代碼!功能工作結(jié)果實(shí)現(xiàn)技術(shù)上解釋程序源程序的一個(gè)執(zhí)行系統(tǒng)源程序的執(zhí)行結(jié)果執(zhí)行中間代碼編譯程序源程序的一個(gè)轉(zhuǎn)換系統(tǒng)源程序的目標(biāo)代碼把中間代碼轉(zhuǎn)換成目標(biāo)程序編譯程序與解釋程序的差異根本區(qū)別:是否生成目標(biāo)代碼!功能工作26“編譯+解釋執(zhí)行〞系統(tǒng)源程序編譯程序源程序的中間形式輸出數(shù)據(jù)解釋程序輸入數(shù)據(jù)“編譯+解釋執(zhí)行〞系統(tǒng)源程序編譯程序源程序的中間形式輸出數(shù)據(jù)27例如Java語(yǔ)言.java
java源程序文件.class二進(jìn)制字節(jié)碼文件Java虛擬機(jī)(JVM)本地計(jì)算機(jī)系統(tǒng)編譯例如Java語(yǔ)言.javajava源程序文件.cl28編譯程序在計(jì)算機(jī)系統(tǒng)中的位置編譯程序是一種軟件,是系統(tǒng)軟件。通常認(rèn)為系統(tǒng)軟件是居于計(jì)算機(jī)系統(tǒng)中最靠近硬件的一層,其他軟件一般都通過(guò)系統(tǒng)軟件發(fā)揮作用。編譯程序在計(jì)算機(jī)系統(tǒng)中的位置編譯程序是一種軟件,是系統(tǒng)軟件。29翻譯程序所處的層次高級(jí)語(yǔ)言語(yǔ)言處理程序操作系統(tǒng)匯編語(yǔ)言計(jì)算機(jī)硬件C編譯程序C語(yǔ)言Basic解釋程序Basic語(yǔ)言Fortran編譯程序Fortran語(yǔ)言............翻譯程序所處的層次高語(yǔ)言處理程序操作系統(tǒng)計(jì)算機(jī)硬件CCBas30幾個(gè)概念宿主機(jī):運(yùn)行編譯程序的計(jì)算機(jī)目標(biāo)機(jī):運(yùn)行編譯程序所產(chǎn)生的目標(biāo)代碼的計(jì)算機(jī)穿插編譯程序:一個(gè)編譯程序產(chǎn)生不同于其宿主機(jī)的機(jī)器代碼可變目標(biāo)編譯程序:不需要重寫編譯程序中與機(jī)器無(wú)關(guān)的局部就能改變目標(biāo)機(jī)幾個(gè)概念宿主機(jī):運(yùn)行編譯程序的計(jì)算機(jī)31對(duì)編譯程序的一些說(shuō)明編譯程序?qū)嵸|(zhì)上是一個(gè)翻譯程序,要注意等價(jià)變換本課程的任務(wù)就是講解在這個(gè)轉(zhuǎn)換過(guò)程中所涉及到的一些理論和方法,最后,使用這些理論和方法,自己編寫一個(gè)小的編譯器轉(zhuǎn)換是一個(gè)總體的功能,要抓住總體構(gòu)造,逐層細(xì)分,寫編譯器時(shí)要表達(dá)軟件工程中軟件設(shè)計(jì)的原那么,自頂向下,逐層分解。編譯器要完成的轉(zhuǎn)換任務(wù)相當(dāng)復(fù)雜,實(shí)現(xiàn)編譯器時(shí)必須分步驟分階段實(shí)現(xiàn)。分階段實(shí)現(xiàn)的好處是能夠簡(jiǎn)化程序的設(shè)計(jì),當(dāng)然也可以不分階段實(shí)現(xiàn)。對(duì)編譯程序的一些說(shuō)明編譯程序?qū)嵸|(zhì)上是一個(gè)翻譯程序,要注意等價(jià)32編譯原理是討論編譯程序設(shè)計(jì)的根本理論、根本概念、根本方法什么是編譯原理編譯原理是討論編譯程序設(shè)計(jì)的根本理論、根本概念3312/9/202234編譯器和集成開(kāi)發(fā)環(huán)境編譯器:即編譯程序,把高級(jí)語(yǔ)言經(jīng)分析翻譯為低級(jí)語(yǔ)言。集成開(kāi)發(fā)環(huán)境:簡(jiǎn)稱IDE〔IntegratedDevelopEnvironment〕,是用于提供程序開(kāi)發(fā)環(huán)境的應(yīng)用程序,一般包括代碼編輯器、編譯器、調(diào)試器和圖形用戶界面工具。背景:早期程序設(shè)計(jì)的各個(gè)階段都要用不同的軟件來(lái)進(jìn)展處理,如先用字處理軟件編輯源程序,再用編譯程序進(jìn)展編譯,然后用鏈接程序進(jìn)展函數(shù)、模塊連接,開(kāi)發(fā)者必須在幾種軟件間來(lái)回切換操作。人們習(xí)慣上經(jīng)常把IDE稱為編譯器。12/9/202234編譯器和集成開(kāi)發(fā)環(huán)境編譯器:即編譯程序34編譯原理引論35常見(jiàn)語(yǔ)言及其IDE語(yǔ)言IDECTC2.0C++C++Builder,VC++6.0,TC3.0C#VS.NETPascalTurboPascalOOPascalDelphiVBVB6.0(解釋器)JavaEclipse,JBuilder編譯原理引論35常見(jiàn)語(yǔ)言及其IDE語(yǔ)言IDECTC2.0C+351.2編譯的過(guò)程1.編譯程序的工作過(guò)程1.2編譯的過(guò)程1.編譯程序的工作過(guò)程36編譯過(guò)程本身是一種語(yǔ)言的翻譯過(guò)程,類似于外文的翻譯。將英文句子“Iwishyousuccess翻譯成中文。兩階段完成翻譯
分析:分析單詞:I,wish,you,success分析語(yǔ)法:主語(yǔ),謂語(yǔ),賓語(yǔ),賓補(bǔ)分析語(yǔ)義:我希望你成功
綜合:綜合英語(yǔ)的意思、上下文環(huán)境和漢語(yǔ)的表達(dá)習(xí)慣,完成翻譯:祝你成功編譯過(guò)程本身是一種語(yǔ)言的翻譯過(guò)程,類似于外文的翻譯。37翻譯外文資料:1、能識(shí)別出句子中的一個(gè)單詞;2、分析句子的語(yǔ)法構(gòu)造;3、根據(jù)句子的含義進(jìn)展初步翻譯;4、對(duì)譯文進(jìn)展修飾;5、寫出最后的譯文。翻譯外文資料:38翻譯外文資料與編譯源程序進(jìn)展類比翻譯外文編譯程序分析識(shí)別單詞分析句子根據(jù)語(yǔ)義進(jìn)行初步翻譯詞法分析語(yǔ)法分析語(yǔ)義分析、生成中間代碼綜合修辭加工寫出譯文代碼優(yōu)化目標(biāo)代碼生成翻譯外文資料與編譯源程序進(jìn)展類比翻譯外文編譯程序識(shí)別單詞詞法39將編譯過(guò)程劃分為5個(gè)根本階段詞法分析語(yǔ)法分析語(yǔ)義分析及中間代碼生成代碼優(yōu)化目標(biāo)代碼生成將編譯過(guò)程劃分為5個(gè)根本階段詞法分析語(yǔ)法分析語(yǔ)義分析及中間代40從概念上來(lái)講,一個(gè)編譯程序的整個(gè)工作過(guò)程是劃分成階段進(jìn)展的,每個(gè)階段將源程序的一種表示形式轉(zhuǎn)換成另一種表示形式,各個(gè)階段進(jìn)展的操作在邏輯上是嚴(yán)密連接在一起的。事實(shí)上,某些階段可能組合在一起,這些階段間的源程序的中間表示形式就沒(méi)必要構(gòu)造出來(lái)了。從概念上來(lái)講,一個(gè)編譯程序的整個(gè)工作過(guò)程是劃分成階段進(jìn)展的,411.2編譯的過(guò)程1.編譯程序的工作過(guò)程1.2編譯的過(guò)程1.編譯程序的工作過(guò)程42(1)詞法分析詞法分析階段是編譯過(guò)程的第一個(gè)階段。這個(gè)階段的任務(wù)是從左到右一個(gè)字符一個(gè)字符地讀入源程序,對(duì)構(gòu)成源程序的字符流進(jìn)展掃描和分解,根據(jù)語(yǔ)言的詞法規(guī)那么識(shí)別出一個(gè)個(gè)具有獨(dú)立意義的最小語(yǔ)法單位,即單詞。(1)詞法分析43根據(jù)詞法規(guī)那么分析和識(shí)別單詞。把需要存放的單詞放到符號(hào)表中,如變量名,標(biāo)號(hào),常量等。工作依據(jù):源語(yǔ)言的構(gòu)詞規(guī)那么(即詞法),也稱為模式(pattern)。標(biāo)識(shí)符的模式是:以字母開(kāi)頭的字母數(shù)字序列。根據(jù)詞法規(guī)那么分析和識(shí)別單詞。44例:sum=(10+20)*(num+square);結(jié)果(標(biāo)識(shí)符,sum)(賦值號(hào),=)(左括號(hào),()(整常數(shù),10)(加號(hào),+)(整常數(shù),20)(右括號(hào),))(乘號(hào),*)(左括號(hào),()(標(biāo)識(shí)符,num)(加號(hào),+)(標(biāo)識(shí)符,square)(右括號(hào),))(分號(hào),;)例:結(jié)果45詞法分析的功能如下:識(shí)別出源程序中意義獨(dú)立的最小詞法單位—單詞。刪除無(wú)用的空格、回車和其他與輸入介質(zhì)有關(guān)的符號(hào)刪除程序員為了提高程序可讀性所加的注釋如果發(fā)現(xiàn)錯(cuò)誤那么報(bào)告出錯(cuò)詞法分析的功能如下:46(2)語(yǔ)法分析根據(jù)語(yǔ)法規(guī)那么〔即語(yǔ)言的文法〕,分析并識(shí)別出各種語(yǔ)法成分〔如表達(dá)式、語(yǔ)句、函數(shù)等〕,并進(jìn)展語(yǔ)法正確性檢查。通常將語(yǔ)法分析的結(jié)果表示為語(yǔ)法樹(shù)。(2)語(yǔ)法分析47sum=(10+20)*(num+square);sum=(10+20)*(num+square);48語(yǔ)法分析的功能是進(jìn)展層次分析,把源程序的單詞序列組成語(yǔ)法短語(yǔ)(表示成語(yǔ)法樹(shù))。依據(jù)的是語(yǔ)法規(guī)那么。C語(yǔ)言的賦值語(yǔ)句的規(guī)那么為:
單詞序列sum=(10+20)*(num+square);之所以能表示成上圖的語(yǔ)法樹(shù),依據(jù)的是賦值語(yǔ)句和表達(dá)式的語(yǔ)法規(guī)那么。
<賦值語(yǔ)句>::=<標(biāo)識(shí)符>“=〞<表達(dá)式><表達(dá)式>::=<表達(dá)式>“+〞<表達(dá)式>|<表達(dá)式>“*〞<表達(dá)式><表達(dá)式>::=“(〞<表達(dá)式>“)〞|<標(biāo)識(shí)符>|<整數(shù)>|<實(shí)數(shù)>語(yǔ)法分析的功能是進(jìn)展層次分析,把源程序的單詞序列組成語(yǔ)法短49(3)語(yǔ)義分析及中間代碼生成語(yǔ)義分析階段的任務(wù)是審查源程序有無(wú)語(yǔ)義錯(cuò)誤。工作依據(jù):源語(yǔ)言的語(yǔ)義規(guī)那么一個(gè)重要任務(wù):類型檢查根據(jù)規(guī)那么檢查每個(gè)運(yùn)算符及其運(yùn)算對(duì)象是否符合要求;數(shù)組的下標(biāo)是否合法;過(guò)程調(diào)用時(shí),形參與實(shí)參個(gè)數(shù)、類型是否匹配等(3)語(yǔ)義分析及中間代碼生成50(3)語(yǔ)義分析及中間代碼生成源程序中有些語(yǔ)法成分,按照語(yǔ)法規(guī)那么去判斷,它是正確的,但它不符合語(yǔ)義規(guī)那么。比方使用了沒(méi)有聲明的變量;或者給一個(gè)過(guò)程名賦值;或者調(diào)用函數(shù)時(shí)參數(shù)類型不適宜或者參加運(yùn)算的兩個(gè)變量類型不匹配等等。比方下邊的程序片段:
intarr[2],c;
c=arr1*10;其中的賦值語(yǔ)句是符合語(yǔ)法規(guī)那么的,但是因?yàn)闆](méi)有聲明變量arr1,而存在語(yǔ)義錯(cuò)。(3)語(yǔ)義分析及中間代碼生成51中間代碼生成(可選〕所謂“中間代碼〞是一種構(gòu)造簡(jiǎn)單、含義明確的記號(hào)系統(tǒng),這種記號(hào)系統(tǒng)可以設(shè)計(jì)為多種多樣的形式,重要的設(shè)計(jì)原那么為兩點(diǎn):一是容易生成;二是容易將它翻譯成目標(biāo)代碼。中間代碼的形式: 四元式、三元式、逆波蘭表示中間代碼生成(可選〕52中間代碼(intermediateCode)例:sum=(10+20)*(num+square);后綴表示(逆波蘭Anti-PolishNotation)sum1020+numsquare+*=前綴表示(波蘭PolishNotation)=sum*+1020+numsquare
四元式表示(三地址碼)(+,10,20,T1)(+,num,square,T2)(*,T1,T2,T3)(=,T3,,sum)
三元式表示(+,10,20)(+,num,square)(*,⑴,⑵)(=,sum,⑶)
語(yǔ)法樹(shù)中間代碼(intermediateCode)后綴表示(逆波53(4)中間代碼優(yōu)化(可選〕代碼優(yōu)化階段的任務(wù)是對(duì)前階段產(chǎn)生的中間代碼進(jìn)展變換或進(jìn)展改造,目的是使生成的目標(biāo)代碼更為高效,即省時(shí)間和省空間。(4)中間代碼優(yōu)化(可選〕54例:sum=(10+20)*(num+square)得到的四元式T1=10+20T2=num+squareT3=T1*T2sum=T3優(yōu)化后T1=num+squareSum=30*T1例:sum=(10+20)*(num+square)得到55這只是優(yōu)化工作的兩個(gè)方面,此外諸如公共子表達(dá)式的刪除、強(qiáng)度削弱、循環(huán)優(yōu)化等優(yōu)化工作將在后面的章節(jié)詳細(xì)介紹。代碼優(yōu)化工作會(huì)降低編譯程序的編譯速度,因此編譯優(yōu)化階段常常作為可選擇階段,編譯程序具有控制機(jī)制以允許用戶在編譯速度和目標(biāo)代碼的質(zhì)量間進(jìn)展權(quán)衡。這只是優(yōu)化工作的兩個(gè)方面,此外諸如公共子表達(dá)式的刪除、強(qiáng)度削56思考:代碼優(yōu)化能提高編譯程序的運(yùn)行效率嗎?思考:代碼優(yōu)化能提高編譯程序的運(yùn)行效率嗎?57(5)目標(biāo)代碼生成目標(biāo)代碼生成階段的任務(wù)是把中間代碼變換成特定機(jī)器上的絕對(duì)指令代碼或可重定位的指令代碼或匯編指令代碼。這是編譯的最后階段,它的工作與硬件系統(tǒng)構(gòu)造和指令含義有關(guān),這個(gè)階段的工作很復(fù)雜,涉及到硬件系統(tǒng)功能部件的運(yùn)用、機(jī)器指令的選擇、各種數(shù)據(jù)類型變量的存儲(chǔ)空間分配以及存放器和后緩存放器的調(diào)度等。涉及到的兩個(gè)重要問(wèn)題:對(duì)程序中使用的每個(gè)變量要指定存儲(chǔ)單元對(duì)變量進(jìn)展存放器分配(5)目標(biāo)代碼生成58例:sum=(10+20)*(num+square)得到的優(yōu)化后四元式T1=num+squareSum=30*T1生成如下指令序列:MOVnum,R1MOVsquare,R2ADDR2,R1MUL30,R1MOVR1,sum例:sum=(10+20)*(num+square)得到59目標(biāo)代碼可采用如下三種形式之一:(1)具有絕對(duì)地址的機(jī)器指令代碼。(2)匯編語(yǔ)言形式的目標(biāo)程序。需要經(jīng)過(guò)匯編程序匯編,以產(chǎn)生機(jī)器代碼。(3)可重定位的指令代碼。多數(shù)編譯程序所產(chǎn)生的目標(biāo)代碼都是這種類型。目標(biāo)代碼可采用如下三種形式之一:60語(yǔ)句sum=(10+20)*(num+square);的翻譯過(guò)程語(yǔ)句sum=(10+20)*(num+square);的翻譯61編譯過(guò)程小結(jié)目標(biāo)代碼生成程序代碼優(yōu)化程序語(yǔ)義分析生成中間代碼語(yǔ)法分析程序詞法分析程序S.PO.P編譯過(guò)程小結(jié)目標(biāo)代碼代碼優(yōu)化語(yǔ)義分析語(yǔ)法分析詞法分析S.PO62上述編譯過(guò)程的階段劃分是一種典型的處理模式,事實(shí)上并非所有的編譯程序都包括這樣幾個(gè)階段。有些編譯程序并不要中間代碼,即不存在中間代碼生成階段;有些編譯程序不進(jìn)展優(yōu)化,優(yōu)化階段即可省去;有些最簡(jiǎn)單的編譯程序只有詞法分析,語(yǔ)法分析;語(yǔ)義分析和目標(biāo)代碼生成。上述編譯過(guò)程的階段劃分是一種典型的處理模式,事實(shí)上并非所有的631.3編譯程序的邏輯構(gòu)造按邏輯功能不同,可將編譯過(guò)程劃分為五個(gè)根本階段,與此相對(duì)應(yīng),我們將實(shí)現(xiàn)整個(gè)編譯過(guò)程的編譯程序劃分為五個(gè)邏輯階段〔即五個(gè)邏輯子過(guò)程〕。每個(gè)階段中都要有:符號(hào)表管理和錯(cuò)誤處理1.3編譯程序的邏輯構(gòu)造按邏輯功能不同,可將編譯過(guò)程64典型的編譯程序具有7個(gè)邏輯局部語(yǔ)義分析及生成中間代碼程序代碼生成程序代碼優(yōu)化程序語(yǔ)法分析程序詞法分析程序錯(cuò)誤處理符號(hào)表管理典型的編譯程序具有7個(gè)邏輯局部語(yǔ)義分析及生成中間代碼程序代碼65<1>詞法分析:識(shí)別單詞,至少分以下幾大類:關(guān)鍵字〔保存字〕、標(biāo)識(shí)符、字面量、特殊符號(hào);<2>語(yǔ)法分析:得到語(yǔ)言構(gòu)造并以樹(shù)的形式表示<3>語(yǔ)義分析:考察構(gòu)造正確的句子是否語(yǔ)義合法,可修改樹(shù)構(gòu)造;<4>中間代碼生成〔可選〕:生成一種既接近目標(biāo)語(yǔ)言,又與具體機(jī)器無(wú)關(guān)的表示,便于優(yōu)化與代碼生成;〔到目前為止,編譯器與解釋器可以一致〕<1>詞法分析:識(shí)別單詞,至少分以下幾大類:關(guān)鍵字〔保存字66<5>中間代碼優(yōu)化〔可選〕:局部?jī)?yōu)化、循環(huán)優(yōu)化、全局優(yōu)化等;優(yōu)化實(shí)際上是一個(gè)等價(jià)變換,變換前后的指令序列完成同樣的功能,但是,在占用的空間上和程序執(zhí)行的時(shí)間上都更省、更有效。<6>目標(biāo)代碼生成:不同形式的目標(biāo)代碼-匯編、可重定位、絕對(duì)機(jī)器指令;<7>符號(hào)表管理:合理組織符號(hào),便于各階段查找、填寫等;<8>出錯(cuò)處理:錯(cuò)誤的種類-詞法錯(cuò)、語(yǔ)法錯(cuò)、靜態(tài)語(yǔ)義錯(cuò)、動(dòng)態(tài)語(yǔ)義錯(cuò)。<5>中間代碼優(yōu)化〔可選〕:局部?jī)?yōu)化、循環(huán)優(yōu)化、全局優(yōu)化67符號(hào)表管理編譯程序的一項(xiàng)重要工作:記錄源程序中使用的標(biāo)識(shí)符收集每個(gè)標(biāo)識(shí)符的各種屬性信息符號(hào)表是由假設(shè)干記錄組成的數(shù)據(jù)構(gòu)造每個(gè)標(biāo)識(shí)符在表中有一條記錄記錄的域是標(biāo)識(shí)符的屬性對(duì)符號(hào)表構(gòu)造的要求:應(yīng)允許快速地找到標(biāo)識(shí)符的記錄可在其中存取數(shù)據(jù)標(biāo)識(shí)符的各種屬性是在編譯的各個(gè)不同階段填入符號(hào)表的。符號(hào)表管理編譯程序的一項(xiàng)重要工作:68聲明語(yǔ)句:floattotal,rate;詞法分析器:float是關(guān)鍵字total、rate是標(biāo)識(shí)符在符號(hào)表中創(chuàng)立這兩個(gè)標(biāo)識(shí)符的記錄語(yǔ)義分析器:total、rate都表示變量float表示這兩個(gè)變量的類型可以把這兩種屬性及存儲(chǔ)分配信息填入符號(hào)表。在語(yǔ)義分析和生成中間代碼時(shí),還要在符號(hào)表中填入對(duì)這個(gè)float型變量進(jìn)展存儲(chǔ)分配的信息。聲明語(yǔ)句:floattotal,rate;詞法分析器:69錯(cuò)誤處理在編譯的每個(gè)階段都可能檢測(cè)到源程序中存在的錯(cuò)誤詞法分析程序可以檢測(cè)出非法字符錯(cuò)誤。語(yǔ)法分析程序能夠發(fā)現(xiàn)記號(hào)流不符合語(yǔ)法規(guī)那么的錯(cuò)誤。語(yǔ)義分析程序試圖檢測(cè)出具有正確的語(yǔ)法構(gòu)造,但對(duì)所涉及的操作無(wú)意義的構(gòu)造。代碼生成程序可能發(fā)現(xiàn)目標(biāo)程序區(qū)超出了允許范圍的錯(cuò)誤。處理與恢復(fù)判斷位置和性質(zhì)適當(dāng)?shù)幕謴?fù)出錯(cuò)處理能力的優(yōu)劣是衡量編譯程序質(zhì)量好壞的一個(gè)重要指標(biāo)。錯(cuò)誤處理在編譯的每個(gè)階段都可能檢測(cè)到源程序中存在的錯(cuò)誤70編譯有關(guān)的其他概念“遍〞前端和后端編譯有關(guān)的其他概念“遍〞71編譯器掃描的遍數(shù)遍〔趟〕:是對(duì)源程序或源程序的中間結(jié)果從頭到尾掃描一遍,并作有關(guān)加工處理,生成新的中間結(jié)果或目標(biāo)程序。例如:詞法分析器對(duì)輸入源程序進(jìn)展第一遍掃描,語(yǔ)法分析進(jìn)展第二遍掃描但一個(gè)階段對(duì)應(yīng)一遍掃描的工作方式是邏輯上的,由于屢次掃描的方式需要大量的存儲(chǔ)空間存放中間表示,并且會(huì)增加一些不必要的輸入輸出操作,因此編譯器往往把假設(shè)干個(gè)階段的工作結(jié)合起來(lái),對(duì)應(yīng)一遍掃描,從而減少對(duì)程序的掃描遍數(shù)。編譯器掃描的遍數(shù)遍〔趟〕:是對(duì)源程序或源程序的中間結(jié)果從頭到72一個(gè)編譯程序應(yīng)分成幾遍,如何劃分,是與源程序、設(shè)計(jì)要求、硬件設(shè)備等諸因素有關(guān)的,因地難于統(tǒng)一劃定。在主存可能的前提下,一般遍數(shù)盡可能少一點(diǎn)為好。但并不是每種語(yǔ)言都可以用單遍編譯程序?qū)崿F(xiàn)。一個(gè)編譯程序應(yīng)分成幾遍,如何劃分,是與源程序、設(shè)計(jì)要求、硬件73一遍掃描的編譯程序語(yǔ)法分析器取記號(hào)詞法分析器源程序記號(hào)語(yǔ)法成分語(yǔ)義分析及代碼生成目標(biāo)程序返回控制流信息流開(kāi)場(chǎng)完畢整理目標(biāo)程序一遍掃描的編譯程序語(yǔ)法分析器取記號(hào)詞法分析器源程序記號(hào)語(yǔ)法成74多遍編譯程序多遍編譯程序75編譯階段的組合在前面所討論的編譯過(guò)程中階段的劃分是編譯程序的邏輯組織。有時(shí),常常把編譯的過(guò)程分為前端(frontend)和后端(backend),前端的工作主要依賴于源語(yǔ)言而與目標(biāo)機(jī)無(wú)關(guān),后端工作依賴于目標(biāo)機(jī)而一般不依賴源語(yǔ)言。編譯階段的組合在前面所討論的編譯過(guò)程中階段的劃分是編譯程序的76根據(jù)編譯程序各局部功能,將編譯程序分成前端和后端前端:通常將與源程序有關(guān)的編譯局部稱為前端。 詞法分析、語(yǔ)法分析、語(yǔ)義分析、中間代碼生成 ---分析局部特點(diǎn):與源語(yǔ)言有關(guān)后端:與目標(biāo)機(jī)有關(guān)的局部稱為后端。代碼優(yōu)化、代碼生成---綜合局部特點(diǎn):與目標(biāo)機(jī)有關(guān)編譯程序的前端和后端根據(jù)編譯程序各局部功能,將編譯程序分成前端和后端前端:通77編譯階段的組合編譯階段的組合78為什么生成中間代碼為什么生成中間代碼79.javajava源程序文件.class二進(jìn)制字節(jié)碼文件Java虛擬機(jī)(JVM)本地計(jì)算機(jī)系統(tǒng)編譯同一前端+不同后端不同機(jī)器構(gòu)成同一語(yǔ)言的編譯程序例如Java語(yǔ)言.javajava源程序文件.class二進(jìn)制80
不同前端+同一后端同一機(jī)器生成幾個(gè)語(yǔ)言的編譯程序例如GCC編譯程序集合不同前端+同一后端同一機(jī)器生成幾個(gè)語(yǔ)言的編譯程序例81編譯程序中的主要數(shù)據(jù)構(gòu)造(續(xù))Token表符號(hào)表常數(shù)表錯(cuò)誤信息語(yǔ)法樹(shù)中間代碼表臨時(shí)文件目標(biāo)代碼表編譯程序中的主要數(shù)據(jù)構(gòu)造(續(xù))Token表語(yǔ)法樹(shù)中間代碼表8212/9/2022第83頁(yè)1.4編譯程序的設(shè)計(jì)構(gòu)造編譯程序要掌握以下幾方面的內(nèi)容:源語(yǔ)言:理解其構(gòu)造和含義目標(biāo)語(yǔ)言:必須清楚硬件的系統(tǒng)構(gòu)造和指令的格式等編譯方法12/9/2022第83頁(yè)1.4編譯程序的設(shè)計(jì)構(gòu)造編譯程序8312/9/2022第84頁(yè)1.4編譯程序的設(shè)計(jì)一般實(shí)現(xiàn)編譯程序的方法有:注:編譯程序核心局部常用匯編語(yǔ)言編寫注:這是普遍采用的方法5.用編譯工具自動(dòng)生成:LEX(詞法分析)與YACC(用于自動(dòng)產(chǎn)生LALR分析表)6.移植〔同種語(yǔ)言的編譯程序在不同類型的機(jī)器之間移植〕12/9/2022第84頁(yè)1.4編譯程序的設(shè)計(jì)一般實(shí)現(xiàn)編譯841.4編譯程序的生成早期人們用匯編語(yǔ)言編寫編譯程序,但其效率低,實(shí)現(xiàn)困難,比方FORTRAN語(yǔ)言編譯器18年才完成。專門的編譯編譯工具,可以支持編譯程序某些局部的自動(dòng)生成。比方:LEX和YACC等。1.4編譯程序的生成早期人們用匯編語(yǔ)言編寫編譯程序,但其85說(shuō)到一個(gè)編譯程序,一定要知道它的源語(yǔ)言是什麼,目標(biāo)語(yǔ)言是什麼,還有它的實(shí)現(xiàn)語(yǔ)言是什麼。常使用T型圖來(lái)表示一個(gè)編譯程序所涉及的三個(gè)語(yǔ)言。
S:源語(yǔ)言O(shè):目標(biāo)語(yǔ)言T:編譯程序?qū)崿F(xiàn)語(yǔ)言SOT說(shuō)到一個(gè)編譯程序,一定要知道它的源語(yǔ)言是什麼,目標(biāo)語(yǔ)言是什86開(kāi)發(fā)編譯程序的途徑:自展法工具法自動(dòng)生成法移植法開(kāi)發(fā)編譯程序的途徑:87自展法自展法88利用A機(jī)器上已有的用A代碼編寫的L1語(yǔ)言的編譯程序,把用L1語(yǔ)言編寫的L2語(yǔ)言的編譯程序進(jìn)展編譯,得到A機(jī)器代碼實(shí)現(xiàn)的L2語(yǔ)言的編譯程序。表示為:L2語(yǔ)言A代碼L1語(yǔ)言L1語(yǔ)言A代碼A代碼L2語(yǔ)言A代碼A代碼利用A機(jī)器上已有的用A代碼編寫的L1語(yǔ)言的編譯程序,把用L189或者表示為:L2語(yǔ)言A代碼L1語(yǔ)言L1語(yǔ)言A代碼A代碼L2語(yǔ)言A代碼A代碼或者表示為:L2語(yǔ)言A代碼L1語(yǔ)言L1語(yǔ)言A代碼A代碼L2語(yǔ)90問(wèn)題一:如何直接在一個(gè)機(jī)器上實(shí)現(xiàn)C語(yǔ)言編譯器?解決:用匯編語(yǔ)言實(shí)現(xiàn)一個(gè)C子集的編譯程序(P0—人)用匯編程序處理該程序,得到(P2:可直接運(yùn)行)用C子集編制C語(yǔ)言的編譯程序(P3—人)用P2編譯P3,得到P4自展問(wèn)題一:如何直接在一個(gè)機(jī)器上實(shí)現(xiàn)C語(yǔ)言編譯器?自展914.用P2編譯P3,得到P4C語(yǔ)言機(jī)器語(yǔ)言機(jī)器語(yǔ)言P4C子集機(jī)器語(yǔ)言機(jī)器語(yǔ)言P2獲得一個(gè)工具C子集匯編語(yǔ)言機(jī)器語(yǔ)言P01.用匯編語(yǔ)言實(shí)現(xiàn)一個(gè)C子集的編譯程序(P0—人)匯編語(yǔ)言機(jī)器語(yǔ)言機(jī)器語(yǔ)言C子集機(jī)器語(yǔ)言機(jī)器語(yǔ)言P1P22.用匯編程序(P1)處理該程序,得到(P2:可直接運(yùn)行)C語(yǔ)言C子集機(jī)器語(yǔ)言P33.用C子集編制C語(yǔ)言的編譯程序(P3—人)4.用P2編譯P3,得到P4C語(yǔ)言機(jī)器語(yǔ)言機(jī)器語(yǔ)言P4C子92移植問(wèn)題二:A機(jī)上有一個(gè)C語(yǔ)言編譯器,是否可利用此編譯器實(shí)現(xiàn)B機(jī)上的C語(yǔ)言編譯器?條件:A機(jī)有C語(yǔ)言的編譯程序目的:實(shí)現(xiàn)B機(jī)的C語(yǔ)言的編譯C語(yǔ)言A機(jī)器A機(jī)器C語(yǔ)言B機(jī)器B機(jī)器要完成的任務(wù)移植問(wèn)題二:A機(jī)上有一個(gè)C語(yǔ)言編譯器,是否可利用此編譯器實(shí)現(xiàn)93C語(yǔ)言C語(yǔ)言B機(jī)器C語(yǔ)言A機(jī)器B機(jī)器C語(yǔ)言B機(jī)器B機(jī)器C語(yǔ)言C語(yǔ)言B機(jī)器C語(yǔ)言A機(jī)器A機(jī)器C語(yǔ)言A機(jī)器B機(jī)器需要編寫的程序1)問(wèn)題的分析C語(yǔ)言C語(yǔ)言B機(jī)器C語(yǔ)言A機(jī)器B機(jī)器C語(yǔ)言B機(jī)器B機(jī)器C語(yǔ)言941.(人)用C語(yǔ)言編制B機(jī)的C編譯程序P0(C→B)(A機(jī)的C編譯P1)編譯P0,得到在A機(jī)上可運(yùn)行的P2(C→B)C語(yǔ)言C語(yǔ)言B機(jī)器C語(yǔ)言A機(jī)器A機(jī)器C語(yǔ)言A機(jī)器B機(jī)器P0P1P2獲得一個(gè)工具2)問(wèn)題的解決方法1.(人)用C語(yǔ)言編制B機(jī)的C編譯程序P0(C→B)C語(yǔ)言953.(A機(jī)的P2)編譯P0,得到在B機(jī)上可運(yùn)行的P3(C→B)P2C語(yǔ)言C語(yǔ)言B機(jī)器C語(yǔ)言A機(jī)器B機(jī)器C語(yǔ)言B機(jī)器B機(jī)器P0P3C語(yǔ)言C語(yǔ)言B機(jī)器C語(yǔ)言A機(jī)器A機(jī)器C語(yǔ)言A機(jī)器B機(jī)器P0P1P2獲得的工具3.(A機(jī)的P2)編譯P0,得到在B機(jī)上可運(yùn)行的P3(C→B96編譯程序移植:用A機(jī)器上的L語(yǔ)言編寫能在機(jī)器B上運(yùn)行的L語(yǔ)言的編譯程序先用L語(yǔ)言編寫出在A機(jī)器上運(yùn)行的產(chǎn)生B機(jī)器代碼的L編譯程序源程序,然后把該程序經(jīng)過(guò)A機(jī)器上的L編譯程序編譯后得到能在A機(jī)器上運(yùn)行的產(chǎn)生B機(jī)器代碼的編譯程序,用這個(gè)編譯程序再一次編譯上述源程序。
編譯程序移植:用A機(jī)器上的L語(yǔ)言編寫能在機(jī)器B上運(yùn)行的L語(yǔ)言97LBLLBLLAALBALBBLBLLBLLAALBALBB98LBLLAALBALBLLBALBBLBLLAALBALBLLBALBB99本機(jī)編譯器的利用問(wèn)題三:A機(jī)上有一個(gè)C語(yǔ)言編譯器,現(xiàn)要實(shí)現(xiàn)一個(gè)新語(yǔ)言NEW的編譯器?能利用穿插編譯技術(shù)么?用C編寫NEW的編譯,并用C編譯器編譯它NEW語(yǔ)言C語(yǔ)言A機(jī)器C語(yǔ)言A機(jī)器A機(jī)器NEW語(yǔ)言A機(jī)器A機(jī)器P0P1P2本機(jī)編譯器的利用問(wèn)題三:A機(jī)上有一個(gè)C語(yǔ)言編譯器,現(xiàn)要實(shí)現(xiàn)1001.5編譯技術(shù)的應(yīng)用及開(kāi)展應(yīng)用:大局部軟件工具的開(kāi)發(fā),都要使用編譯技術(shù)和方法語(yǔ)法制導(dǎo)的構(gòu)造化編輯器Turbo-Edit、editplus和Ultraedit等程序格式化工具軟件測(cè)試工具靜態(tài)分析器:不可能執(zhí)行的代碼、定義后未引用的變量動(dòng)態(tài)測(cè)試工具:運(yùn)行后與期望結(jié)果比較程序理解工具:確定調(diào)用關(guān)系,畫出流程圖高級(jí)語(yǔ)言的翻譯工具1.5編譯技術(shù)的應(yīng)用及開(kāi)展應(yīng)用:大局部軟件工具的開(kāi)發(fā),都101語(yǔ)法制導(dǎo)的構(gòu)造化編輯器具有通常的正文編輯和修改功能能象編譯程序那樣對(duì)源程序進(jìn)展分析,把恰當(dāng)?shù)膶哟螛?gòu)造加在程序上。可以保證源程序無(wú)語(yǔ)法錯(cuò)誤有統(tǒng)一的可讀性好的程序格式構(gòu)造化編輯器能夠執(zhí)行一些對(duì)編制源程序有用的附加任務(wù),如:檢查用戶的輸入是否正確自動(dòng)提供關(guān)鍵字從BEGIN或左括號(hào)跳到與其相匹配的END或右括號(hào)語(yǔ)法制導(dǎo)的構(gòu)造化編輯器具有通常的正文編輯和修改功能102程序格式化工具讀入并分析源程序使程序構(gòu)造變得清晰可讀,如:用縮排方式表示語(yǔ)句的嵌套層次構(gòu)造用一種專門的字型表示注釋等程序格式化工具讀入并分析源程序103軟件測(cè)試工具靜態(tài)測(cè)試動(dòng)態(tài)測(cè)試——?jiǎng)討B(tài)測(cè)試器——靜態(tài)測(cè)試器讀入源程序在不運(yùn)行該程序的情況下對(duì)其進(jìn)展分析,以發(fā)現(xiàn)程序中潛在的錯(cuò)誤或異常。不可能執(zhí)行到的死代碼未定義就引用的變量試圖使用一個(gè)實(shí)型變量作為指針等。利用測(cè)試用例實(shí)際執(zhí)行程序記錄程序的實(shí)際執(zhí)行路線將實(shí)際運(yùn)行結(jié)果與期望結(jié)果進(jìn)展比較,以發(fā)現(xiàn)程序中的錯(cuò)誤或異常。軟件測(cè)試工具靜態(tài)測(cè)試——?jiǎng)討B(tài)測(cè)試器——靜態(tài)測(cè)試器讀入源程序利104程序理解工具對(duì)源程序進(jìn)展分析確定各模塊間的調(diào)用關(guān)系記錄程序數(shù)據(jù)的靜態(tài)屬性和構(gòu)造屬性畫出控制流程圖程序理解工具對(duì)源程序進(jìn)展分析105練習(xí)1、判斷正誤(1)編譯程序的五個(gè)組成局部缺一不可。(2)高級(jí)語(yǔ)言程序到低級(jí)語(yǔ)言程序的轉(zhuǎn)換是基于語(yǔ)義的等價(jià)變換。(3)含有優(yōu)化局部的編譯程序的執(zhí)行效率高。(4)因?yàn)榫幾g程序和解釋程序具有不同的功能,所以他們的實(shí)現(xiàn)技術(shù)也完全不同。(5)編譯程序和解釋程序的根本區(qū)別在于解釋程序?qū)υ闯绦虿](méi)有真正的進(jìn)展翻譯。(6)無(wú)論一遍掃描的編譯器還是多遍掃描的編譯器都要對(duì)源程序掃描一遍。練習(xí)1、判斷正誤106練習(xí)2、對(duì)以下錯(cuò)誤信息,請(qǐng)指出可能是編譯的哪個(gè)階段〔詞法分析、語(yǔ)法分析、語(yǔ)義分析、代碼生成〕報(bào)告的?!?〕else沒(méi)有匹配的if〔2〕數(shù)組下標(biāo)越界〔3〕使用的函數(shù)沒(méi)有定義〔4〕在數(shù)中出現(xiàn)非數(shù)字字符〔5〕零作除數(shù)練習(xí)2、對(duì)以下錯(cuò)誤信息,請(qǐng)指出可能是編譯的哪個(gè)階段〔詞法分107 謝謝大家! 謝謝大家!108ch編譯原理引論ch編譯原理引論ch編譯原理引論為什么要學(xué)習(xí)編譯原理必修主干課程,操作系統(tǒng)和編譯系統(tǒng)構(gòu)成程序設(shè)計(jì)者與計(jì)算機(jī)之間的根本界面。通過(guò)學(xué)習(xí)該課程,掌握編譯的根本理論、常用的編譯技術(shù),了解編譯過(guò)程及編譯系統(tǒng)構(gòu)造和機(jī)理。能運(yùn)用所學(xué)技術(shù)解決實(shí)際問(wèn)題,能獨(dú)立編寫一個(gè)小型編譯系統(tǒng)。此外,通過(guò)學(xué)習(xí)編譯原理可以更好地理解程序語(yǔ)言的內(nèi)部機(jī)制,從而更好地理解和運(yùn)用程序設(shè)計(jì)語(yǔ)言。能運(yùn)用編譯程序構(gòu)造的原理和技術(shù)完成相關(guān)軟件工具的設(shè)計(jì)和開(kāi)發(fā)工作。ch編譯原理引論ch編譯原理引論ch編譯原理引論為什么要學(xué)習(xí)109為什么要學(xué)習(xí)編譯原理必修主干課程,操作系統(tǒng)和編譯系統(tǒng)構(gòu)成程序設(shè)計(jì)者與計(jì)算機(jī)之間的根本界面。通過(guò)學(xué)習(xí)該課程,掌握編譯的根本理論、常用的編譯技術(shù),了解編譯過(guò)程及編譯系統(tǒng)構(gòu)造和機(jī)理。能運(yùn)用所學(xué)技術(shù)解決實(shí)際問(wèn)題,能獨(dú)立編寫一個(gè)小型編譯系統(tǒng)。此外,通過(guò)學(xué)習(xí)編譯原理可以更好地理解程序語(yǔ)言的內(nèi)部機(jī)制,從而更好地理解和運(yùn)用程序設(shè)計(jì)語(yǔ)言。能運(yùn)用編譯程序構(gòu)造的原理和技術(shù)完成相關(guān)軟件工具的設(shè)計(jì)和開(kāi)發(fā)工作。為什么要學(xué)習(xí)編譯原理必修主干課程,操作系統(tǒng)和編譯系統(tǒng)構(gòu)成程序110課程內(nèi)容介紹編譯器構(gòu)造的一般原理和根本實(shí)現(xiàn)方法介紹的理論知識(shí):形式語(yǔ)言和自動(dòng)機(jī)理論、語(yǔ)法制導(dǎo)的定義和屬性文法、類型論等強(qiáng)調(diào)形式描述技術(shù)和自動(dòng)生成技術(shù)課程簡(jiǎn)介先行課程高等數(shù)學(xué)、C、離散數(shù)學(xué)、匯編語(yǔ)言、數(shù)據(jù)構(gòu)造課程內(nèi)容課程簡(jiǎn)介先行課程111參考資料國(guó)外編譯原理領(lǐng)域內(nèi)的3本權(quán)威書籍:當(dāng)代編譯技術(shù)三大圣經(jīng)!1、龍書〔Dragonbook〕參考資料國(guó)外編譯原理領(lǐng)域內(nèi)的3本權(quán)威書籍:當(dāng)代編譯技術(shù)三大1122、鯨書〔Whalebook〕
2、鯨書〔Whalebook〕
1133、虎書〔Tigerbook〕3、虎書〔Tigerbook〕114國(guó)內(nèi)編譯原理領(lǐng)域內(nèi)的權(quán)威書籍:1.陳意云?編譯原理?高等教育出版社ch編譯原理引論課件1152.呂映芝?編譯原理?清華大學(xué)教育出版社;ch編譯原理引論課件1163.陳英?編譯原理?清華工大學(xué)出版社3.陳英?編譯原理?清華工大學(xué)出版社1174.蔣宗禮?編譯原理?高等教育出版社ch編譯原理引論課件1185.劉磊?編譯原理及實(shí)現(xiàn)?機(jī)械工業(yè)出版社ch編譯原理引論課件119要求及學(xué)習(xí)方法課程特點(diǎn):理論性強(qiáng),算法復(fù)雜平時(shí)〔20%〕無(wú)故曠課:-5一本教材,認(rèn)真聽(tīng)課:以講義為主,做適當(dāng)?shù)墓P記認(rèn)真完成課堂和課后作業(yè)期末〔80%〕:閉卷筆試要求及學(xué)習(xí)方法課程特點(diǎn):理論性強(qiáng),算法復(fù)雜120第一章編譯概述掌握編譯程序中所涉及的有關(guān)名詞術(shù)語(yǔ)2.理解編譯程序總的框架,明確編譯程序工作的根本過(guò)程及各階段的根本任務(wù)教學(xué)目標(biāo)第一章編譯概述掌握編譯程序中所涉及的有關(guān)名詞術(shù)語(yǔ)教學(xué)目1211.2.編譯的過(guò)程1.3.編譯程序的邏輯構(gòu)造1.4.編譯程序的生成1.5.編譯技術(shù)的應(yīng)用及開(kāi)展教學(xué)內(nèi)容教學(xué)內(nèi)容122
程序的翻譯語(yǔ)言和翻譯:語(yǔ)言是人類交流思想和信息的工具。如自然語(yǔ)言,世界上存在著許多種語(yǔ)言,各國(guó)之間要交流信息,就要有各種語(yǔ)言之間的翻譯。計(jì)算機(jī)語(yǔ)言同樣是豐富多彩的。程序的翻譯語(yǔ)言和翻譯:語(yǔ)言是人類交流思想和信息的工具。如12312/9/2022第124頁(yè)機(jī)器語(yǔ)言(machinelanguage)C70600000002匯編語(yǔ)言(assemblerlanguage)
MOVX,2高級(jí)語(yǔ)言(high-levellanguage)
X=2為什么要使用編譯程序?12/9/2022第16頁(yè)機(jī)器語(yǔ)言(machinelan124程序語(yǔ)言的分類低級(jí)語(yǔ)言〔LowlevelLanguage)機(jī)器語(yǔ)言、匯編語(yǔ)言特點(diǎn):與特定的機(jī)器有關(guān),成效高,但使用復(fù)雜、繁瑣、費(fèi)時(shí)、易出錯(cuò)。高級(jí)語(yǔ)言--Fortran、Pascal、C語(yǔ)言等特點(diǎn):不依賴具體機(jī)器,移植性好、對(duì)用戶要求低、易使用、易維護(hù)等。程序語(yǔ)言的分類低級(jí)語(yǔ)言〔LowlevelLanguage125計(jì)算機(jī)硬件只懂自己的指令系統(tǒng),那么它是如何識(shí)別除機(jī)器語(yǔ)言以外的另一種語(yǔ)言呢??解決這一問(wèn)題的方法:翻譯程序?。∮?jì)算機(jī)硬件只懂自己的指令系統(tǒng),那么它是如何識(shí)別除機(jī)器語(yǔ)言以外126翻譯程序翻譯程序:能夠把某一種語(yǔ)言程序〔稱為源語(yǔ)言程序〕轉(zhuǎn)換成另一種語(yǔ)言程序〔稱為目標(biāo)語(yǔ)言程序〕的一個(gè)程序,而后者與前者在邏輯上是等價(jià)的。程序翻譯的方式通常有兩種,一種是編譯方式,另一種是解釋方式。源程序翻譯程序目標(biāo)程序翻譯程序翻譯程序:能夠把某一種語(yǔ)言程序〔稱為源語(yǔ)言程序〕轉(zhuǎn)換127編譯程序編譯程序:如果一個(gè)翻譯程序的源語(yǔ)言是某種高級(jí)語(yǔ)言,其目標(biāo)語(yǔ)言是相對(duì)于某一計(jì)算機(jī)的匯編語(yǔ)言或機(jī)器語(yǔ)言,那么稱這種翻譯程序?yàn)榫幾g程序〔或稱為編譯器〕。假設(shè)編譯生成的目標(biāo)程序不是機(jī)器代碼,而是匯編語(yǔ)言程序,那么還要增加一個(gè)會(huì)變程序?qū)⑵鋾?huì)變?yōu)闄C(jī)器代碼。源程序(高級(jí)語(yǔ)言編寫)編譯程序目標(biāo)程序(機(jī)器語(yǔ)言或匯編語(yǔ)言編寫)編譯程序編譯程序:如果一個(gè)翻譯程序的源語(yǔ)言是某種高級(jí)語(yǔ)言,其128匯編程序如果一個(gè)翻譯程序的源語(yǔ)言是某種匯編語(yǔ)言,其目標(biāo)語(yǔ)言是某一計(jì)算機(jī)的機(jī)器語(yǔ)言,那么稱這種翻譯程序?yàn)閰R編程序。源程序(匯編語(yǔ)言編寫)匯編程序目標(biāo)程序(機(jī)器語(yǔ)言編寫)匯編程序如果一個(gè)翻譯程序的源語(yǔ)言是某種匯編語(yǔ)言,其目標(biāo)語(yǔ)言是129解釋程序解釋程序:是一種語(yǔ)言處理程序,它以源程序作為輸入,但不產(chǎn)生目標(biāo)代碼,它將源程序中的語(yǔ)句按動(dòng)態(tài)順序,逐句翻譯成課執(zhí)行代碼,一旦具備執(zhí)行條件,那么立即執(zhí)行這一階段代碼得到局部結(jié)果。源程序(高級(jí)語(yǔ)言編寫)解釋程序計(jì)算結(jié)果特點(diǎn):與編譯系統(tǒng)比較,解釋系統(tǒng)較簡(jiǎn)單、可移植性好,易于查錯(cuò),但速度慢解釋程序解釋程序:是一種語(yǔ)言處理程序,它以源程序作為輸入,130編譯和解釋程序編譯程序的工作相當(dāng)于載翻譯一本原著,計(jì)算機(jī)運(yùn)行編譯后的目標(biāo)程序,相當(dāng)于閱讀一本譯著;而解釋程序的工作相當(dāng)于在進(jìn)展同聲翻譯,計(jì)算機(jī)運(yùn)行解釋程序,相當(dāng)于我們直接通過(guò)翻譯聽(tīng)外賓講話。編譯和解釋程序131程序的編譯執(zhí)行:輸入數(shù)據(jù)源程序編譯程序運(yùn)行系統(tǒng)目標(biāo)程序輸入數(shù)據(jù)源程序編譯程序運(yùn)行系統(tǒng)目標(biāo)程序132程序的解釋執(zhí)行:如:BASIC、Prolog,問(wèn)題:效率低下解釋程序源程序輸入數(shù)據(jù)計(jì)算結(jié)果為什么解釋運(yùn)行的工作效率低于編譯方式??程序的解釋執(zhí)行:解釋程序源程序輸入數(shù)據(jù)計(jì)算結(jié)果為什么解釋運(yùn)行133編譯程序與解釋程序的差異根本區(qū)別:是否生成目標(biāo)代碼!功能工作結(jié)果實(shí)現(xiàn)技術(shù)上解釋程序源程序的一個(gè)執(zhí)行系統(tǒng)源程序的執(zhí)行結(jié)果執(zhí)行中間代碼編譯程序源程序的一個(gè)轉(zhuǎn)換系統(tǒng)源程序的目標(biāo)代碼把中間代碼轉(zhuǎn)換成目標(biāo)程序編譯程序與解釋程序的差異根本區(qū)別:是否生成目標(biāo)代碼!功能工作134“編譯+解釋執(zhí)行〞系統(tǒng)源程序編譯程序源程序的中間形式輸出數(shù)據(jù)解釋程序輸入數(shù)據(jù)“編譯+解釋執(zhí)行〞系統(tǒng)源程序編譯程序源程序的中間形式輸出數(shù)據(jù)135例如Java語(yǔ)言.java
java源程序文件.class二進(jìn)制字節(jié)碼文件Java虛擬機(jī)(JVM)本地計(jì)算機(jī)系統(tǒng)編譯例如Java語(yǔ)言.javajava源程序文件.cl136編譯程序在計(jì)算機(jī)系統(tǒng)中的位置編譯程序是一種軟件,是系統(tǒng)軟件。通常認(rèn)為系統(tǒng)軟件是居于計(jì)算機(jī)系統(tǒng)中最靠近硬件的一層,其他軟件一般都通過(guò)系統(tǒng)軟件發(fā)揮作用。編譯程序在計(jì)算機(jī)系統(tǒng)中的位置編譯程序是一種軟件,是系統(tǒng)軟件。137翻譯程序所處的層次高級(jí)語(yǔ)言語(yǔ)言處理程序操作系統(tǒng)匯編語(yǔ)言計(jì)算機(jī)硬件C編譯程序C語(yǔ)言Basic解釋程序Basic語(yǔ)言Fortran編譯程序Fortran語(yǔ)言............翻譯程序所處的層次高語(yǔ)言處理程序操作系統(tǒng)計(jì)算機(jī)硬件CCBas138幾個(gè)概念宿主機(jī):運(yùn)行編譯程序的計(jì)算機(jī)目標(biāo)機(jī):運(yùn)行編譯程序所產(chǎn)生的目標(biāo)代碼的計(jì)算機(jī)穿插編譯程序:一個(gè)編譯程序產(chǎn)生不同于其宿主機(jī)的機(jī)器代碼可變目標(biāo)編譯程序:不需要重寫編譯程序中與機(jī)器無(wú)關(guān)的局部就能改變目標(biāo)機(jī)幾個(gè)概念宿主機(jī):運(yùn)行編譯程序的計(jì)算機(jī)139對(duì)編譯程序的一些說(shuō)明編譯程序?qū)嵸|(zhì)上是一個(gè)翻譯程序,要注意等價(jià)變換本課程的任務(wù)就是講解在這個(gè)轉(zhuǎn)換過(guò)程中所涉及到的一些理論和方法,最后,使用這些理論和方法,自己編寫一個(gè)小的編譯器轉(zhuǎn)換是一個(gè)總體的功能,要抓住總體構(gòu)造,逐層細(xì)分,寫編譯器時(shí)要表達(dá)軟件工程中軟件設(shè)計(jì)的原那么,自頂向下,逐層分解。編譯器要完成的轉(zhuǎn)換任務(wù)相當(dāng)復(fù)雜,實(shí)現(xiàn)編譯器時(shí)必須分步驟分階段實(shí)現(xiàn)。分階段實(shí)現(xiàn)的好處是能夠簡(jiǎn)化程序的設(shè)計(jì),當(dāng)然也可以不分階段實(shí)現(xiàn)。對(duì)編譯程序的一些說(shuō)明編譯程序?qū)嵸|(zhì)上是一個(gè)翻譯程序,要注意等價(jià)140編譯原理是討論編譯程序設(shè)計(jì)的根本理論、根本概念、根本方法什么是編譯原理編譯原理是討論編譯程序設(shè)計(jì)的根本理論、根本概念14112/9/2022142編譯器和集成開(kāi)發(fā)環(huán)境編譯器:即編譯程序,把高級(jí)語(yǔ)言經(jīng)分析翻譯為低級(jí)語(yǔ)言。集成開(kāi)發(fā)環(huán)境:簡(jiǎn)稱IDE〔IntegratedDevelopEnvironment〕,是用于提供程序開(kāi)發(fā)環(huán)境的應(yīng)用程序,一般包括代碼編輯器、編譯器、調(diào)試器和圖形用戶界面工具。背景:早期程序設(shè)計(jì)的各個(gè)階段都要用不同的軟件來(lái)進(jìn)展處理,如先用字處理軟件編輯源程序,再用編譯程序進(jìn)展編譯,然后用鏈接程序進(jìn)展函數(shù)、模塊連接,開(kāi)發(fā)者必須在幾種軟件間來(lái)回切換操作。人們習(xí)慣上經(jīng)常把IDE稱為編譯器。12/9/202234編譯器和集成開(kāi)發(fā)環(huán)境編譯器:即編譯程序142編譯原理引論143常見(jiàn)語(yǔ)言及其IDE語(yǔ)言IDECTC2.0C++C++Builder,VC++6.0,TC3.0C#VS.NETPascalTurboPascalOOPascalDelphiVBVB6.0(解釋器)JavaEclipse,JBuilder編譯原理引論35常見(jiàn)語(yǔ)言及其IDE語(yǔ)言IDECTC2.0C+1431.2編譯的過(guò)程1.編譯程序的工作過(guò)程1.2編譯的過(guò)程1.編譯程序的工作過(guò)程144編譯過(guò)程本身是一種語(yǔ)言的翻譯過(guò)程,類似于外文的翻譯。將英文句子“Iwishyousuccess翻譯成中文。兩階段完成翻譯
分析:分析單詞:I,wish,you,success分析語(yǔ)法:主語(yǔ),謂語(yǔ),賓語(yǔ),賓補(bǔ)分析語(yǔ)義:我希望你成功
綜合:綜合英語(yǔ)的意思、上下文環(huán)境和漢語(yǔ)的表達(dá)習(xí)慣,完成翻譯:祝你成功編譯過(guò)程本身是一種語(yǔ)言的翻譯過(guò)程,類似于外文的翻譯。145翻譯外文資料:1、能識(shí)別出句子中的一個(gè)單詞;2、分析句子的語(yǔ)法構(gòu)造;3、根據(jù)句子的含義進(jìn)展初步翻譯;4、對(duì)譯文進(jìn)展修飾;5、寫出最后的譯文。翻譯外文資料:146翻譯外文資料與編譯源程序進(jìn)展類比翻譯外文編譯程序分析識(shí)別單詞分析句子根據(jù)語(yǔ)義進(jìn)行初步翻譯詞法分析語(yǔ)法分析語(yǔ)義分析、生成中間代碼綜合修辭加工寫出譯文代碼優(yōu)化目標(biāo)代碼生成翻譯外文資料與編譯源程序進(jìn)展類比翻譯外文編譯程序識(shí)別單詞詞法147將編譯過(guò)程劃分為5個(gè)根本階段詞法分析語(yǔ)法分析語(yǔ)義分析及中間代碼生成代碼優(yōu)化目標(biāo)代碼生成將編譯過(guò)程劃分為5個(gè)根本階段詞法分析語(yǔ)法分析語(yǔ)義分析及中間代148從概念上來(lái)講,一個(gè)編譯程序的整個(gè)工作過(guò)程是劃分成階段進(jìn)展的,每個(gè)階段將源程序的一種表示形式轉(zhuǎn)換成另一種表示形式,各個(gè)階段進(jìn)展的操作在邏輯上是嚴(yán)密連接在一起的。事實(shí)上,某些階段可能組合在一起,這些階段間的源程序的中間表示形式就沒(méi)必要構(gòu)造出來(lái)了。從概念上來(lái)講,一個(gè)編譯程序的整個(gè)工作過(guò)程是劃分成階段進(jìn)展的,1491.2編譯的過(guò)程1.編譯程序的工作過(guò)程1.2編譯的過(guò)程1.編譯程序的工作過(guò)程150(1)詞法分析詞法分析階段是編譯過(guò)程的第一個(gè)階段。這個(gè)階段的任務(wù)是從左到右一個(gè)字符一個(gè)字符地讀入源程序,對(duì)構(gòu)成源程序的字符流進(jìn)展掃描和分解,根據(jù)語(yǔ)言的詞法規(guī)那么識(shí)別出一個(gè)個(gè)具有獨(dú)立意義的最小語(yǔ)法單位,即單詞。(1)詞法分析151根據(jù)詞法規(guī)那么分析和識(shí)別單詞。把需要存放的單詞放到符號(hào)表中,如變量名,標(biāo)號(hào),常量等。工作依據(jù):源語(yǔ)言的構(gòu)詞規(guī)那么(即詞法),也稱為模式(pattern)。標(biāo)識(shí)符的模式是:以字母開(kāi)頭的字母數(shù)字序列。根據(jù)詞法規(guī)那么分析和識(shí)別單詞。152例:sum=(10+20)*(num+square);結(jié)果(標(biāo)識(shí)符,sum)(賦值號(hào),=)(左括號(hào),()(整常數(shù),10)(加號(hào),+)(整常數(shù),20)(右括號(hào),))(乘號(hào),*)(左括號(hào),()(標(biāo)識(shí)符,num)(加號(hào),+)(標(biāo)識(shí)符,square)(右括號(hào),))(分號(hào),;)例:結(jié)果153詞法分析的功能如下:識(shí)別出源程序中意義獨(dú)立的最小詞法單位—單詞。刪除無(wú)用的空格、回車和其他與輸入介質(zhì)有關(guān)的符號(hào)刪除程序員為了提高程序可讀性所加的注釋如果發(fā)現(xiàn)錯(cuò)誤那么報(bào)告出錯(cuò)詞法分析的功能如下:154(2)語(yǔ)法分析根據(jù)語(yǔ)法規(guī)那么〔即語(yǔ)言的文法〕,分析并識(shí)別出各種語(yǔ)法成分〔如表達(dá)式、語(yǔ)句、函數(shù)等〕,并進(jìn)展語(yǔ)法正確性檢查。通常將語(yǔ)法分析的結(jié)果表示為語(yǔ)法樹(shù)。(2)語(yǔ)法分析155sum=(10+20)*(num+square);sum=(10+20)*(num+square);156語(yǔ)法分析的功能是進(jìn)展層次分析,把源程序的單詞序列組成語(yǔ)法短語(yǔ)(表示成語(yǔ)法樹(shù))。依據(jù)的是語(yǔ)法規(guī)那么。C語(yǔ)言的賦值語(yǔ)句的規(guī)那么為:
單詞序列sum=(10+20)*(num+square);之所以能表示成上圖的語(yǔ)法樹(shù),依據(jù)的是賦值語(yǔ)句和表達(dá)式的語(yǔ)法規(guī)那么。
<賦值語(yǔ)句>::=<標(biāo)識(shí)符>“=〞<表達(dá)式><表達(dá)式>::=<表達(dá)式>“+〞<表達(dá)式>|<表達(dá)式>“*〞<表達(dá)式><表達(dá)式>::=“(〞<表達(dá)式>“)〞|<標(biāo)識(shí)符>|<整數(shù)>|<實(shí)數(shù)>語(yǔ)法分析的功能是進(jìn)展層次分析,把源程序的單詞序列組成語(yǔ)法短157(3)語(yǔ)義分析及中間代碼生成語(yǔ)義分析階段的任務(wù)是審查源程序有無(wú)語(yǔ)義錯(cuò)誤。工作依據(jù):源語(yǔ)言的語(yǔ)義規(guī)那么一個(gè)重要任務(wù):類型檢查根據(jù)規(guī)那么檢查每個(gè)運(yùn)算符及其運(yùn)算對(duì)象是否符合要求;數(shù)組的下標(biāo)是否合法;過(guò)程調(diào)用時(shí),形參與實(shí)參個(gè)數(shù)、類型是否匹配等(3)語(yǔ)義分析及中間代碼生成158(3)語(yǔ)義分析及中間代碼生成源程序中有些語(yǔ)法成分,按照語(yǔ)法規(guī)那么去判斷,它是正確的,但它不符合語(yǔ)義規(guī)那么。比方使用了沒(méi)有聲明的變量;或者給一個(gè)過(guò)程名賦值;或者調(diào)用函數(shù)時(shí)參數(shù)類型不適宜或者參加運(yùn)算的兩個(gè)變量類型不匹配等等。比方下邊的程序片段:
intarr[2],c;
c=arr1*10;其中的賦值語(yǔ)句是符合語(yǔ)法規(guī)那么的,但是因?yàn)闆](méi)有聲明變量arr1,而存在語(yǔ)義錯(cuò)。(3)語(yǔ)義分析及中間代碼生成159中間代碼生成(可選〕所謂“中間代碼〞是一種構(gòu)造簡(jiǎn)單、含義明確的記號(hào)系統(tǒng),這種記號(hào)系統(tǒng)可以設(shè)計(jì)為多種多樣的形式,重要的設(shè)計(jì)原那么為兩點(diǎn):一是容易生成;二是容易將它翻譯成目標(biāo)代碼。中間代碼的形式: 四元式、三元式、逆波蘭表示中間代碼生成(可選〕160中間代碼(intermediateCode)例:sum=(10+20)*(num+square);后綴表示(逆波蘭Anti-PolishNotation)sum1020+numsquare+*=前綴表示(波蘭PolishNotation)=sum*+1020+numsquare
四元式表示(三地址碼)(+,10,20,T1)(+,num,square,T2)(*,T1,T2,T3)(=,T3,,sum)
三元式表示(+,10,20)(+,num,square)(*,⑴,⑵)(=,sum,⑶)
語(yǔ)法樹(shù)中間代碼(intermediateCode)后綴表示(逆波161(4)中間代碼優(yōu)化(可選〕代碼優(yōu)化階段的任務(wù)是對(duì)前階段產(chǎn)生的中間代碼進(jìn)展變換或進(jìn)展改造,目的是使生成的目標(biāo)代碼更為高效,即省時(shí)間和省空間。(4)中間代碼優(yōu)化(可選〕162例:sum=(10+20)*(num+square)得到的四元式T1=10+20T2=num+squareT3=T1*T2sum=T3優(yōu)化后T1=num+squareSum=30*T1例:sum=(10+20)*(num+square)得到163這只是優(yōu)化工作的兩個(gè)方面,此外諸如公共子表達(dá)式的刪除、強(qiáng)度削弱、循環(huán)優(yōu)化等優(yōu)化工作將在后面的章節(jié)詳細(xì)介紹。代碼優(yōu)化工作會(huì)降低編譯程序的編譯速度,因此編譯優(yōu)化階段常常作為可選擇階段,編譯程序具有控制機(jī)制以允許用戶在編譯速度和目標(biāo)代碼的質(zhì)量間進(jìn)展權(quán)衡。這只是優(yōu)化工作的兩個(gè)方面,此外諸如公共子表達(dá)式的刪除、強(qiáng)度削164思考:代碼優(yōu)化能提高編譯程序的運(yùn)行效率嗎?思考:代碼優(yōu)化能提高編譯程序的運(yùn)行效率嗎?165(5)目標(biāo)代碼生成目標(biāo)代碼生成階段的任務(wù)是把中間代碼變換成特定機(jī)器上的絕對(duì)指令代碼或可重定位的指令代碼或匯編指令代碼。這是編譯的最后階段,它的工作與硬件系統(tǒng)構(gòu)造和指令含義有關(guān),這個(gè)階段的工作很復(fù)雜,涉及到硬件系統(tǒng)功能部件的運(yùn)用、機(jī)器指令的選擇、各種數(shù)據(jù)類型變量的存儲(chǔ)空間分配以及存放器和后緩存放器的調(diào)度等。涉及到的兩個(gè)重要問(wèn)題:對(duì)程序中使用的每個(gè)變量要指定存儲(chǔ)單元對(duì)變量進(jìn)展存放器分配(5)目標(biāo)代碼生成166例:sum=(10+20)*(num+square)得到的優(yōu)化后四元式T1=num+squareSum=30*T1生成如下指令序列:MOVnum,R1MOVsquare,R2ADDR2,R1MUL30,R1MOVR1,sum例:sum=(10+20)*(num+square)得到167目標(biāo)代碼可采用如下三種形式之一:(1)具有絕對(duì)地址的機(jī)器指令代碼。(2)匯編語(yǔ)言形式的目標(biāo)程序。需要經(jīng)過(guò)匯編程序匯編,以產(chǎn)生機(jī)器代碼。(3)可重定位的指令代碼。多數(shù)編譯程序所產(chǎn)生的目標(biāo)代碼都是這種類型。目標(biāo)代碼可采用如下三種形式之一:168語(yǔ)句sum=(10+20)*(num+square);的翻譯過(guò)程語(yǔ)句sum=(10+20)*(num+square);的翻譯169編譯過(guò)程小結(jié)目標(biāo)代碼生成程序代碼優(yōu)化程序語(yǔ)義分析生成中間代碼語(yǔ)法分析程序詞法分析程序S.PO.P編譯過(guò)程小結(jié)目標(biāo)代碼代碼優(yōu)化語(yǔ)義分析語(yǔ)法分析詞法分析S.PO170上述編譯過(guò)程的階段劃分是一種典型的處理模式,事實(shí)上并非所有的編譯程序都包括這樣幾個(gè)階段。有些編譯程序并不要中間代碼,即不存在中間代碼生成階段;有些編譯程序不進(jìn)展優(yōu)化,優(yōu)化階段即可省去;有些最簡(jiǎn)單的編譯程序只有詞法分析,語(yǔ)法分析;語(yǔ)義分析和目標(biāo)代碼生成。上述編譯過(guò)程的階段劃分是一種典型的處理模式,事實(shí)上并非所有的1711.3編譯程序的邏輯構(gòu)造按邏輯功能不同,可將編譯過(guò)程劃分為五個(gè)根本階段,與此相對(duì)應(yīng),我們將實(shí)現(xiàn)整個(gè)編譯過(guò)程的編譯程序劃分為五個(gè)邏輯階段〔即五個(gè)邏輯子過(guò)程〕。每個(gè)階段中都要有:符號(hào)表管理和錯(cuò)誤處理1.3編譯程序的邏輯構(gòu)造按邏輯功能不同,可將編譯過(guò)程172典型的編譯程序具有7個(gè)邏輯局部語(yǔ)義分析及生成中間代碼程序代碼生成程序代碼優(yōu)化程序語(yǔ)法分析程序詞法分析程序錯(cuò)誤處理符號(hào)表管理典型的編譯程序具有7個(gè)邏輯局部語(yǔ)義分析及生成中間代碼程序代碼173<1>詞法分析:識(shí)別單詞,至少分以下幾大類:關(guān)鍵字〔保存字〕、標(biāo)識(shí)符、字面量、特殊符號(hào);<2>語(yǔ)法分析:得到語(yǔ)言構(gòu)造并以樹(shù)的形式表示<3>語(yǔ)義分析:考察構(gòu)造正確的句子是否語(yǔ)義合法,可修改樹(shù)構(gòu)造;<4>中間代碼生成〔可選〕:生成一種既接近目標(biāo)語(yǔ)言,又與具體機(jī)器無(wú)關(guān)的表示,便于優(yōu)化與代碼生成;〔到目前為止,編譯器與解釋器可以一致〕<1>詞法分析:識(shí)別單詞,至少分以下幾大類:關(guān)鍵字〔保存字174<5>中間代碼優(yōu)化〔可選〕:局部?jī)?yōu)化、循環(huán)優(yōu)化、全局優(yōu)化等;優(yōu)化實(shí)際上是一個(gè)等價(jià)變換,變換前后的指令序列完成同樣的功能,但是,在占用的空間上和程序執(zhí)行的時(shí)間上都更省、更有效。<6>目標(biāo)代碼生成:不同形式的目標(biāo)代碼-匯編、可重定位、絕對(duì)機(jī)器指令;<7>符號(hào)表管理:合理組織符號(hào),便于各階段查找、填寫等;<8>出錯(cuò)處理:錯(cuò)誤的種類-詞法錯(cuò)、語(yǔ)法錯(cuò)、靜態(tài)語(yǔ)義錯(cuò)、動(dòng)態(tài)語(yǔ)義錯(cuò)。<5>中間代碼優(yōu)化〔可選〕:局部?jī)?yōu)化、循環(huán)優(yōu)化、全局優(yōu)化175符號(hào)表管理編譯程序的一項(xiàng)重要工作:記錄源程序中使用的標(biāo)識(shí)符收集每個(gè)標(biāo)識(shí)符的各種屬性信息符號(hào)表是由假設(shè)干記錄組成的數(shù)據(jù)構(gòu)造每個(gè)標(biāo)識(shí)符在表中有一條記錄記錄的域是標(biāo)識(shí)符的屬性對(duì)符號(hào)表構(gòu)造的要求:應(yīng)允許快速地找到標(biāo)識(shí)符的記錄可在其中存取數(shù)據(jù)標(biāo)識(shí)符的各種屬性是在編譯的各個(gè)不同階段填入符號(hào)表的。符號(hào)表管理編譯程序的一項(xiàng)重要工作:176聲明語(yǔ)句:floattotal,rate;詞法分析器:float是關(guān)鍵字total、rate是標(biāo)識(shí)符在符號(hào)表中創(chuàng)立這兩個(gè)標(biāo)識(shí)符的記錄語(yǔ)義分析器:total、rate都表示變量float表示這兩個(gè)變量的類型可以把這兩種屬性及存儲(chǔ)分配信息填入符號(hào)表。在語(yǔ)義分析和生成中間代碼時(shí),還要在符號(hào)表中填入對(duì)這個(gè)float型變量進(jìn)展存儲(chǔ)分配的信息。聲明語(yǔ)句:floattotal,rate;詞法分析器:177錯(cuò)誤處理在編譯的每個(gè)階段都可能檢測(cè)到源程序中存在的錯(cuò)誤詞法分析程序可以檢測(cè)出非法字符錯(cuò)誤。語(yǔ)法分析程序能夠發(fā)現(xiàn)記號(hào)流不符合語(yǔ)法規(guī)那么的錯(cuò)誤。語(yǔ)義分析程序試圖檢測(cè)出具有正確的語(yǔ)法構(gòu)造,但對(duì)所涉及的操作無(wú)意義的構(gòu)造。代碼生成程序可能發(fā)現(xiàn)目標(biāo)程序區(qū)超出了允許范圍的錯(cuò)誤。處理與恢復(fù)判斷位置和性質(zhì)適當(dāng)?shù)幕謴?fù)出錯(cuò)處理能力的優(yōu)劣是衡量編譯程序質(zhì)量好壞的一個(gè)重要指標(biāo)。錯(cuò)誤處理在編譯的每個(gè)階段都可能檢測(cè)到源程序中存在的錯(cuò)誤178編譯有關(guān)的其他概念“遍〞前端和后端編譯有關(guān)的其他概念“遍〞179編譯器掃描的遍數(shù)遍〔趟〕:是對(duì)源程序或源程序的中間結(jié)果從頭到尾掃描一遍,并作有關(guān)加工處理,生成新的中間結(jié)果或目標(biāo)程序。例如:詞法分析器對(duì)輸入源程序進(jìn)展第一遍掃描,語(yǔ)法分析進(jìn)展第二遍掃描但一個(gè)階段對(duì)應(yīng)一遍掃描的工作方式是邏輯上的,由于屢次掃描的方式需要大量的存儲(chǔ)空間存放中間表示,并且會(huì)增加一些不必要的輸入輸出操作,因此編譯器往往把假設(shè)干個(gè)階段的工作結(jié)合起來(lái),對(duì)應(yīng)一遍掃描,從而減少對(duì)程序的掃描遍數(shù)。編譯器掃描的遍數(shù)遍〔趟〕:是對(duì)源程序或源程序的中間結(jié)果從頭到180一個(gè)編譯程序應(yīng)分成幾遍,如何劃分,是與源程序、設(shè)計(jì)要求、硬件設(shè)備等諸因素有關(guān)的,因地難于統(tǒng)一劃定。在主存可能的前提下,一般遍數(shù)盡可能少一點(diǎn)為好。但并不是每種語(yǔ)言都可以用單遍編譯程序?qū)崿F(xiàn)。一個(gè)編譯程序應(yīng)分成幾遍,如何劃分,是與源程序、設(shè)計(jì)要求、硬件181一遍掃描的編譯程序語(yǔ)法分析器取記號(hào)詞法分析器源程序記號(hào)語(yǔ)法成分語(yǔ)義分析及代碼生成目標(biāo)程序返回控制流信息流開(kāi)場(chǎng)完畢整理目標(biāo)程序一遍掃描的編譯程序語(yǔ)法分析器取記號(hào)詞法分析器源程序記號(hào)語(yǔ)法成182多遍編譯程序多遍編譯程序183編譯階段的組合在前面所討論的編譯過(guò)程中階段的劃分是編譯程序的邏輯組織。有時(shí),常常把編譯的過(guò)程分為前端(frontend)和后端(backend),前端的工作主要依賴于源語(yǔ)言而與目標(biāo)機(jī)無(wú)關(guān),后端工作依賴于目標(biāo)機(jī)而一般不依賴源語(yǔ)言。編譯階段的組合在前面所討論的編譯過(guò)程中階段的劃分是編譯程序的184根據(jù)編譯程序各局部功能,將編譯程序分成前端和后端前端:通常將與源程序有關(guān)的編譯局部稱為前端。 詞法分析、語(yǔ)法分析、語(yǔ)義分析、中間代碼生成 ---分析局部特點(diǎn):與源語(yǔ)言有關(guān)后端:與目標(biāo)機(jī)有關(guān)的局部稱為后端。代碼優(yōu)化、代碼生成---綜合局部特點(diǎn):與目標(biāo)機(jī)有關(guān)編譯程序的前端和后端根據(jù)編譯程序各局部功能,將編譯程序分成前端和后端前端:通185編譯階段的組合編譯階段的組合186為什么生成中間代碼為什么生成中間代碼187.javajava源程序文件.class二進(jìn)制字節(jié)碼文件Java虛擬機(jī)(JVM)本地計(jì)算機(jī)系統(tǒng)編譯同一前端+不同后端不同機(jī)器構(gòu)成同一語(yǔ)言的編譯程序例如Java語(yǔ)言.javajava源程序文件.class二進(jìn)制188
不同前端+同一后端同一機(jī)器生成幾個(gè)語(yǔ)言的編譯程序例如GCC編譯程序集合不同前端+同一后端同一機(jī)器生成幾個(gè)語(yǔ)言的編譯程序例189編譯程序中的主要數(shù)據(jù)構(gòu)造(續(xù))Token表符號(hào)表常數(shù)表錯(cuò)誤信息語(yǔ)法樹(shù)中間代碼表臨時(shí)文件目標(biāo)代碼表編譯程序中的主要數(shù)據(jù)構(gòu)造(續(xù))Token表語(yǔ)法樹(shù)中間代碼表19012/9/2022第191頁(yè)1.4編譯程序的設(shè)計(jì)構(gòu)造編譯程序要掌握以下幾方面的內(nèi)容:源語(yǔ)言:理解其構(gòu)造和含義目標(biāo)語(yǔ)言:必須清楚硬件的系統(tǒng)構(gòu)造和指令的格式等編譯方法12/9/2022第83頁(yè)1.4編譯程序的設(shè)計(jì)構(gòu)造編譯程序19112/9/2022第192頁(yè)1.4編譯程序的設(shè)計(jì)一般實(shí)現(xiàn)編譯程序的方法有:注:編譯程序核心局部常用匯編語(yǔ)言編寫注:這是普遍采用的方法5.用編譯工具自動(dòng)生成:LEX(詞法分析)與YACC(用于自動(dòng)產(chǎn)生LALR分析表)6.移植〔同種語(yǔ)言的編譯程序在不同類型的機(jī)器之間移植〕12/9/2022第84頁(yè)1.4編譯程序的設(shè)計(jì)一般實(shí)現(xiàn)編譯1921.4編譯程序的生成早期人們用匯編語(yǔ)言編寫編譯程序,但其效率低,實(shí)現(xiàn)困難,比方FORTRAN語(yǔ)言編譯器18年才完成。專門的編譯編譯工具,可以支持編譯程序某些局部的自動(dòng)生成。比方:LEX和YACC等。1.4編譯程序的生成早期人們用匯編語(yǔ)言編寫編譯程序,但其193說(shuō)到一個(gè)編譯程序,一定要知道它的源語(yǔ)言是什麼,目標(biāo)語(yǔ)言是什麼,還有它的實(shí)現(xiàn)語(yǔ)言是什麼。常使用T型圖來(lái)表示一個(gè)編譯程序所涉及的三個(gè)語(yǔ)言。
S:源語(yǔ)言O(shè):目標(biāo)語(yǔ)言T:編譯程序?qū)崿F(xiàn)語(yǔ)言SOT說(shuō)到一個(gè)編譯程序,一定要知道它的源語(yǔ)言是什麼,目標(biāo)語(yǔ)言是什194開(kāi)發(fā)編譯程序
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 北京化工大學(xué)實(shí)驗(yàn)室安全教育與在線考試題庫(kù)A卷
- 小學(xué)數(shù)學(xué)二年級(jí)整十整百整千數(shù)加減法口算練習(xí)990道
- 《如何玩轉(zhuǎn)轉(zhuǎn)介營(yíng)銷》課件
- 《抽樣檢驗(yàn)相關(guān)知識(shí)》課件
- 金融行業(yè)采購(gòu)標(biāo)書撰寫技巧
- 旅游行業(yè)服務(wù)員培訓(xùn)感悟
- 運(yùn)輸行業(yè)安全生產(chǎn)工作總結(jié)
- 制造業(yè)人才培養(yǎng)策略
- 內(nèi)科部門全面工作總結(jié)
- 網(wǎng)絡(luò)科技企業(yè)保安工作總結(jié)
- 工地鋼板短期出租合同模板
- 女排精神課件教學(xué)課件
- 2024年湖南省公務(wù)員考試《行測(cè)》真題及答案解析
- 超市消防安全巡查制度
- 《美洲》名師課件(第2課時(shí))
- GB/T 9445-2024無(wú)損檢測(cè)人員資格鑒定與認(rèn)證
- 超聲科危急值內(nèi)容及報(bào)告制度
- 河南省鄭州市2023-2024學(xué)年高二上學(xué)期期末考試 物理 含解析
- 財(cái)務(wù)崗位招聘筆試題及解答(某大型國(guó)企)2025年
- 2024年代打包發(fā)貨合作協(xié)議書模板
- 天津市2023-2024學(xué)年七年級(jí)上學(xué)期期末考試數(shù)學(xué)試題(含答案)
評(píng)論
0/150
提交評(píng)論