传统编译原理
傳統(tǒng)編譯原理
計(jì)算機(jī)程序編譯原理,把程序員員容易理解的高級語言程序代碼流,翻譯成計(jì)算機(jī)可執(zhí)行的機(jī)器指令代碼流。可以使用“一斷、二比、三譯”形象說明實(shí)質(zhì)。
1、斷。按照語言的語法規(guī)則掃描斷詞,結(jié)合文法詞典,把程序字符串流,分解成為計(jì)算機(jī)語言能夠識別的基本單元(標(biāo)識詞、運(yùn)算符)。
2、比。從程序流中找出擴(kuò)展標(biāo)識詞的定義,建立標(biāo)識詞結(jié)構(gòu),放入文法詞典,服務(wù)于新的定義和函數(shù)程序代碼的編譯。程序語句、表達(dá)式里面使用的標(biāo)識可以從詞典中比較找到。
3、譯。把函數(shù)程序文本字符串流中的算術(shù)表達(dá)式、賦值語句、控制語句,翻譯成為計(jì)算機(jī)機(jī)器語言二進(jìn)制代碼流。
4、組裝函數(shù)翻譯后的二進(jìn)制代碼流,明確數(shù)據(jù)空間地址和大小,生成計(jì)算機(jī)裸機(jī)或操作系統(tǒng)可以執(zhí)行目標(biāo)代碼。
1、 翻譯——將語言L1轉(zhuǎn)換為邏輯上等價(jià)的語言L2
編譯——將源程序(高級語言)翻譯成目標(biāo)程序(低級語言或機(jī)器語言)
匯編——將低級語言翻譯成機(jī)器語言
解釋(程序)——逐條翻譯語句,并立即執(zhí)行結(jié)果
2、 單詞——關(guān)鍵字、標(biāo)識符、常數(shù)、界符、運(yùn)算符
單詞 = (單詞種別碼,單詞自身值)
語法單位——短語、表達(dá)式、語句、子程序、程序
中間代碼——四元式、三元式、逆波蘭式、樹式
3、 初等數(shù)據(jù)類型——邏輯、數(shù)值、字符、指針
語法:是一組規(guī)則,規(guī)定了語言的形式結(jié)構(gòu),包括單詞結(jié)構(gòu),句子結(jié)構(gòu),程序結(jié)構(gòu)等。
語法={詞法規(guī)則+句法規(guī)則}
語義:也是一組規(guī)則,規(guī)定了各語法單位的確切含義。
語句
說明性語句——用于定義各種數(shù)據(jù)類型,變量,函數(shù)或過程.
可執(zhí)行性語句——用于描述數(shù)據(jù)處理的過程和動(dòng)作
4、 參數(shù)傳遞——傳名、傳地址、傳值
5、正規(guī)式
6、狀態(tài)轉(zhuǎn)換圖
是一有向圖,由有限個(gè)結(jié)點(diǎn)及有向邊連接而成;
每個(gè)結(jié)點(diǎn)稱為狀態(tài);
狀態(tài)圖有一個(gè)初態(tài),多個(gè)終態(tài);
每條邊上有相應(yīng)的字符.
狀態(tài)轉(zhuǎn)換圖用于表示單詞結(jié)構(gòu)從狀態(tài)轉(zhuǎn)換圖的初態(tài)到終態(tài)間,每條路徑上字符的連接,就構(gòu)成了該狀態(tài)圖的合法單詞.
可以表示單詞規(guī)則,也可以用于識別單詞
由三種結(jié)構(gòu)構(gòu)成 —— 分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、終結(jié)點(diǎn)
7、 確定有限自動(dòng)機(jī)(DFM)和非確定有限自動(dòng)機(jī)(NFM)
DFAM=(S, ∑, f,s0,Z)
狀態(tài)集、符號集、單/多值映射函數(shù)、初態(tài)(1個(gè))、終態(tài)集
DFAM 是 NFAM 的特例
DFAM案例:
NFAM案例:
8、 可識別單詞的全體記為:L(M)
設(shè) V 為字集,且 V0={ε}, 令 V*=V0∪V1 ∪ V2 ∪… ,稱V* 為V的閉包。 V+= V* - {ε}, 稱V+ 為V的正則閉包。
9、 句子——由文法的開始符號出發(fā)通過0步或若干步推導(dǎo)產(chǎn)生的終結(jié)符號串
若 S=>α,則α ∈VT *
句型——由文法的開始符號出發(fā)通過0步或若干步推導(dǎo)產(chǎn)生的符號串
若 S=>α,則α ∈(VT ∪ VN) *
10、語言——所有句子的集合,記為L(G)={α |S=>α, α ∈VT * }
一個(gè)語言的文法是不唯一的
11、句柄——一個(gè)句型的最左直接短語
簡單(直接)短語
短語
素短語——至少含有一個(gè)終結(jié)點(diǎn),且除自身外不含有更小的素短語
12、 上下文無關(guān)文法——它定義的語法單位獨(dú)立于該語法單位可能出現(xiàn)的環(huán)境
自然語言不是上下文無關(guān)文法,程序語言是上下文無關(guān)文法
G =(VT,VN,S,P)
終結(jié)符集、非終結(jié)符集、開始符號、產(chǎn)生式
13、最左推導(dǎo)——每次直接推導(dǎo),對句型的最左非終結(jié)符實(shí)行替換
最右推導(dǎo)——每次直接推導(dǎo),對句型的最右非終結(jié)符實(shí)行替換
解決語法二義性:E—>i*i+i
14、語法分析方法_自下而上
根據(jù)文法,對輸入字串進(jìn)行歸約,若能正確地歸約 為文法的初始符號,則表示輸入字串是合法的。典型方法是算符優(yōu)先分析法。
規(guī)范歸約(歸約棧)——最右推導(dǎo)的逆過程(算符優(yōu)先分析法)
(1)優(yōu)先關(guān)系表
?
o aQb a=b
o aQ a<FIRSTVT(Q)
o Qb LASTVT(Q)>b
(2)存在的問題
1.文法的左遞歸
2.文法的回溯
15、語法分析方法_自上而下
從文法的初始符號進(jìn)行推導(dǎo),若能推導(dǎo)出與輸入字串相同的句子,則表示輸入字串是合法的。 典型方法是遞歸下降分析法。
規(guī)范推導(dǎo)——最左推導(dǎo)的逆過程(遞歸下降分析法)
16、歸約串——棧頂形成的某產(chǎn)生式候選
可歸約串(最左素短語)——可正確歸約的歸約串
17、語法樹 —— 可以表示同一句型的多種推導(dǎo),是多種推導(dǎo)的共性抽象;但未必代表了同一句型的所有推導(dǎo)
LL(1)文法(無回溯文法)——無二義性、無左遞歸
LR(0)<SLR(1)<LALR(1)<LR(1)
18、消除左遞歸
若 P→P α | β ,則 P→ β P ’, P’ → αP ’ | ε
19、 符號表的作用:用于紀(jì)錄各種名字的信息, 并提供給編譯各階段使用
種屬、類型、地址、長度、形參標(biāo)志、其它信息
20、中間代碼的特點(diǎn): 結(jié)構(gòu)簡單,功能明確,易于優(yōu)化,易于翻譯。
21、語法制導(dǎo)翻譯——在語法分析的每次歸約或推導(dǎo)時(shí),根據(jù)產(chǎn)生式的語義進(jìn)行翻譯的一種方法。
一些基本操作:
? newtemp( ) 產(chǎn)生一臨時(shí)變量;
? gen(操作符,操作數(shù)1,操作數(shù)2,結(jié)果) 填入四元式表;
? fill( i,屬性) 填入符號表;
? entry( i ) 查符號表,返回 i 在符號表中的位置;
? backpatch( m,n) 把 n 填入 四元式表第 m 個(gè)四元式中;
22、語義動(dòng)作——描述了一定的輸入和一定的輸出之間的對應(yīng)關(guān)系。
24、基本塊——順序執(zhí)行的中間代碼序列,僅包含一個(gè)入口四元式和一個(gè)出口四元式。第一條四元式為入口四元式,最后一條四元式為出口四元式,中間部分不含轉(zhuǎn)移四元式。
四元式程序中所有基本入口四元式,包括:
a) 程序的第一條四元式;
b) 轉(zhuǎn)移語句轉(zhuǎn)移到的四元式;
c) 條件語句之后的第一條四元式.
基本塊內(nèi)可以進(jìn)行以下幾種優(yōu)化:(優(yōu)化手段: DAG )
合并已知量,刪除多余運(yùn)算(公共子表達(dá)式),刪除無用賦值。
25、回邊——若有邊b->a且a是b的必經(jīng)結(jié)點(diǎn),則b->a是回邊
控制流程圖——具有唯一首結(jié)點(diǎn)的有向圖,簡稱為流圖
必經(jīng)結(jié)點(diǎn)——從流圖首結(jié)點(diǎn)出發(fā)到達(dá)b的通路都必須經(jīng)過點(diǎn)a,則稱a是b的必經(jīng)結(jié)點(diǎn),記a DOM b
必經(jīng)結(jié)點(diǎn)集——D(n)
26、可歸約流圖——流圖中去除回邊后,構(gòu)成無環(huán)路流圖
循環(huán)——對于回邊b->a,包括a、b在內(nèi)的,有通路到b而不經(jīng)過a的所有結(jié)點(diǎn)構(gòu)成一個(gè)循環(huán)
(1) 結(jié)點(diǎn)序列為強(qiáng)連通的;(任意兩點(diǎn)間都有通路,且通路上的結(jié)點(diǎn)都屬于結(jié)點(diǎn)序列)
(2) 結(jié)點(diǎn)序列中僅有一個(gè)入口結(jié)點(diǎn).
三種循環(huán)優(yōu)化:代碼外提,強(qiáng)度削弱,刪除歸納變量。
27、引用–定值集ud[A]
如在 u 處引用了變量 A,則凡能到達(dá) u 的 A 的所有定值點(diǎn),構(gòu)成了 A 在 u 處的引用–定值集 ,記為: ud[A].
?
o IN[B] : 代表到達(dá)基本塊 B 入口點(diǎn)時(shí)的各變量的所有定值點(diǎn)集
o OUT[B]:代表到達(dá)基本塊 B 出口點(diǎn)時(shí)的各變量的所有定值點(diǎn)集
o GEN[B]:表示 B 中所定值的且到達(dá) B 之后的定值點(diǎn)集
o KILL[B]: 表示屬于 B 外的定值點(diǎn),而這些定值點(diǎn)所定值的變量,在B中又被重新定值
這幾個(gè)集合滿足如下方程:
?
o OUT[B]=(IN[B] - KILL(B)) ∪ GEN[B]
o IN[B] = OUT[p1] ∪ OUT[p2] ∪… ∪ OUT[pk]
o p1 , p2… pk 為B的前趨結(jié)點(diǎn)
該方程即為到達(dá)–定值方程,求解該方程,得到IN[B]。
28、不變運(yùn)算——對于循環(huán)中的語句 A:= B op C, 若 B 及 C 均為常量,或者為循環(huán)中未改變的變量, 那么每次循環(huán) A的值都一樣,稱A:= B op C為不變運(yùn)算.
運(yùn)算對象是常量;
運(yùn)算對象的定值點(diǎn)均在循環(huán)外;
運(yùn)算對象的再循環(huán)內(nèi)的定值點(diǎn)均已被標(biāo)記為不變運(yùn)算;
29、基本歸納變量——若循環(huán)中對 B 只有唯一的遞歸賦值 B:=B+C 且 C 為循環(huán)不變量,則稱 B 為循環(huán)的基本歸納變量
歸納變量——若B為基本歸納變量,而A在循環(huán)中的定值可以化歸為B的線性函數(shù): A:=C1*B+C2(C1 , C2為循環(huán)不變量),則稱A 為歸納變量,并稱 A與 B同族
待用信息表——指針指向下一個(gè)引用的地方
設(shè)四元式(i) 對A定值且到達(dá)四元式( j) ,四元式 ( j) 中引用 A ,則稱 j 是四元式 i 的變量A 的待用信息; 滿足上述定義的所有 j, 構(gòu)成了 A 的待用信息集。
30、目標(biāo)代碼
生成原則:
(1) 生成的目標(biāo)代碼短而高效;
(2) 充分利用寄存器,減少訪問內(nèi)存的次數(shù);
形式:
(1)能立即執(zhí)行的目標(biāo)代碼;
(2)待裝配的浮動(dòng)目標(biāo)代碼;
(3)匯編語言目標(biāo)代碼;
31、空間分配
參考鏈接:
https://www.cnblogs.com/sweetyu/p/4947030.html
總結(jié)
- 上一篇: LLVM基础技术图例
- 下一篇: OpenArkCompiler方舟编译