《編譯技術》主要內容編排如下:第1章介紹編譯器整體結構;第2章介紹一個簡單的編譯程序構造過程;第3章至第6章分別介紹詞法分析、語法解析、語義分析、代碼生成等過程中所面臨的技術問題及解決方案;第7章介紹運行時存儲空間的組織與分配;第8章介紹LCC(Learning Compiler with C)語言編譯程序的C語言實現。本書在強調基礎理論的同時,力求反映編譯技術方面的最新成果,書中給出了大量代碼,以幫助讀者掌握編譯器構造的相關技術。
本書文字簡潔易懂,內容循序漸進、深入淺出,便于自學,適合作為高等學校計算機類專業的教材,也可作為軟件工程技術人員的參考書。
本書配套授課電子課件,需要的教師可登錄www.cmpedu.com免費注冊,審核通過后下載,或聯系編輯索取。
《編譯技術》重點介紹了編譯器基礎軟件框架LLVM及相關工具的使用實例。書中給出了大量代碼,以幫助讀者掌握編譯器構造的相關技術。以提高學生的動手實踐能力為重點,鼓勵學生嘗試設計并實現一個新的語言編譯器。
“編譯原理”課程是計算機專業一門重要的專業基礎課,也是計算機系統軟件課程中非常重要的一個分支。在眾多的原理性學習課程中,編譯原理主要承擔了語言實現原理、方法和技術的介紹。該課程內容有一定深度和難度,且綜合性比較強,對學生專業知識掌握情況要求也比較高,學生在學習過程中會感到內容抽象、算法復雜,是一門公認的比較難學、比較難教的課程。很多學生也認為“編譯原理”只能應用在實現程序語言的編譯器上,而他們以后可能不會在編譯器及其相關領域方面鉆研,所以學習興趣不高。
其實這是一種誤解。通過學習編譯程序的構造原理和技術,將有助于深刻理解和正確使用程序設計語言。如正規式和有窮自動機在文本編輯器中的廣泛應用。有窮自動機在字符串查找中的運用、必經結點算法在網絡中的運用,以及由文法來定義網絡協議等。
此外,雖然編譯原理基本內容已相對比較成熟,算法相對固定,但編譯技術作為計算機語言發展的支柱,是計算機科學中發展最迅速、最成熟的一個分支,特別是近幾年大量編譯輔助工具應運而生,大大簡化了編譯器的實現過程。
基于以上因素,本書在編排時以提高學生的動手實踐能力為重點,在選擇性講解必要的理論及算法的同時,鼓勵學生嘗試設計并實現一個新的語言編譯器,在此基礎上將編譯程序中的各種算法和技術應用到各個領域,從而激發學生的創造性思維,培養學生的創新能力,為今后的學習、工作打下堅實的基礎。
出版說明
前言
第1章編譯概述
1.1編譯器與解釋器
1.2編譯器的組織與結構
1.2.1詞法分析
1.2.2語法分析
1.2.3語義分析
1.2.4代碼生成與優化
1.2.5符號表管理及錯誤處理
1.3總結與展望
1.4習題
第2章實現一個簡單編譯器
2.1語言定義
2.1.1詞法定義
2.1.2語法定義
2.2簡單編譯器的結構
2.3詞法分析
2.4遞歸下降語法解析
2.4.1規則的程序實現
2.4.2預測所選的規則
2.5抽象語法樹
2.6語義分析
2.6.1符號表
2.6.2類型檢查與轉換
2.7中間代碼生成
2.7.1三地址代碼
2.7.2樹的遍歷與代碼生成
2.8習題
第3章詞法分析器
3.1詞法分析器概述
3.2單詞的識別
3.3狀態轉換圖
3.4正則表達式
3.4.1字母表的概念
3.4.2正則表達式的形式化定義
3.5有限狀態自動機與詞法分析器
3.5.1確定的有限狀態自動機
3.5.2正則表達式到有限狀態自動機的轉換
3.5.3詞法分析器的自動機實現
3.6詞法分析器的自動生成
3.6.1Lex中的單詞符號定義
3.6.2Lex中的字符處理
3.6.3其他工具簡介
3.7習題
第4章文法與語法解析
4.1文法和語法的定義
4.1.1文法的定義
4.1.2上下文無關文法
4.1.3推導與規約
4.1.4語法樹
4.2自上而下的語法分析
4.2.1左遞歸的消除
4.2.2提取公共左因子
4.2.3遞歸下降分析法
4.2.4表驅動的預測分析法
4.3自下而上的語法分析
4.3.1LR分析過程
4.3.2LR(0)分析表的構造
4.3.3SLR(1)分析表的構造
4.4語法解析相關工具
4.4.1YACC
4.4.2ANTLR
4.5習題
第5章語義分析
5.1語義分析概況
5.1.1語義分析的功能
5.1.2語義分析方法
5.2構建抽象語法樹
5.2.1單一類型語法樹的設計
5.2.2多類型語法樹的設計
5.2.3多類型語法樹的遍歷
5.3符號表
5.3.1符號表的數據結構
5.3.2哈希符號表的實現
5.3.3分程序結構的作用域
5.3.4分程序結構符號表的實現
5.4說明語句分析
5.4.1簡單變量聲明
5.4.2結構類型的聲明
5.5賦值語句分析
5.6控制語句分析
5.6.1if語句
5.6.2while語句
5.6.3for語句
5.6.4過程調用語句
5.7習題
第6章LLVM代碼生成與優化
6.1LLVM系統
6.1.1LLVM框架設計理念
6.1.2LLVM中間代碼表示
6.1.3LLVM代碼示例分析
6.1.4LLVM工具集
6.2LLVM代碼生成
6.2.1常量、局部變量的代碼生成
6.2.2表達式的代碼生成
6.2.3函數聲明與調用
6.3優化概述
6.4基本塊與流圖
6.4.1基本塊
6.4.2程序流圖
6.5基本塊內的優化
6.6循環優化
6.6.1必經結點
6.6.2回邊及循環的查找
6.6.3循環的優化
6.7習題
第7章運行時存儲空間的組織與分配
7.1存儲組織
7.1.1運行時內存的劃分
7.1.2活動記錄
7.1.3存儲分配策略
7.1.4變量的存儲分配
7.2棧式分配
7.2.1只含半靜態變量的棧式分配
7.2.2半動態變量的棧式分配
7.3嵌套子程序的存儲組織
7.4參數傳遞方式
7.4.1參數傳遞的語義模型
7.4.2參數傳遞的實現模型
7.5習題
第8章LCC語言編譯程序的實現
8.1LCC語言簡介
8.2詞法分析
8.3語法分析
8.3.1LCC語言文法說明
8.3.2YACC與Lex之間的約定
8.3.3抽象語法樹結點設計
8.3.4構建抽象語法樹
8.3.5文法動作說明
8.4語義分析
8.4.1符號表的實現
8.4.2語義檢查
8.4.3數組設計與檢查
8.5中間代碼生成
8.5.1LLVM代碼生成接口
8.5.2LCC語言的代碼生成框架
8.5.3表達式的代碼生成
8.5.4輸入輸出語句的代碼生成
8.6LCC語言代碼運行測試
8.6.1變量作用域測試
8.6.2控制語句測試
8.6.3整型數組測試
8.6.4字符串數組測試
8.7習題
附錄縮略語
參考文獻