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