-
>
全國計算機等級考試最新真考題庫模擬考場及詳解·二級MSOffice高級應用
-
>
決戰行測5000題(言語理解與表達)
-
>
軟件性能測試.分析與調優實踐之路
-
>
第一行代碼Android
-
>
JAVA持續交付
-
>
EXCEL最強教科書(完全版)(全彩印刷)
-
>
深度學習
編譯原理 版權信息
- ISBN:9787030734396
- 條形碼:9787030734396 ; 978-7-03-073439-6
- 裝幀:一般膠版紙
- 冊數:暫無
- 重量:暫無
- 所屬分類:>
編譯原理 內容簡介
本書圍繞編譯程序分析、設計和實現方面的主題,介紹上下文無關文法、有限自動機的基礎知識,以及構造程序設計語言編譯程序的一般原理、設計方法和實現技術,包括詞法分析、語法分析、語義分析、中間代碼生成、目標代碼生成、運行時刻環境和代碼優化;設計了一個案例語言,給出該語言翻譯器的分析、設計和實現的完整過程;介紹了開源編譯器GCC的邏輯結構、典型中間代碼形式和存儲管理策略,也圍繞目標文件介紹了匯編和鏈接。 本書可以作為高校計算機科學與技術等相關專業的本科生教材,也可以作為相關專業教師和學生的參考書。
編譯原理 目錄
第1章 引論 1
1.1 編譯器 1
1.2 編譯器的結構 2
1.2.1 詞法分析 3
1.2.2 語法分析 3
1.2.3 語義分析 4
1.2.4 中間代碼生成 4
1.2.5 代碼優化 5
1.2.6 目標代碼生成 5
1.2.7 編譯器的組織 5
1.3 GCC概述 6
1.3.1 GCC的語言處理過程 6
1.3.2 GCC的邏輯結構 7
1.4 編譯程序的發展 8
1.4.1 程序設計語言的發展 8
1.4.2 編譯技術的發展 8
習題 9
第2章 上下文無關文法和分析 10
2.1 概述 10
2.2 符號串及運算 11
2.3 文法 12
2.3.1 上下文無關文法的定義 12
2.3.2 推導和歸約 13
2.3.3 文法定義的語言 14
2.3.4 文法的分類 15
2.3.5 文法在應用中的說明 17
2.4 語法樹 18
2.4.1 語法樹的定義 18
2.4.2 文法的二義性 20
2.4.3 短語和句柄 21
習題 22
第3章 詞法分析 25
3.1 正規表達式 25
3.2 有限自動機 26
3.2.1 確定的有限自動機 27
3.2.2 非確定的有限自動機 28
3.2.3 含e的非確定的有限自動機 28
3.2.4 非確定有限自動機的確定化 29
3.2.5 確定有限自動機的*小化 31
3.3 正規表達式和有限自動機 32
3.3.1 從正規表達式到有限自動機 32
3.3.2 從有限自動機到正規表達式 33
3.4 有限自動機和正規文法 35
3.5 詞法分析程序 36
3.5.1 DFA的實現 36
3.5.2 詞法分析程序實現應考慮的問題 37
習題 39
第4章 語法分析 42
4.1 自頂向下的語法分析 42
4.1.1 確定的自頂向下語法分析 42
4.1.2 LL(1)文法 46
4.1.3 左遞歸和左公因子的消除 49
4.1.4 遞歸下降的語法分析 51
4.1.5 表驅動的語法分析 53
4.2 自底向上的語法分析 55
4.2.1 移進-歸約的語法分析 55
4.2.2 LR語法分析 57
4.2.3 項目和項目集 60
4.2.4 LR(0)分析表構造 62
4.2.5 SLR(1)分析表構造 64
4.2.6 LR(1)分析表構造 66
4.2.7 LALR(1)分析表構造 68
4.3 語法錯誤的恢復 71
4.3.1 遞歸下降分析中的語法錯誤的恢復 71
4.3.2 LL分析中的語法錯誤的恢復 73
4.3.3 LR語法分析中的語法錯誤的恢復 74
習題 75
第5章 語義分析 77
5.1 語義分析概述 77
5.2 屬性文法 78
5.2.1 屬性文法及相關概念 78
5.2.2 語法制導定義 80
5.3 屬性計算 81
5.3.1 依賴圖 81
5.3.2 屬性的計算順序 83
5.3.3 S屬性和L屬性的語法制導定義 83
5.4 語法制導翻譯 85
5.4.1 自頂向下語法分析中屬性計算 85
5.4.2 自底向上語法分析中綜合屬性計算 92
5.4.3 自底向上語法分析中繼承屬性計算 94
5.5 符號表 98
5.5.1 符號表的作用 98
5.5.2 符號的屬性和存儲方法 99
5.5.3 符號表的設計 103
5.5.4 符號表的管理 105
5.5.5 嵌套作用域的管理 105
5.6 聲明 109
5.7 類型檢查 110
5.7.1 類型表達式 110
5.7.2 類型檢查規則 112
5.7.3 類型轉換 112
習題 113
第6章 中間代碼生成 119
6.1 中間代碼概述 119
6.1.1 線性中間代碼 119
6.1.2 樹型中間代碼 121
6.1.3 圖式中間代碼 121
6.2 賦值語句的翻譯 122
6.2.1 簡單賦值語句的翻譯 123
6.2.2 數組引用的翻譯 125
6.3 布爾表達式的翻譯 127
6.3.1 直接對布爾表達式求值 128
6.3.2 通過控制流翻譯布爾表達式 129
6.4 典型控制結構的翻譯 132
6.5 GCC的中間代碼 134
6.5.1 GENERIC 134
6.5.2 GIMPLE 135
6.5.3 RTL 136
習題 137
第7章 運行時刻環境 139
7.1 存儲組織 139
7.1.1 程序運行時的內存映像 139
7.1.2 存儲分配策略 139
7.2 活動記錄 141
7.2.1 活動記錄的一般結構 141
7.2.2 變長數據的分配 143
7.3 基于棧的過程管理 143
7.3.1 過程調用和返回 143
7.3.2 過程間的值傳遞 145
7.4 非局部變量的訪問 147
7.4.1 無嵌套過程的非局部變量 148
7.4.2 過程嵌套定義的非局部變量 148
7.5 GCC的存儲管理策略 151
7.5.1 程序運行時的內存映像 151
7.5.2 x86-64棧結構 152
7.5.3 函數和參數 153
習題 156
第8章 代碼優化 160
8.1 基本塊和流圖 160
8.1.1 基本塊 160
8.1.2 流圖 161
8.1.3 循環 161
8.2 數據流分析 163
8.2.1 數據流分析模式 163
8.2.2 到達定值分析 163
8.2.3 活躍變量分析 166
8.2.4 可用表達式分析 167
8.3 窺孔優化 170
8.4 基本塊的優化 171
8.4.1 基本塊的有向無環圖表示 172
8.4.2 基于DAG的代碼重建 175
8.5 循環優化 175
8.5.1 代碼外提 175
8.5.2 歸納變量相關的優化 178
習題 179
第9章 目標代碼生成 182
9.1 代碼生成的主要問題 182
9.1.1 指令選擇 182
9.1.2 寄存器分配 183
9.1.3 指令調度 183
9.2 一個簡單的代碼生成器 184
9.2.1 目標語言 184
9.2.2 一個目標代碼生成算法 186
9.2.3 表達式優化代碼的生成 189
9.3 基于圖著色的寄存器分配 191
9.4 目標文件 192
9.4.1 目標文件格式 193
9.4.2 匯編 195
9.4.3 鏈接 197
習題 199
第10章 簡單語言的翻譯程序 202
10.1 源語言及其定義 202
10.1.1 語法定義 202
10.1.2 其他約束 204
10.2 詞法分析的實現 205
10.2.1 詞法記號 205
10.2.2 詞法單元的定義 206
10.2.3 單詞的識別 206
10.3 語法分析的實現 208
10.3.1 文法的分析和變換 208
10.3.2 遞歸下降的語法分析程序 209
10.4 符號表的實現 210
10.4.1 符號表的設計 210
10.4.2 符號表的管理 212
10.5 中間代碼生成 213
10.5.1 中間代碼的定義 214
10.5.2 生成中間代碼的構造 215
10.5.3 中間代碼生成和優化 220
10.6 目標代碼生成 221
10.6.1 虛擬目標機 221
10.6.2 運行時刻環境 223
10.6.3 從中間代碼到目標代碼的轉換 224
10.6.4 虛擬機解釋程序 225
10.7 課程設計 226
參考文獻 229
編譯原理 節選
第1章 引論 1.1 編譯器 一種高級程序設計語言(簡稱高級語言)定義一個編程抽象,這個抽象可以使編程更容易,使編寫的程序可讀性更高、可移植性更好。然而,系統執行高級語言編寫的程序時需要將程序轉換成目標機能夠識別的指令,并將這些指令按照一定的格式存儲在存儲器中。 圖1-1所示的是一個C語言的示例程序test.c,經過gcc-5.4.0編譯產生x86-64目標程序,該目標程序是一個二進制的文件。 圖1-1 C語言的示例程序test.c 圖1-2 目標代碼示例 從上面的示例程序可以看出,編譯器就是一個翻譯程序,將一種語言編寫的源程序翻譯為另一種語言編寫的目標程序。顯然,識別并報告源程序中的錯誤也是編譯器的一個重要任務。在大多數程序員的眼中,編譯器可以看作圖1-3所示的一個“黑箱”。 圖1-3 編譯器 編譯器將源程序轉換成目標程序,系統再將目標程序加載到內存中并運行,*終可以實現程序的輸入處理和輸出。解釋器是另一種程序設計語言處理器,和編譯器一樣,解釋器需要檢查程序的正確性并分析程序的語法和語義。然而,與編譯器不同,解釋器不生成目標程序,而是直接根據源程序和用戶輸入執行程序。一般來說,編譯器產生的目標程序執行比解釋器快,但是解釋器的錯誤診斷效果比編譯器好。 將源程序轉換成可執行目標程序時,編譯器往往還需要和一些相關程序緊密結合,這些程序包括預處理器、匯編器、鏈接器等。預處理器、編譯器、匯編器和鏈接器一起構成編譯系統。預處理器是在翻譯之前由編譯器調用的獨立程序,主要處理宏定義和文件包含等信息。匯編語言不僅容易轉換成目標機指令,也容易調試,所以為編譯器提供了通用的輸出語言。然而,匯編語言程序還需要經過匯編器轉換成目標代碼。如果程序被分成多個部分進行編譯,那么匯編器得到的多個匯編語言程序還需要通過鏈接器進行鏈接,*后才能得到可執行的目標文件。 1.2 編譯器的結構 編譯將一種語言編寫的源程序映射成另一種語言編寫的目標程序,但是將高級語言程序直接有效地轉換為目標機代碼的映射規則往往難以找到,所以“黑箱”中的映射過程可以分為前端和后端兩個部分(圖1-4)。 圖1-4 編譯器的前端和后端 前端把源程序分解為若干個組成元素,并對這些元素附加語法結構,然后根據這個結構構建源程序的中間表示(Intermediate Representation,IR),同時收集源程序的信息并將其存入符號表。后端根據得到的中間表示和符號表中的信息構建目標程序。簡單地說,前端致力于理解源程序,后端致力于把程序映射到目標機上。 事實上,編譯器在生成目標代碼之前可能使用多種中間表示。這些中間表示的使用可以使編譯器的前端語言和后端機器相對獨立,降低編譯的難度,同時可以更好地支持編譯器的移植。此外,引入中間表示可以將編譯過程進一步細化為若干個轉換階段,每一個階段將源程序由一種中間表示轉換成另一種中間表示。一個典型的編譯過程可以分解為詞法分析、語法分析、語義分析、中間代碼生成、中間代碼優化、目標代碼生成、目標代碼優化,如圖1-5所示。其中,中間代碼優化和目標代碼優化統稱為代碼優化,是可選的步驟。另外,中間表示不一定是被編譯器明確地構建出來的。 圖1-5 編譯器的典型編譯過程 1.2.1 詞法分析 編譯器的**個任務就是詞法分析。詞法分析的任務是從源程序的連續字符序列中識別出有意義的單詞。 對于每個單詞,詞法分析程序將它轉換為一種內部表示形式,稱為詞法單元。詞法單元一般包括單詞的詞法記號和屬性。詞法記號是用于語法分析的抽象記號,可以理解為一類單詞的標簽。典型的詞法記號包括關鍵字、整數、實數、標識符、運算符、分隔符等。單詞*典型的屬性是標識符的名字、整數的數值等。例如,示例程序(圖1-1)中的int、main是關鍵字,3和2是整數,a和b是標識符,“=”和“;”分別是運算符和分隔符。 因此,每個詞法單元可以表示為一個二元組。其中,tokenID表示詞法記號,token_value表示單詞屬性。如果標識符、“=”和“+”的詞法記號分別是id、becomes和addtoken,那么示例程序(圖1-1)中語句sum=a+b經過詞法分析可以輸出如下詞法單元序列: 詞法分析中,對程序執行結果沒有影響的元素將被忽略,如空格、回車符、換行符、制表符、注釋等。此外,如果一個詞法記號僅僅定義一個單詞,那么沒有必要同時使用tokenID和token_value。例如,假設addtoken僅僅是“+”的抽象,那么輸出可以表示為。 1.2.2 語法分析 語法分析程序判定從詞法分析輸出的詞法單元序列是否符合語言的語法結構,并構造其中間表示形式。一種常用的中間表示是樹型結構,稱為語法樹。 示例程序(圖1-1)中語句sum=a+b可以表示為圖1-6所示的樹型結構。其中,每個結點都表示一個語法元素。 語法樹以一種層次定義關系忠實地反映語法元素之間的語法結構,但是語法樹的具體形式依賴于語法元素之間的定義。例如,圖1-6所示的語法樹中,賦值語句通過表達式定義,表達式可以通過表達式遞歸定義,也可以通過標識符直接定義。這種語法關系將采用上下文無關文法進行描述,并進一步構造出有效的語法分析程序。 圖1-6 語法樹示例 1.2.3 語義分析 語法分析在詞性和語法規則上確定句子的合法性,局限于拼寫和語法范疇,但是語法分析忽略單詞的含義。例如,sum=a+b和y=b+c在語法結構上是完全一樣的。因此,在前端將源程序翻譯成中間表示之后,編譯器必須進行語義分析。 語義分析主要根據語言的語義約束檢查程序的一致性,收集相關信息并將其存儲到符號表或者語法樹中。例如,程序(圖1-1)將sum、a和b聲明為整型變量,語義分析程序首先在處理聲明時將這些信息填入符號表或者存儲到語法樹的相應結點中。 語義分析的一個主要任務是類型檢查。例如,針對賦值語句sum=a+b(圖1-1),首先需要根據a和b的類型信息判斷它們是否相容,并進一步確定a+b結果的類型;接著確定sum和a+b結果的類型是否相容。 語義分析和符號表密切相關,但是符號表不只和語義分析相關,它幾乎與編譯器的所有階段都進行交互。詞法分析階段和語法分析階段識別符號的名稱與抽象的詞法記號;語義分析階段將增加數據類型和其他信息;代碼生成階段和代碼優化階段也將利用由符號表提供的信息選出恰當的代碼。 1.2.4 中間代碼生成 中間代碼是在源語言和目標語言之間引入的一種中間表示形式,可以看作某種虛擬機的抽象。通過中間代碼,編譯器可以避開直接從源語言到目標語言翻譯時較大的語義跨度。中間代碼的引入使編譯程序的邏輯結構更加簡單明確,也有利于實現程序優化和編譯器的移植。 中間代碼一般具有兩個重要的性質:容易生成,同時容易轉換成目標機上的程序。樹型結構和線性中間代碼是兩種*重要的中間表示形式。語法樹和抽象語法樹就是樹型結構中間代碼;三地址代碼是一種線性中間代碼,這種代碼類似于匯編指令,每條代碼有三個分量。例如,圖1-1中的賦值語句sum=a+b可以表示為如下的三地址代碼: 其中,T1是存儲加法運算結果的臨時變量。此外,從上面的三地址代碼可以看出,每條指令只能有一個運算,所以指令順序和運算順序一致。更多形式的中間代碼和處理技術將在第6章介紹。 1.2.5 代碼優化 代碼優化的目的是提高程序執行的時空效率,可以分為與機器有關的優化和與機器無關的優化。與機器無關的優化主要針對中間代碼進行,也稱為中間代碼優化;與機器有關的優化主要針對目標代碼進行,也稱為目標代碼優化。 把高級結構和數據存儲運算直接翻譯成代碼,其運行的效率可能比較低。在圖1-1中的sum=a+b,如果直接翻譯,那么得到的目標程序每次運行不僅需要訪問a和b的存儲空間,還需要進行加法運算。如果考慮sum=a+b之前a和b的值是個常量,那么賦值號右邊的a和b可以分別用2和3替換;此外,2+3可由編譯器直接計算并得到結果5。因此,sum=a+b可以被優化為sum=5。 好的優化能夠提高代碼的質量。然而,引入優化使得源代碼和目標代碼之間的關系變得模糊,同時使得程序調試變得困難。其次,不管多么復雜的優化,都不能為所有的程序產生*優代碼,而且很多編譯優化問題都是不可判定的。此外,代碼優化是以增加編譯器的開銷為代價的,所以優化工作量大勢必會降低編譯器編譯源程序的效率。因此,不同的編譯器會在編譯效率和源程序執行效率之間進行權衡,并采用不同的優化策略和優化技術。 1.2.6 目標代碼生成 代碼生成器以源程序或者源程序的中間表示形式作為輸入,并把它映射為目標機上的代碼。代碼生成與目標機的特性密切相關,目標機上的指令格式、尋址達式、寄存器分配、數據表示等都是影響代碼生成的因素。 代碼生成不僅需要確定選擇哪些指令,還要確定指令高效執行的順序,確定哪些值應該放入寄存器中,哪些值放入內存中。因此,指令選擇、寄存器分配、指令的調度是代碼生成的三個主要問題。這三個問題相互作用,對生成代碼的質量有直接的影響。指令選擇就是選擇一組實現中間操作的目標指令集。因為寄存器是存儲層次結構中訪問速度*快的資源,所以操作數存儲在寄存器中的指令比操作數存儲在內存中的指令的執行速度快。然而,寄存器的數量有限,所以一些指令執行之后不得不將其操作數移入內存,為即將執行的指令空出寄存器。從寄存器移進內存或者從內存移進寄存器的指令將增加代碼運行的開銷,所以要充分考慮指令執行順序及其操作數之間的關系,可以盡可能提高代碼的性能。 和代碼生成密切相關的一個問題是如何對源程序中的標識符進行存儲分配,編譯器將在中間代碼或目標代碼生成階段做出存儲分配的決定。 1.2.7 編譯器的組織 編譯器的結構強調編譯程序的邏輯過程和步驟。在實現編譯器的時候,可以將每個步驟組織為一遍,也可以將幾個步驟組織為一遍。每遍讀入一個輸入文件并產生一個輸出,將一種中間表示形式轉換成另一種中間表示形式。例如,可以將詞法分析、語法分析、語義分析和中間代碼生成組織成一遍,代碼生成和代碼優化組織成一遍。 實際上,編譯程序也可以通過一遍完成所有的編譯步驟,這樣的編譯器稱為單遍編譯器。一個典型的單遍編譯器可以按照圖1-7所示的方式組織,其中的核心程序是語法語義分析程序,只有核心程序需要單詞時才會調用詞法分析程序識別一個單詞,同樣只有核心程序需要生成代碼的時候才會調用代碼生成程序。單遍編譯器不用顯式構造中間表示,適合實現翻譯需求相對簡單的程序設計語言。 圖1-7 一個單遍編譯器的模型 和單遍編譯器相對的就是多遍編譯器。在多遍編譯器中,編譯器圍繞一組精心設計的中間表示形式進行組織,每一遍將源程序或一種中間表示形式轉換成另一種表示形式。多遍編譯器比較靈活,適合進行具有復雜語言功能的程序設計語言的翻譯。此外,精心設計的中間表示形式使得編譯器可以將不同的前端和不同的后端結合起來,提高編譯器的可移植性。 1.3 GCC概述 GCC是一套GNU(GNU’s Not UNIX)開發的編譯器環境,不僅支持多種語言,還支持多種硬件平臺。 1.3.1 GCC的語言處理過程 高級程序設計語言程序只有轉化為目標機上的代碼才能執行。GCC將源程序轉換成可執行文件的過程可以細分為4個階段:預處理、編譯、匯
- >
新文學天穹兩巨星--魯迅與胡適/紅燭學術叢書(紅燭學術叢書)
- >
煙與鏡
- >
伯納黛特,你要去哪(2021新版)
- >
隨園食單
- >
羅曼·羅蘭讀書隨筆-精裝
- >
李白與唐代文化
- >
【精裝繪本】畫給孩子的中國神話
- >
經典常談