版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
CompilersPrinciples主講教師:陳大玲
課程要求熟練掌握C、Pascal語言的編程、語法結(jié)構(gòu);會一種程序設(shè)計語言的編程;會一種數(shù)據(jù)庫開發(fā)語言,或熟悉文件的管理;按時完成作業(yè);按課程的進(jìn)程,按時完成課程實驗;認(rèn)真聽講,認(rèn)真作筆記,上課不得遲到早退上課不得喧嘩。2023/2/33第1章
編譯概述
什么是編譯程序
編譯原理這門課程主要介紹設(shè)計和構(gòu)造編譯程序的基本原理和常用的技術(shù)和方法。本章重點介紹編譯程序的基本概念。編譯的過程編譯程序的結(jié)構(gòu)什么是編譯程序
計算機只能識別機器語言,不能識別自然語言或高級語言,那么我們的高級語言程序是如何在計算機上執(zhí)行的呢?在計算機上執(zhí)行一個高級語言程序一般要分兩步:第一步:用一個翻譯程序把高級語言翻譯成機器語言程序;第二步:運行所得的機器語言程序求得計算結(jié)果。第二步我們暫時不考慮,那么第一步“翻譯程序”是我們這門課討論的重點,什么樣的程序叫翻譯程序?翻譯程序是如何翻譯的?世界上第一個編譯程序—FORTRAN編譯程序是20世紀(jì)50年代中期研制成功的。2023/2/351.1翻譯程序與編譯程序
翻譯程序是指這樣一個程序,它把一種語言(稱作源語言)所寫的程序(源程序)翻譯成等價的另一種語言(稱作目標(biāo)語言)的程序(目標(biāo)程序)。
高級語言程序機器語言程序翻譯程序#include<stdio.h>intmain(void){ printf("hello,world\n"); return0;}00001010…..2023/2/361.1翻譯程序與編譯程序
編譯程序是一種翻譯程序,它將高級語言所寫的源程序翻譯成等價的機器語言或匯編語言的目標(biāo)程序。
源程序高級語言程序編譯程序目標(biāo)程序匯編語言或者機器語言程序
定義:假設(shè),SL指源語言程序,TL指目標(biāo)語言程序,則:1.翻譯程序--把SL變換為TL的程序,SL與TL邏輯上等價。2.編譯程序--SL為高級語言、TL為低級語言的翻譯程序。3.匯編程序--SL為匯編語言程序,TL為機器語言程序。4.解釋程序--逐條翻譯,且立即執(zhí)行,不生成目標(biāo)程序。2023/2/38程序運行階段
采用編譯方式在計算機上執(zhí)行用高級語言編寫的程序,需分階段進(jìn)行。第一種情況:源程序編譯程序機器語言目標(biāo)程序初始數(shù)據(jù)運行系統(tǒng)結(jié)果編譯階段運行階段高級語言程序2023/2/39第二種情況:源程序編譯程序機器語言目標(biāo)程序初始數(shù)據(jù)運行系統(tǒng)結(jié)果編譯階段運行階段匯編程序匯編語言目標(biāo)程序匯編階段高級語言程序程序運行階段2023/2/3101.2編譯過程與編譯程序的基本結(jié)構(gòu)
將英文句子“Iwishyousuccess”翻譯成中文句子的大致過程是:
詞法分析
語法分析
語義分析
修飾工作
翻譯成文
2023/2/311
編譯過程
編譯程序是將一種語言形式翻譯成另一種語言形式,因此,其工作過程一般可劃分為如下五個階段:
詞法分析
語法分析
語義分析和中間代碼生成
代碼優(yōu)化
目標(biāo)代碼生成2023/2/312floatr,h,s;
s=2*3.1416*r*(r+h);例如計算圓柱體表面積的程序片斷如下:
編譯過程
2023/2/313
詞法分析階段的任務(wù):對構(gòu)成源程序的字符串從左到右進(jìn)行掃描和分解,根據(jù)語言的詞法規(guī)則,識別出一個一個具有獨立意義的單詞(也稱單詞符號,簡稱符號
)。
單詞分類:基本字(if、else、for、while等)、標(biāo)識符、常數(shù)、算符、界符(標(biāo)點和括號)。1.
詞法分析2023/2/314
詞法規(guī)則是單詞符號的形成規(guī)則,它規(guī)定了哪樣的字符串構(gòu)成一個單詞符號。詞法規(guī)則floatr,h,s;
s=2*3.1416*r*(h+r);例如2023/2/315
上述源程序通過詞法分析識別出如下單詞符號:基本字float 標(biāo)識符r、h、s
常數(shù)3.1416、2 算符*、+界符(、)、;、,、=詞法規(guī)則2023/2/3162.語法分析
語法分析的任務(wù)是在詞法分析的基礎(chǔ)上,根據(jù)語言的語法規(guī)則從單詞符號串中識別出各種語法單位,并進(jìn)行語法檢查,即檢查各種語法單位在語法結(jié)構(gòu)上的正確性。 語法單位:程序、程序段、語句、短語、表達(dá)式。2023/2/317語法規(guī)則
語言的語法規(guī)則規(guī)定了如何從單詞符號形成語法單位,語法規(guī)則是語法單位的形成規(guī)則。floatr,h,s;
s=2*3.1416*r*(h+r);例如2023/2/318語法規(guī)則
單詞符號串s=2*3.1416*r*(h+r)中,“s”是<變量>,單詞符號串
“2*3.1416*r*(h+r)”組合成<表達(dá)式>這樣的語法單位,由<變量>=<表達(dá)式>構(gòu)成<賦值語句>這樣的語法單位。2023/2/3193.語義分析和中間代碼生成
語義分析的任務(wù)是首先對每種語法單位進(jìn)行靜態(tài)的語義審查,然后分析其含義,并用另一種語言形式(比源語言更接近于目標(biāo)語言的一種中間代碼或直接用目標(biāo)語言)來描述這種語義。中間代碼的特點:結(jié)構(gòu)簡單、語義明確、易于轉(zhuǎn)換、易于優(yōu)化。中間代碼的形式:
后綴式、三地址代碼、四元式等。三地址代碼:由指令序列組成,每條指令最多有三個操作數(shù)。四元式的形式是:
(算符,左操作數(shù),右操作數(shù),結(jié)果)2023/2/321
例如,前例中
將s
=2*3.1416*r*(h+r)翻譯成如下形式的四元式中間代碼:(1)(*,2,3.1416,T1)(2)(*,T1, r,T2)(3)(+,h, r,T3)(4)(*,T2,T3,T4)(5)(=,T4,__,s)2023/2/3224.代碼優(yōu)化
代碼優(yōu)化的任務(wù)是對前階段產(chǎn)生的中間代碼進(jìn)行等價變換或改造,以期獲得更為高效(即省時間和空間)的目標(biāo)代碼。優(yōu)化主要包括局部優(yōu)化和循環(huán)優(yōu)化等,例如上述四元式經(jīng)局部優(yōu)化后得:(1)(*,6.28,
r,T2)(2)(+,h,r,T3)(3)(*,T2,T3,T4)(4)(=,T4,__,s)2023/2/3235.目標(biāo)代碼生成
目標(biāo)代碼生成的任務(wù)是將中間代碼變換成特定機器上的絕對指令代碼或可重定位的指令代碼或匯編指令代碼。
2023/2/324表格管理和錯誤處理
編譯程序在工作過程中需要建立一些表格,以登記源程序中所提供的或在編譯過程中所產(chǎn)生的一些信息,編譯各個階段的工作都涉及到構(gòu)造、查找、修改或存取有關(guān)表格中的信息,因此,在編譯程序中必須有一組管理各種表格的程序。
在編譯程序的各個階段中,都要涉及表格管理和錯誤處理。2023/2/325表格管理和錯誤處理
一個好的編譯程序在編譯過程中,應(yīng)具有廣泛的程序查錯能力,并能準(zhǔn)確地報告錯誤的種類及出錯位置,以便用戶查找和糾正,因此,在編譯程序中還必須有一個出錯處理程序。
2023/2/326編譯程序的結(jié)構(gòu)
源程序語義分析和中間代碼生成程序語法分析程序詞法分析程序代碼優(yōu)化程序目標(biāo)代碼生成程序
目標(biāo)程序表格管理程序出錯處理程序(字符串)編譯過程實例:Pascal語言的一條賦值語句:p:=i+r*60;
1.詞法分析結(jié)果是識別出下列單詞符號:標(biāo)識符p
賦值號:=標(biāo)識符i標(biāo)識符r
乘號*整常數(shù)60
分號;2.語法分析可得到如下所示的層次結(jié)構(gòu),稱為語法分析樹,簡稱語法樹(或分析樹)賦值語句表達(dá)式表達(dá)式標(biāo)識符p+表達(dá)式標(biāo)識符表達(dá)式標(biāo)識符表達(dá)式數(shù)ir60*=:緊縮形式表示的語法分析樹::=p+i*r603.語義分析和中間代碼生成類型檢查是語義分析的一個重要部分,按照語言的類型規(guī)則檢查和每個運算符相關(guān)的操作數(shù)。:=p+i*r60inttoreal語義分析插入整型到實型的轉(zhuǎn)換由語義分析得到的分析樹可得到表達(dá)式p:=i+r*60的三地址代碼表示的中間代碼:
t1:=inttoreal(60) t2:=r*t1 t3:=i+t2
p
:=t3:=p+i*r60inttoreal語義分析插入整型到實型的轉(zhuǎn)換由語義分析得到的分析樹可得到表達(dá)式p:=i+r*60的四元式表示的中間代碼:(inttoreal(),60,,T1)(*,r,T1,T2)(+,i,T2,T3)(=,T3,_,p)課堂練習(xí)題:寫出:Z:=Y*(X+0.418)/W的四元式和三地址代碼表示的中間代碼。4.代碼優(yōu)化p:=i+r*60的三地址代碼可優(yōu)化為用下面兩條指令表示:
t1:=r*60.0
p
:=i+t15.目標(biāo)代碼生成例如:使用寄存器R1和R2,代碼 t1:=r*60.0 p:=i+t1可以翻譯成如下的代碼:
MOVFr,R2MULF#60.0,R2MOVFi,R1ADDFR2,R1MOVFR1,p一個語句的翻譯過程示意圖Temp1:=id3*60.0id1:=id2+temp1中間代碼生成器Temp1:=inttoreal(60)Temp2:=id3*temp1Temp3:=id2+temp2id1:=temp3代碼優(yōu)化器代碼生成器MOVFid3,R2MULF#60.0,R2MOVFid2,R1ADDFR2,R1MOVFR1,id1從源程序到中間代碼生成產(chǎn)品編譯程序的結(jié)構(gòu)源程序詞法分析器語法分析器語義分析器中間代碼生成器代碼優(yōu)化器目標(biāo)代碼生成器目標(biāo)程序符號表管理器錯誤處理器分析部分綜合部分
符號表管理符號表
是為每個標(biāo)識符保存一個記錄的數(shù)據(jù)結(jié)構(gòu),記錄著每一個標(biāo)識符的屬性。符號表在各個階段收集的信息一般不同。例如:在C,Pascal語言中的變量定義語句C語言:floatposition,initial,rate;Pascal語言:varposition,initial,rate:real;C語言中在讀到變量名的時候,變量的屬性已經(jīng)知道,可以一起寫入符號表,而Pascal語言中,詞法分析器在程序掃描時,讀到變量名的時候,并不知道標(biāo)識符的屬性,所以,符號表并不一定就記載有標(biāo)識符的屬性。出錯處理一個好的編譯程序不但能最大限度的發(fā)現(xiàn)錯誤,準(zhǔn)確地指出錯誤的性質(zhì)和發(fā)生錯誤的地點,而且能夠把錯誤的范圍縮小到盡可能小的范圍,使程序的其他部分能繼續(xù)編譯下去;如果不僅能發(fā)現(xiàn)錯誤,而且能夠知道校正錯誤就更好啦。源程序中的錯誤分為語法錯誤和語義錯誤
語法錯誤:源程序中不符合語法或詞法規(guī)則的錯誤,可在語法或詞法分析中檢測出來。(非法字符、括號不配、缺少等)
語義錯誤:源程序中不符合語義規(guī)則的錯誤,一般在語義分析中檢測出來,但有的要在運行時才能檢測出來。(說明錯誤、作用域錯誤、類型不一致等)遍 編譯程序具體實現(xiàn)時,受不同源語言、設(shè)計要求、使用對象和計算機條件的限制,往往將編譯程序組織為若干遍。遍:就是對源程序或源程序的中間結(jié)果從頭到位掃描一次,并作有關(guān)的加工,生成新的中間結(jié)果或目標(biāo)程序。通常,一遍的工作,從外存上讀取前一遍的中間結(jié)果開始,完成它的工作后,再將其產(chǎn)生的結(jié)果存到外存上去。例如:我們可以把詞法分析、語法分析及語義分析與中間代碼生成合為一遍。這時,語法分析處于核心位置,當(dāng)他在識別語法結(jié)構(gòu)時需要下一個單詞,他就調(diào)用詞法分析器,一旦識別出一個語法單位時,他就調(diào)用中間代碼生成器。編譯前端與后端編譯前端主要由與源語言有關(guān),但與目標(biāo)機無關(guān)的部分組成。包括:詞法分析、語法分析、語義分析與中間代碼產(chǎn)生,有的代碼優(yōu)化工作也可以包括在前端。編譯后端主要由與目標(biāo)機有關(guān)的部分組成。包括:與目標(biāo)機有關(guān)的代碼優(yōu)化、目標(biāo)代碼生成等??梢匀【幾g程序的前端,改寫其后端生成不同目標(biāo)機上的相同語言的編譯程序。也可以為幾種語言寫出生成相同中間代碼的前端,再配上相同的后端,形成同一臺機器上不同語言的編譯程序。編譯器的伙伴語言擴充程序預(yù)處理器匯編器編譯器裝配器/連接編輯器源程序目標(biāo)匯編程序絕對機器代碼重定位機器代碼庫、重定位目標(biāo)文件圖1-5一個語言處理系統(tǒng)預(yù)處理器預(yù)處理器產(chǎn)生編譯器的輸入,負(fù)責(zé)收集源程序,他可以完成的任務(wù):
(1)宏處理#define…
(2)文件包括例如:#include<math.h>
(3)語言擴充用內(nèi)部宏定義增強老語言的功能(數(shù)據(jù)庫語言、沒有的語句結(jié)構(gòu))。宏處理的幾個名詞:宏定義、宏引用、形式參數(shù)、實在參數(shù)預(yù)處理器舉例說明:
#definemin(a,b)
((a)>(b)?(b):(a))#include<stdio.h>main(){ intm,n,i;m=10;n=15;I=10*min(m,n);printf(“%d\n”,i);}匯編器源程序:b=a+2匯編語言程序:
mova,r1add#2,r1
movr1,b第一次掃描:結(jié)果:標(biāo)識符地址
a0b4第二次掃描:
(可重定位的機器代碼)
0001010000000000*0011011000000010
0010010000000100*裝配器和連接編輯器裝配器的兩個功能:裝入和連接編輯裝入:指的是把可重定位的機器代碼進(jìn)行地址變換,裝入內(nèi)存儲器指定的起始地址。連接編輯:指的是把幾個可重定位的機器代碼文件連接成一個可執(zhí)行的程序。這些文件可以有分別編譯或匯編產(chǎn)生的結(jié)果,也可以有從系統(tǒng)提供的庫文件中取出的內(nèi)容。2023/2/3461.3編譯程序的生成方法
對源語言和目標(biāo)語言認(rèn)真分析
設(shè)計編譯算法
選擇語言編制程序
調(diào)試編譯程序
提交相關(guān)文檔資料
編譯程序是一個復(fù)雜的系統(tǒng)程序,要生成一個編譯程序一般要考慮以下幾方面:2023/2/347編譯程序的自動生成詞法分析程序的自動生成系統(tǒng)LEX語法分析程序自動生成系統(tǒng)YACC編譯程序產(chǎn)生器:可用來自動產(chǎn)生整個編譯程序的軟件工具,它的功能是將任一語言的詞法規(guī)則、語法規(guī)則和語義解釋的描述作為輸入,自動生成該語言的編譯程序。
隨著編譯技術(shù)和自動機理論的發(fā)展,近年來已研制出了一些編譯程序的自動生成系統(tǒng)。如:2023/2/348編譯程序的自動生成
生成編譯程序的方
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度國際船舶租賃合同環(huán)境保護(hù)責(zé)任與履約評估3篇
- 二零二五版?zhèn)€人住房抵押貸款合同2篇
- 2025年度家具租賃服務(wù)合同標(biāo)準(zhǔn)文本4篇
- 2025年肉類加工企業(yè)鮮豬肉原料采購合同3篇
- 2025年度生態(tài)農(nóng)業(yè)園區(qū)商鋪租賃合同規(guī)范2篇
- 2024租賃公司設(shè)備租賃與購買合同
- 二零二五版高壓電纜敷設(shè)電力施工勞務(wù)合同范本2篇
- 二零二五年度礦產(chǎn)品出口與國內(nèi)銷售合同3篇
- 2025年度運動服飾租賃服務(wù)合同樣本3篇
- 2025年度農(nóng)機作業(yè)租賃與農(nóng)村土地流轉(zhuǎn)服務(wù)合同
- 宮腔鏡術(shù)后護(hù)理查房1
- 農(nóng)村勞動力流動對農(nóng)村居民消費的影響研究
- 藏毛囊腫不伴有膿腫的護(hù)理查房
- 創(chuàng)新科技2024年的科技創(chuàng)新和產(chǎn)業(yè)升級
- 喜迎藏歷新年活動方案
- 進(jìn)修人員培養(yǎng)考核鑒定簿
- 四年級上冊脫式計算400題及答案
- 2024年山東省春季高考技能考試汽車專業(yè)試題庫-上(單選題匯總)
- 前程無憂IQ測評題庫
- 《現(xiàn)代電氣控制技術(shù)》課件
- 江蘇決勝新高考2023屆高三年級12月大聯(lián)考英語試題含答案
評論
0/150
提交評論