《現代編譯原理-C語言描述》是2006年4月人民郵電出版社出版的圖書,作者是(美)安佩爾。該書全面講述了現代編譯器的各個組成部分。
基本介紹
- 書名:現代編譯原理-C語言描述
- 作者:(美)安佩爾
- ISBN:9787115145529
- 頁數:385
- 定價:45.00元
- 出版社:人民郵電出版社
- 出版時間:2006年4月
- 裝幀:簡裝本
- 副標題:C語言描述
內容介紹,作品目錄,
內容介紹
《現代編譯原理:C語言描述》全面講述了現代編譯器的結構、編譯算法和實現方法,是Andrew w.Apple的“虎書”——Modern Compiler Implementation——“紅、藍、綠”三序列之一。這三本書的內容基本相同。但是使用不同的語言來實現書中給出的一個編譯器。本書使用的是更適合廣大讀者的c語言,而另外兩本書分別採用ML語言和Java語言。本書的另一個特點是增加了一些其他編譯原理教科書沒有涉及的內容。前端增加了面向對象的程式設計語言、函式式程式設計語言等現代語言的編譯實現方法,後端增加了針對現代計算機體系結構特徵的一些比較成熟的最佳化方法。這部分內容展現了現代商業編譯器需解決的一些關鍵問題,開拓了學生的視野,為學生未來進行更深入的研究奠定了基礎。
《現代編譯原理:C語言描述》內容包括詞法分析、語法分析、抽象語法、語義檢查、中間代碼表示、指令選擇、數據流分析、暫存器分配以及運行時系統等。全書分成兩部分,第一部分是編譯的基礎知識,適用於第一門編譯原理課程(一個學期);第二部分是高級主題,包括面向對象語言和函式語言、垃圾收集、循環最佳化、ssA(靜態單賦值)形式、循環調度、存儲結構最佳化等,適合於後續課程或研究生教學。書中專門為學生提供了一個用C語言編寫的實習項目,包括前端和後端設計,學生可以在一學期內創建一個功能完整的編譯器。
作品目錄
第一部分 編譯基本原理
第1章 緒論
1.1 模組與接口
1.2 工具和軟體
1.3 樹語言的數據結構
程式設計:直線式程式解釋器
推薦閱讀
習題
第2章 詞法分析
2.1 詞法單詞
2.2 正則表達式
2.3 有限自動機
2.4 非確定有限自動機
2.4.1 將正則表達式轉換為NFA
2.4.2 將NFA轉換為DFA
2.5 Lex:詞法分析器的生成器
程式設計:詞法分析
推薦閱讀
習題
第3章 語法分析
3.1 上下文無關文法
3.1.1 推導
3.1.2 語法分析樹
3.1.3 二義性文法
3.1.4 檔案結束符
3.2 預測分析
3.2.1 FIRST集合和FOLLOW集合
3.2.2 構造一個預測分析器
3.2.3 消除左遞歸
3.2.4 提取左因子
3.2.5 錯誤恢復
3.3 LR分析
3.3.1 LR分析引擎
3.3.2 LR(0)分析器生成器
3.3.3 SLR分析器的生成
3.3.4 LR(1)項和LR(1)分析表
3.3.5 LALR(1)分析表
3.3.6 各類文法的層次
3.3.7 二義性文法的LR分析
3.4 使用分析器的生成器
3.4.1 衝突
3.4.2 優先權指導
3.4.3 語法和語義
3.5 錯誤恢復
3.5.1 用error符號恢復
3.5.2 全局錯誤修復
程式設計:語法分析
推薦閱讀
習題
第4章 抽象語法
4.1 語義動作
4.1.1 遞歸下降
4.1.2 Yacc生成的分析器
4.1.3 語義動作的解釋器
4.2 抽象語法分析樹
4.2.1 位置
4.2.2 Tiger的抽象語法
程式設計:抽象語法
推薦閱讀
習題
第5章 語義分析
5.1 符號表
5.1.1 多個符號表
5.1.2 高效的命令式風格符號表
5.1.3 高效的函式式符號表
5.1.4 Tiger編譯器的符號
5.1.5 函式式風格的符號表
5.2 Tiger編譯器的綁定
5.3 表達式的類型檢查
5.4 聲明的類型檢查
5.4.1 變數聲明
5.4.2 類型聲明
5.4.3 函式聲明
5.4.4 遞歸聲明
程式設計:類型檢查
習題
第6章 活動記錄
6.1 棧幀
6.1.1 幀指針
6.1.2 暫存器
6.1.3 參數傳遞
6.1.4 返回地址
6.1.5 棧幀內的變數
6.1.6 靜態鏈
6.2 Tiger編譯器的棧幀
6.2.1 棧幀描述的表示
6.2.2 局部變數
6.2.3 計算逃逸變數
6.2.4 臨時變數和標號
6.2.5 兩層抽象
6.2.6 管理靜態鏈
6.2.7 追蹤層次信息
程式設計:棧幀
推薦閱讀
習題
第7章 翻譯成中間代碼
7.1 中間表示樹
7.2 翻譯為樹中間語言
7.2.1 表達式的種類
7.2.2 簡單變數
7.2.3 追隨靜態鏈
7.2.4 數組變數
7.2.5 結構化的左值
7.2.6 下標和域選擇
7.2.7 關於安全性的勸告
7.2.8 算術操作
7.2.9 條件表達式
7.2.10 字元串
7.2.11 記錄和數組的創建
7.2.12 while循環
7.2.13 for循環
7.2.14 函式調用
7.3 聲明
7.3.1 變數定義
7.3.2 函式定義
7.3.3 片段
程式設計:翻譯成樹
習題
第8章 基本塊和軌跡
8.1 規範樹
8.1.1 ESEQ的轉換
8.1.2 一般重寫規則
8.1.3 將CALL移到頂層
8.1.4 線性語句表
8.2 處理條件分支
8.2.1 基本塊
8.2.2 軌跡
8.2.3 完善
8.2.4 最優軌跡
推薦閱讀
習題
第9章 指令選擇
9.1 指令選擇算法
9.1.1 Maximal Munch算法
9.1.2 動態規劃
9.1.3 樹文法
9.1.4 快速匹配
9.1.5 覆蓋算法的效率
9.2 CISC機器
9.3 Tiger編譯器的指令選擇
9.3.1 抽象的彙編語言指令
9.3.2 生成彙編指令
9.3.3 過程調用
9.3.4 無幀指針的情形
程式設計:指令選擇
推薦閱讀
習題
第10章 活躍分析
10.1 數據流方程的解
10.1.1 活躍性計算
10.1.2 集合的表示
10.1.3 時間複雜度
10.1.4 最小不動點
10.1.5 靜態活躍性與動態活躍性
10.1.6 衝突圖
10.2 Tiger編譯器的活躍分析
10.2.1 圖
10.2.2 控制流圖
10.2.3 活躍分析
程式設計:構造流圖
程式設計:活躍分析模組
習題
第11章 暫存器分配
11.1 通過簡化進行著色
11.2 合併
11.3 預著色的結點
11.3.1 機器暫存器的臨時副本
11.3.2 調用者保護的暫存器和被調用者保護的暫存器
11.3.3 含預著色結點的例子
11.4 圖著色的實現
11.4.1 傳送指令工作表的管理
11.4.2 數據結構
11.4.3 程式代碼
11.5 針對樹的暫存器分配
程式設計:圖著色
推薦閱讀
習題
第12章 整合為一體
程式設計:過程入口/出口
程式設計:創建一個可運行的編譯器
第二部分 高級主題
第13章 垃圾收集
13.1 標記-清掃式收集
13.2 引用計數
13.3 複製式收集
13.4 分代收集
13.5 增量式收集
13.6 Baker算法
13.7 編譯器接口
13.7.1 快速分配
13.7.2 數據布局的描述
13.7.3 導出指針
程式設計:描述字
程式設計:垃圾收集
推薦閱讀
習題
第14章 面向對象的語言
14.1 類
14.2 數據域的單繼承性
14.3 多繼承性
14.4 測試類成員關係
14.5 私有域和私有方法
14.6 無類語言
14.7 向對象程式的最佳化
程式設計:OBJECT Tiger
推薦閱讀
習題
第15章 函式式程式設計語言
15.1 一個簡單的函式式語言
15.2 閉包
15.3 不變的變數
15.3.1 基於延續的……I/O226
15.3.2 語言上的變化
15.3.3 純函式式語言的最佳化
15.4 內聯擴展
15.5 閉包變換
15.6 高效的尾遞歸
15.7 懶惰計算
15.7.1 傳名調用計算
15.7.2 按需調用
15.7.3 懶惰程式的計算
15.7.4 懶惰函式式程式的最佳化
15.7.5 嚴格性分析
推薦閱讀
程式設計:編譯函式式語言
習題
第16章 多態類型
16.1 參數多態性
16.1.1 顯式帶類型的多態語言
16.1.2 多態類型的檢查
16.2 類型推論
16.2.1 一個隱式類型的多態語言
16.2.2 類型推論算法
16.2.3 遞歸的數據類型
16.2.4 Hindley Milner類型的能力
16.3 多態變數的表示
16.3.1 多態函式的擴展
16.3.2 完全的裝箱轉換
16.3.3 基於強制的表示分析
16.3.4 將類型作為運行時參數傳遞
16.4 靜態重載的解決方法
推薦閱讀
習題
第17章 數據流分析
17.1 流分析使用的中間表示
17.2 各種數據流分析
17.2.1 到達定值
17.2.2 可用表達式
17.2.3 到達表達式
17.2.4 活躍分析
17.3 使用數據流分析結果的幾種轉換
17.3.1 公共子表達式刪除
17.3.2 常數傳播
17.3.3 複寫傳播
17.3.4 死代碼刪除
17.4 加快數據流分析
17.4.1 位向量
17.4.2 基本塊
17.4.3 結點排序
17.4.4 使用-定值鏈和定值-使用鏈
17.4.5 工作表算法
17.4.6 增量式數據流分析
17.5 別名分析
17.5.1 基於類型的別名分析
17.5.2 基於流的別名分析
17.5.3 使用可能別名信息
17.5.4 嚴格的純函式式語言中的別名分析
推薦閱讀
習題
第18章 循環最佳化
18.1 必經結點
18.1.1 尋找必經結點的算法
18.1.2 直接必經結點
18.1.3 循環
18.1.4 循環前置結點
18.2 循環不變數計算
18.3 歸納變數
18.3.1 發現歸納變數
18.3.2 強度削弱
18.3.3 刪除
18.3.4 重寫比較
18.4 數組邊界檢查
18.5 循環展開
推薦閱讀
習題
第19章 靜態單賦值形式
19.1 轉化為SSA形式
19.1.1 插入Φ函式的標準
19.1.2 必經結點邊界
19.1.3 插入Φ函式
19.1.4 變數重命名
19.1.5 邊分割
19.2 必經結點樹的高效計算
19.2.1 深度優先生成樹
19.2.2 半必經結點
19.2.3 Lengauer Tarjan算法
19.3 使用SSA的最佳化算法
19.3.1 死代碼刪除
19.3.2 簡單的常數傳播
19.3.3 條件常數傳播
19.3.4 保持必經結點性質
19.4 數組、指針和存儲器
19.5 控制依賴圖
19.6 從SSA形式轉變回來
19.7 函式式中間形式
推薦閱讀
習題
第20章 流水和調度
20.1 沒有資源約束時的循環調度
20.2 有資源約束的循環流水
20.2.1 模調度
20.2.2 尋找最小的啟動間距
20.2.3 其他控制流
20.2.4 編譯器應該調度指令嗎
20.3 分支預測
20.3.1 靜態分支預測
20.3.2 編譯器應該預測分支嗎
推薦閱讀
習題
第21章 存儲層次
21.1 cache的組織結構
21.2 cache塊對齊
21.3 預取
21.4 循環交換
21.5 分塊
21.6 垃圾收集和存儲層次
推薦閱讀
習題
附錄 Tiger語言參考手冊
參考文獻
索引
第1章 緒論
1.1 模組與接口
1.2 工具和軟體
1.3 樹語言的數據結構
程式設計:直線式程式解釋器
推薦閱讀
習題
第2章 詞法分析
2.1 詞法單詞
2.2 正則表達式
2.3 有限自動機
2.4 非確定有限自動機
2.4.1 將正則表達式轉換為NFA
2.4.2 將NFA轉換為DFA
2.5 Lex:詞法分析器的生成器
程式設計:詞法分析
推薦閱讀
習題
第3章 語法分析
3.1 上下文無關文法
3.1.1 推導
3.1.2 語法分析樹
3.1.3 二義性文法
3.1.4 檔案結束符
3.2 預測分析
3.2.1 FIRST集合和FOLLOW集合
3.2.2 構造一個預測分析器
3.2.3 消除左遞歸
3.2.4 提取左因子
3.2.5 錯誤恢復
3.3 LR分析
3.3.1 LR分析引擎
3.3.2 LR(0)分析器生成器
3.3.3 SLR分析器的生成
3.3.4 LR(1)項和LR(1)分析表
3.3.5 LALR(1)分析表
3.3.6 各類文法的層次
3.3.7 二義性文法的LR分析
3.4 使用分析器的生成器
3.4.1 衝突
3.4.2 優先權指導
3.4.3 語法和語義
3.5 錯誤恢復
3.5.1 用error符號恢復
3.5.2 全局錯誤修復
程式設計:語法分析
推薦閱讀
習題
第4章 抽象語法
4.1 語義動作
4.1.1 遞歸下降
4.1.2 Yacc生成的分析器
4.1.3 語義動作的解釋器
4.2 抽象語法分析樹
4.2.1 位置
4.2.2 Tiger的抽象語法
程式設計:抽象語法
推薦閱讀
習題
第5章 語義分析
5.1 符號表
5.1.1 多個符號表
5.1.2 高效的命令式風格符號表
5.1.3 高效的函式式符號表
5.1.4 Tiger編譯器的符號
5.1.5 函式式風格的符號表
5.2 Tiger編譯器的綁定
5.3 表達式的類型檢查
5.4 聲明的類型檢查
5.4.1 變數聲明
5.4.2 類型聲明
5.4.3 函式聲明
5.4.4 遞歸聲明
程式設計:類型檢查
習題
第6章 活動記錄
6.1 棧幀
6.1.1 幀指針
6.1.2 暫存器
6.1.3 參數傳遞
6.1.4 返回地址
6.1.5 棧幀內的變數
6.1.6 靜態鏈
6.2 Tiger編譯器的棧幀
6.2.1 棧幀描述的表示
6.2.2 局部變數
6.2.3 計算逃逸變數
6.2.4 臨時變數和標號
6.2.5 兩層抽象
6.2.6 管理靜態鏈
6.2.7 追蹤層次信息
程式設計:棧幀
推薦閱讀
習題
第7章 翻譯成中間代碼
7.1 中間表示樹
7.2 翻譯為樹中間語言
7.2.1 表達式的種類
7.2.2 簡單變數
7.2.3 追隨靜態鏈
7.2.4 數組變數
7.2.5 結構化的左值
7.2.6 下標和域選擇
7.2.7 關於安全性的勸告
7.2.8 算術操作
7.2.9 條件表達式
7.2.10 字元串
7.2.11 記錄和數組的創建
7.2.12 while循環
7.2.13 for循環
7.2.14 函式調用
7.3 聲明
7.3.1 變數定義
7.3.2 函式定義
7.3.3 片段
程式設計:翻譯成樹
習題
第8章 基本塊和軌跡
8.1 規範樹
8.1.1 ESEQ的轉換
8.1.2 一般重寫規則
8.1.3 將CALL移到頂層
8.1.4 線性語句表
8.2 處理條件分支
8.2.1 基本塊
8.2.2 軌跡
8.2.3 完善
8.2.4 最優軌跡
推薦閱讀
習題
第9章 指令選擇
9.1 指令選擇算法
9.1.1 Maximal Munch算法
9.1.2 動態規劃
9.1.3 樹文法
9.1.4 快速匹配
9.1.5 覆蓋算法的效率
9.2 CISC機器
9.3 Tiger編譯器的指令選擇
9.3.1 抽象的彙編語言指令
9.3.2 生成彙編指令
9.3.3 過程調用
9.3.4 無幀指針的情形
程式設計:指令選擇
推薦閱讀
習題
第10章 活躍分析
10.1 數據流方程的解
10.1.1 活躍性計算
10.1.2 集合的表示
10.1.3 時間複雜度
10.1.4 最小不動點
10.1.5 靜態活躍性與動態活躍性
10.1.6 衝突圖
10.2 Tiger編譯器的活躍分析
10.2.1 圖
10.2.2 控制流圖
10.2.3 活躍分析
程式設計:構造流圖
程式設計:活躍分析模組
習題
第11章 暫存器分配
11.1 通過簡化進行著色
11.2 合併
11.3 預著色的結點
11.3.1 機器暫存器的臨時副本
11.3.2 調用者保護的暫存器和被調用者保護的暫存器
11.3.3 含預著色結點的例子
11.4 圖著色的實現
11.4.1 傳送指令工作表的管理
11.4.2 數據結構
11.4.3 程式代碼
11.5 針對樹的暫存器分配
程式設計:圖著色
推薦閱讀
習題
第12章 整合為一體
程式設計:過程入口/出口
程式設計:創建一個可運行的編譯器
第二部分 高級主題
第13章 垃圾收集
13.1 標記-清掃式收集
13.2 引用計數
13.3 複製式收集
13.4 分代收集
13.5 增量式收集
13.6 Baker算法
13.7 編譯器接口
13.7.1 快速分配
13.7.2 數據布局的描述
13.7.3 導出指針
程式設計:描述字
程式設計:垃圾收集
推薦閱讀
習題
第14章 面向對象的語言
14.1 類
14.2 數據域的單繼承性
14.3 多繼承性
14.4 測試類成員關係
14.5 私有域和私有方法
14.6 無類語言
14.7 向對象程式的最佳化
程式設計:OBJECT Tiger
推薦閱讀
習題
第15章 函式式程式設計語言
15.1 一個簡單的函式式語言
15.2 閉包
15.3 不變的變數
15.3.1 基於延續的……I/O226
15.3.2 語言上的變化
15.3.3 純函式式語言的最佳化
15.4 內聯擴展
15.5 閉包變換
15.6 高效的尾遞歸
15.7 懶惰計算
15.7.1 傳名調用計算
15.7.2 按需調用
15.7.3 懶惰程式的計算
15.7.4 懶惰函式式程式的最佳化
15.7.5 嚴格性分析
推薦閱讀
程式設計:編譯函式式語言
習題
第16章 多態類型
16.1 參數多態性
16.1.1 顯式帶類型的多態語言
16.1.2 多態類型的檢查
16.2 類型推論
16.2.1 一個隱式類型的多態語言
16.2.2 類型推論算法
16.2.3 遞歸的數據類型
16.2.4 Hindley Milner類型的能力
16.3 多態變數的表示
16.3.1 多態函式的擴展
16.3.2 完全的裝箱轉換
16.3.3 基於強制的表示分析
16.3.4 將類型作為運行時參數傳遞
16.4 靜態重載的解決方法
推薦閱讀
習題
第17章 數據流分析
17.1 流分析使用的中間表示
17.2 各種數據流分析
17.2.1 到達定值
17.2.2 可用表達式
17.2.3 到達表達式
17.2.4 活躍分析
17.3 使用數據流分析結果的幾種轉換
17.3.1 公共子表達式刪除
17.3.2 常數傳播
17.3.3 複寫傳播
17.3.4 死代碼刪除
17.4 加快數據流分析
17.4.1 位向量
17.4.2 基本塊
17.4.3 結點排序
17.4.4 使用-定值鏈和定值-使用鏈
17.4.5 工作表算法
17.4.6 增量式數據流分析
17.5 別名分析
17.5.1 基於類型的別名分析
17.5.2 基於流的別名分析
17.5.3 使用可能別名信息
17.5.4 嚴格的純函式式語言中的別名分析
推薦閱讀
習題
第18章 循環最佳化
18.1 必經結點
18.1.1 尋找必經結點的算法
18.1.2 直接必經結點
18.1.3 循環
18.1.4 循環前置結點
18.2 循環不變數計算
18.3 歸納變數
18.3.1 發現歸納變數
18.3.2 強度削弱
18.3.3 刪除
18.3.4 重寫比較
18.4 數組邊界檢查
18.5 循環展開
推薦閱讀
習題
第19章 靜態單賦值形式
19.1 轉化為SSA形式
19.1.1 插入Φ函式的標準
19.1.2 必經結點邊界
19.1.3 插入Φ函式
19.1.4 變數重命名
19.1.5 邊分割
19.2 必經結點樹的高效計算
19.2.1 深度優先生成樹
19.2.2 半必經結點
19.2.3 Lengauer Tarjan算法
19.3 使用SSA的最佳化算法
19.3.1 死代碼刪除
19.3.2 簡單的常數傳播
19.3.3 條件常數傳播
19.3.4 保持必經結點性質
19.4 數組、指針和存儲器
19.5 控制依賴圖
19.6 從SSA形式轉變回來
19.7 函式式中間形式
推薦閱讀
習題
第20章 流水和調度
20.1 沒有資源約束時的循環調度
20.2 有資源約束的循環流水
20.2.1 模調度
20.2.2 尋找最小的啟動間距
20.2.3 其他控制流
20.2.4 編譯器應該調度指令嗎
20.3 分支預測
20.3.1 靜態分支預測
20.3.2 編譯器應該預測分支嗎
推薦閱讀
習題
第21章 存儲層次
21.1 cache的組織結構
21.2 cache塊對齊
21.3 預取
21.4 循環交換
21.5 分塊
21.6 垃圾收集和存儲層次
推薦閱讀
習題
附錄 Tiger語言參考手冊
參考文獻
索引