書上有別那麼懶!。。。。
編譯過程的六個階段:詞法分析,語法分析,語義分析,中間程式碼生成,程式碼最佳化,目的碼生成
解釋程式:把某種語言的源程式轉換成等價的另一種語言程式——目標語言程式,然後再執行目標程式。解釋方式是接受某高階語言的一個語句輸入,進行解釋並控制計算機執行,馬上得到這句的執行結果,然後再接受下一句。
編譯程式:就是指這樣一種程式,透過它能夠將用高階語言編寫的源程式轉換成與之在邏輯上等價的低階語言形式的目標程式(機器語言程式或組合語言程式)。
解釋程式和編譯程式的根本區別:是否生成目的碼
句子的二義性(這裡的二義性是指語法結構上的。):文法G[S]的一個句子如果能找到兩種不同的最左推導(或最右推導),或者存在兩棵不同的語法樹,則稱這個句子是二義性的。
文法的二義性:一個文法如果包含二義性的句子,則這個文法是二義文法,否則是無二義文法。
LL(1)的含義:(LL(1)文法是無二義的; LL(1)文法不含左遞迴)
第1個L:從左到右掃描輸入串 第2個L:生成的是最左推導
1 :向右看1個輸入符號便可決定選擇哪個產生式
某些非LL(1)文法到LL(1)文法的等價變換: 1. 提取公因子 2. 消除左遞迴
文法符號的屬性:單詞的含義,即與文法符號相關的一些資訊。如,型別、值、儲存地址等。
一個屬性文法(attribute grammar)是一個三元組A=(G, V, F)
G:上下文無關文法。
V:屬性的有窮集。每個屬性與文法的一個終結符或非終結符相連。屬性與變數一樣,可以進行計算和傳遞。
F:關於屬性的斷言或謂詞(一組屬性的計算規則)的有窮集。斷言或語義規則與一個產生式相聯,只引用該產生式左端或右端的終結符或非終結符相聯的屬性。
綜合屬性:若產生式左部的單非終結符A的屬性值由右部各非終結符的屬性值決定,則A的屬性稱為綜合屬
繼承屬性:若產生式右部符號B的屬性值是根據左部非終結符的屬性值或者右部其它符號的屬性值決定的,則B的屬性為繼承屬性。
(1)非終結符既可有綜合屬性也可有繼承屬性,但文法開始符號沒有繼承屬性。
(2) 終結符只有綜合屬性,沒有繼承屬性,它們由詞法程式提供。
在計算時: 綜合屬性沿屬性語法樹向上傳遞;繼承屬性沿屬性語法樹向下傳遞。
語法制導翻譯:是指在語法分析過程中,完成附加在所使用的產生式上的語義規則描述的動作。
語法制導翻譯實現:對單詞符號串進行語法分析,構造語法分析樹,然後根據需要構造屬性依賴圖,遍歷語法樹並在語法樹的各結點處按語義規則進行計算。
中間程式碼(中間語言)
1、是複雜性介於源程式語言和機器語言的一種表示形式。
2、一般,快速編譯程式直接生成目的碼。
3、為了使編譯程式結構在邏輯上更為簡單明確,常採用中間程式碼,這樣可以將與機器相關的某些實現細節置於程式碼生成階段仔細處理,並且可以在中間程式碼一級進行最佳化工作,使得程式碼最佳化比較容易實現。
何謂中間程式碼:源程式的一種內部表示,不依賴目標機的結構,易於程式碼的機械生成。
為何要轉換成中間程式碼:(1)邏輯結構清楚;利於不同目標機上實現同一種語言。
(2)便於移植,便於修改,便於進行與機器無關的最佳化。
中間程式碼的幾種形式:逆波蘭記號 ,三元式和樹形表示 ,四元式
符號表的一般形式:一張符號表的的組成包括兩項,即名字欄和資訊欄。
資訊欄包含許多子欄和標誌位,用來記錄相應名字和種種不同屬性,名字欄也稱主欄。主欄的內容稱為關鍵字(key word)。
符號表的功能:(1)收集符號屬性 (2) 上下文語義的合法性檢查的依據: 檢查識別符號屬性在上下文中的一致性和合法性。(3)作為目的碼生成階段地址分配的依據
符號的主要屬性及作用:
1. 符號名 2. 符號的型別 (整型、實型、字串型等))3. 符號的儲存類別(公共、私有)
4. 符號的作用域及可視性 (全域性、區域性) 5. 符號變數的儲存分配資訊 (靜態儲存區、動態儲存區)
儲存分配方案策略:靜態儲存分配;動態儲存分配:棧式、 堆式。
靜態儲存分配
1、基本策略
在編譯時就安排好目標程式執行時的全部資料空間,並能確定每個資料項的單元地址。
2、適用的分配物件:子程式的目的碼段;全域性資料目標(全域性變數)
3、靜態儲存分配的要求:不允許遞迴呼叫,不含有可變陣列。
FORTRAN程式是段結構,不允許遞迴,資料名大小、性質固定。 是典型的靜態分配
動態儲存分配
1、如果一個程式設計語言允許遞迴過程、可變陣列或允許使用者自由申請和釋放空間,那麼,就需要採用動態儲存管理技術。
2、兩種動態儲存分配方式:棧式,堆式
棧式動態儲存分配
分配策略:將整個程式的資料空間設計為一個棧。
【例】在具有遞迴結構的語言程式中,每當呼叫一個過程時,它所需的資料空間就分配在棧頂,每當過程工作結束時就釋放這部分空間。
過程所需的資料空間包括兩部分
一部分是生存期在本過程這次活動中的資料物件。如區域性變數、引數單元、臨時變數等;
另一部分則是用以管理過程活動的記錄資訊(連線資料)。
活動記錄(AR)
一個過程的一次執行所需要的資訊使用一個連續的儲存區來管理,這個區 (塊)叫做一個活動記錄。
構成
1、臨時工作單元;2、區域性變數;3、機器狀態資訊;4、存取鏈;
5、控制鏈;6、實參;7、返回地址
什麼是程式碼最佳化
所謂最佳化,就是對程式碼進行等價變換,使得變換後的程式碼執行結果與變換前程式碼執行結果相同,而執行速度加快或佔用儲存空間減少。
最佳化原則:等價原則:經過最佳化後不應改變程式執行的結果。
有效原則:使最佳化後所產生的目的碼執行時間較短,佔用的儲存空間較小。
合算原則:以儘可能低的代價取得較好的最佳化效果。
常見的最佳化技術
基本塊定義
程式中只有一個入口和一個出口的一段順序執行的語句序列,稱為程式的一個基本塊。
給我分數啊。。。
書上有別那麼懶!。。。。
編譯過程的六個階段:詞法分析,語法分析,語義分析,中間程式碼生成,程式碼最佳化,目的碼生成
解釋程式:把某種語言的源程式轉換成等價的另一種語言程式——目標語言程式,然後再執行目標程式。解釋方式是接受某高階語言的一個語句輸入,進行解釋並控制計算機執行,馬上得到這句的執行結果,然後再接受下一句。
編譯程式:就是指這樣一種程式,透過它能夠將用高階語言編寫的源程式轉換成與之在邏輯上等價的低階語言形式的目標程式(機器語言程式或組合語言程式)。
解釋程式和編譯程式的根本區別:是否生成目的碼
句子的二義性(這裡的二義性是指語法結構上的。):文法G[S]的一個句子如果能找到兩種不同的最左推導(或最右推導),或者存在兩棵不同的語法樹,則稱這個句子是二義性的。
文法的二義性:一個文法如果包含二義性的句子,則這個文法是二義文法,否則是無二義文法。
LL(1)的含義:(LL(1)文法是無二義的; LL(1)文法不含左遞迴)
第1個L:從左到右掃描輸入串 第2個L:生成的是最左推導
1 :向右看1個輸入符號便可決定選擇哪個產生式
某些非LL(1)文法到LL(1)文法的等價變換: 1. 提取公因子 2. 消除左遞迴
文法符號的屬性:單詞的含義,即與文法符號相關的一些資訊。如,型別、值、儲存地址等。
一個屬性文法(attribute grammar)是一個三元組A=(G, V, F)
G:上下文無關文法。
V:屬性的有窮集。每個屬性與文法的一個終結符或非終結符相連。屬性與變數一樣,可以進行計算和傳遞。
F:關於屬性的斷言或謂詞(一組屬性的計算規則)的有窮集。斷言或語義規則與一個產生式相聯,只引用該產生式左端或右端的終結符或非終結符相聯的屬性。
綜合屬性:若產生式左部的單非終結符A的屬性值由右部各非終結符的屬性值決定,則A的屬性稱為綜合屬
繼承屬性:若產生式右部符號B的屬性值是根據左部非終結符的屬性值或者右部其它符號的屬性值決定的,則B的屬性為繼承屬性。
(1)非終結符既可有綜合屬性也可有繼承屬性,但文法開始符號沒有繼承屬性。
(2) 終結符只有綜合屬性,沒有繼承屬性,它們由詞法程式提供。
在計算時: 綜合屬性沿屬性語法樹向上傳遞;繼承屬性沿屬性語法樹向下傳遞。
語法制導翻譯:是指在語法分析過程中,完成附加在所使用的產生式上的語義規則描述的動作。
語法制導翻譯實現:對單詞符號串進行語法分析,構造語法分析樹,然後根據需要構造屬性依賴圖,遍歷語法樹並在語法樹的各結點處按語義規則進行計算。
中間程式碼(中間語言)
1、是複雜性介於源程式語言和機器語言的一種表示形式。
2、一般,快速編譯程式直接生成目的碼。
3、為了使編譯程式結構在邏輯上更為簡單明確,常採用中間程式碼,這樣可以將與機器相關的某些實現細節置於程式碼生成階段仔細處理,並且可以在中間程式碼一級進行最佳化工作,使得程式碼最佳化比較容易實現。
何謂中間程式碼:源程式的一種內部表示,不依賴目標機的結構,易於程式碼的機械生成。
為何要轉換成中間程式碼:(1)邏輯結構清楚;利於不同目標機上實現同一種語言。
(2)便於移植,便於修改,便於進行與機器無關的最佳化。
中間程式碼的幾種形式:逆波蘭記號 ,三元式和樹形表示 ,四元式
符號表的一般形式:一張符號表的的組成包括兩項,即名字欄和資訊欄。
資訊欄包含許多子欄和標誌位,用來記錄相應名字和種種不同屬性,名字欄也稱主欄。主欄的內容稱為關鍵字(key word)。
符號表的功能:(1)收集符號屬性 (2) 上下文語義的合法性檢查的依據: 檢查識別符號屬性在上下文中的一致性和合法性。(3)作為目的碼生成階段地址分配的依據
符號的主要屬性及作用:
1. 符號名 2. 符號的型別 (整型、實型、字串型等))3. 符號的儲存類別(公共、私有)
4. 符號的作用域及可視性 (全域性、區域性) 5. 符號變數的儲存分配資訊 (靜態儲存區、動態儲存區)
儲存分配方案策略:靜態儲存分配;動態儲存分配:棧式、 堆式。
靜態儲存分配
1、基本策略
在編譯時就安排好目標程式執行時的全部資料空間,並能確定每個資料項的單元地址。
2、適用的分配物件:子程式的目的碼段;全域性資料目標(全域性變數)
3、靜態儲存分配的要求:不允許遞迴呼叫,不含有可變陣列。
FORTRAN程式是段結構,不允許遞迴,資料名大小、性質固定。 是典型的靜態分配
動態儲存分配
1、如果一個程式設計語言允許遞迴過程、可變陣列或允許使用者自由申請和釋放空間,那麼,就需要採用動態儲存管理技術。
2、兩種動態儲存分配方式:棧式,堆式
棧式動態儲存分配
分配策略:將整個程式的資料空間設計為一個棧。
【例】在具有遞迴結構的語言程式中,每當呼叫一個過程時,它所需的資料空間就分配在棧頂,每當過程工作結束時就釋放這部分空間。
過程所需的資料空間包括兩部分
一部分是生存期在本過程這次活動中的資料物件。如區域性變數、引數單元、臨時變數等;
另一部分則是用以管理過程活動的記錄資訊(連線資料)。
活動記錄(AR)
一個過程的一次執行所需要的資訊使用一個連續的儲存區來管理,這個區 (塊)叫做一個活動記錄。
構成
1、臨時工作單元;2、區域性變數;3、機器狀態資訊;4、存取鏈;
5、控制鏈;6、實參;7、返回地址
什麼是程式碼最佳化
所謂最佳化,就是對程式碼進行等價變換,使得變換後的程式碼執行結果與變換前程式碼執行結果相同,而執行速度加快或佔用儲存空間減少。
最佳化原則:等價原則:經過最佳化後不應改變程式執行的結果。
有效原則:使最佳化後所產生的目的碼執行時間較短,佔用的儲存空間較小。
合算原則:以儘可能低的代價取得較好的最佳化效果。
常見的最佳化技術
基本塊定義
程式中只有一個入口和一個出口的一段順序執行的語句序列,稱為程式的一個基本塊。
給我分數啊。。。