本書是在計算機領域本科教育教學改革試點工作計劃“編譯原理”課程組的組織下編寫的理論教材之一。本書從理論和實踐兩個方面指導與幫助學生深刻理解編譯器的工作原理。其中,理論方法的教學使得學生能夠理解編譯器運行過程中的核心算法,而實踐技術則幫助學生掌握理論方法及算法在代碼實現層面的設計與編碼要點,最后結合實踐內容對理論方法與實踐技術進行鞏固。本書適合作為高校計算機及相關專業(yè)編譯原理課程的教材,也適合作為研發(fā)人員了解編譯技術的參考書。
本書是在計算機領域本科教育教學改革試點工作計劃“編譯原理”課程組的組織下編寫的理論教材之一。本書從理論和實踐兩個方面指導與幫助學生深刻理解編譯器的工作原理。其中,理論方法的教學使得學生能夠理解編譯器運行過程中的核心算法,而實踐技術則幫助學生掌握理論方法及算法在代碼實現層面的設計與編碼要點,最后結合實踐內容對理論方法與實踐技術進行鞏固。本書適合作為高校計算機及相關專業(yè)編譯原理課程的教材,也適合作為研發(fā)人員了解編譯技術的參考書。
前 言
本書是在計算機領域本科教育教學改革試點工作計劃(簡稱“101計劃”)“編譯原理”課程組的組織下編寫的理論教材之一。與其他同類理論教材相比,本書在介紹編譯理論和方法的同時,更強調實踐技術,并注重編譯理論與實踐的結合。在內容方面,本書的理論部分涵蓋了當前主流編譯器編譯過程中的核心技術要點,實踐部分則引導學生基于理論知識構建一個能夠將以類C語言編寫的源程序編譯為MIPS目標語言代碼的完整編譯器。在教學中,教師能夠參考本書完整地進行理論教學和實踐指導,其內容已經包括了相關資料。
一方面,當前許多“編譯原理”課程理論教材以傳授理論知識為主,其中的內容離編譯器具體實踐尚有一定的距離。這可能使學生偏重學習理論和方法,而對編譯器實現缺乏更為深刻的理解。另一方面,常規(guī)的“編譯原理”實踐課程大多基于一門相對簡易的編程語言,要求學生實現支持該語言語法和語義處理部分的編譯器。由于缺乏規(guī)范化的實踐指導,有時會降低教學要求,不得不允許學生“靈活”(較為隨意)地實現編譯器的功能;又或者由于教學要求過高,學生在無實踐指導的情況下對編譯器實現無法下手,而對課程產生較大的抵觸心理。針對這些問題,本書面向開設計算機學科的大專院校,提供一門接近實際C語言的C--語言,從理論方法的解說到實踐指導的進行,引導性地講解理論知識和編譯器的具體實現,并提供充分的測試樣例來驗證編譯器實現的正確性。
整體而言,基于本書介紹的理論方法和實踐技術,我們設計了相應的實踐內容,系統性地覆蓋理論方法和實踐技術部分的各個知識點。本書的實踐內容具有四個特點:一是接近實際,所采用的語言是C--語言,該語言接近現實中常用的C語言,這使得所設計與實現的編譯器更為實用,甚至在特定領域可以直接或經過少量修改后使用;二是結合相關的實踐技術進行介紹,引導學生完成一個完整編譯器的設計與實現,不會使學生出現面對編譯器實現要求無從下手或不得不求助于第三方額外資料的情況;三是具備相關的實現驗證幫助,我們提供了充分的測試樣例來幫助驗證編譯器實現的正確性,而無須自行設計測試用例;四是難度可調,我們提供了實踐內容的多種執(zhí)行方案,既可以統一難度要求,也可以區(qū)分必做內容和選做內容,還可以采用學生分組方案,使得每個組隊實現不同的功能組合,激發(fā)學生的思考創(chuàng)新能力,并鍛煉其合作能力。
下面我們就本書的使用方式、時間安排以及質量控制給出一些建議。
使用方式
本書包含五個核心章(從第2章至第6章),前后貫穿,分別為詞法分析和語法分析、語義分析、中間代碼生成、目標代碼生成以及中間代碼優(yōu)化。每章的理論和實踐內容依賴于前續(xù)章,教學需按順序進行。
在這五章中,除了第5章之外,其他章節(jié)的實踐內容均分為必做部分和選做部分,而選做部分則進一步分為幾種不同的要求(第5章僅有必做部分)。這五章中的實踐內容特別考慮了不同院校的教學要求以及學生之間的能力差異,因而可以采用多種方式教學:
1. 對所有學生要求相同:這是最簡單的使用方式,適用于學習編譯原理的所有學生都需要通過相同考核要求的情況。具體而言,可進一步劃分為下面三種情況:
(1)對所有學生要求最低:完成所有實踐的必做部分,即可獲得滿分。
(2)對所有學生要求最高:完成所有實踐的必做部分和選做部分,才可獲得滿分。
(3)對所有學生要求自選:完成所有實踐的必做部分,即可得滿分。但若能額外完成實踐的選做部分,則可視完成的情況獲得額外獎勵。
2. 對不同學生要求不同:這種使用方式適用于學習編譯原理的學生需要通過不同考核要求的情況。比如強化班和普通班的學生一起上編譯原理課程,則要求強化班學生完成所有實踐的必做部分和選做部分才可獲得滿分,而普通班學生完成所有實踐的必做部分即可得滿分,但若能額外完成實踐的選做部分,則可獲得額外獎勵。
3. 對不同組隊要求不同:這是最復雜的使用方式,適用于允許學生自由組隊以共同完成實踐要求的情況。推薦的組隊規(guī)模是一至三人,比如,若雙人組隊則為正常模式,可獲得實踐滿分,若三人組隊則為互助模式,需適當減少實踐總分(如變?yōu)樵瓉頋M分的90%),若單人組隊則為高手模式,可適當提高實踐總分(如變?yōu)樵瓉頋M分的110%)。在實踐要求方面,仍可考慮不同的考核要求而組合不同的必做和選做部分,或者完成指定或隨機選擇的實踐要求。比如,一位強化班學生需要完成所有實踐的必做部分和選做部分才可獲得滿分,他可以單人組隊進入高手模式以獲得更高的總分,也可以雙人組隊進入正常模式,以減少實踐難度。
時間安排
本書從第2章至第6章是核心教學內容,一個學期完成教學,預計時長17周,每周2~3課時。各章的內容應依順序進行教學,每完成前一章中理論方法和實踐技術部分的教學即可開始后一章中對應部分的教學。實踐內容部分作為課程項目布置,可略晚開始,比如,第2章的實踐內容可從第2周開始布置,以保證前期進行了必要的理論方法和實踐技術的講授和準備,而后續(xù)章節(jié)的實踐內容可與教學同步進行。一般而言,如果一個
許暢,南京大學計算機科學與技術系教授,“101 計劃”編譯課程建設專家。2008年在香港科技大學獲得博士學位,2010年入選新世紀優(yōu)秀人才支持計劃,2011年獲得國
家科技進步二等獎,2015年獲得CCF青年科學家獎,2021年入選長江學者獎勵計劃。主持和參與了多項國家和省部級科研項目,包括國家重點研發(fā)計劃和自然科學基金重點項目等。研究興趣包括大數據、軟件工程、智能軟件測試與分析,以及自適應與自控軟件系統。發(fā)表了180余篇學術論文,工作被包括 TOSEM、TSE、ESEC/FSE、ICSE 和《中國科學》等在內的國內外知名期刊和會議收錄,曾獲 ACM SIGSOFT 杰出論文獎 4 次和國際會議最佳論文獎 3次。服務于 ESEC/FSE、ICSE 和 ASE 等程序委員會,擔任 JSEP、JCST、FCS 和《計算機科學》等期刊
編委。
馮洋,南京大學計算機科學與技術系助理研究員。2019年在加州大學歐文分校獲得博士學位。主要研究方向為復雜軟件系統的質量保障及可信程序設計語言工程技術,研究課題包括大型復雜軟件系統的質量保障問題及可信軟件基礎設施構建與工程技術問題。主持和參與了多項國家和省部級科研項目,包括國家重大專項計劃、自然科學基金面上項目和青年項目。近年來在軟件工程領域的
ICSE、FSE、ASE、ISSTA、TSE、TOSEM、《中國科學》《軟件學報》等期刊和會議發(fā)表學術論文 40余篇,獲得 ACM 杰出論文獎兩次。申請發(fā)明專利多項,部分專利成果已經在華為、百度等知名公司轉化應用。
鄭艷偉,山東大學計算機科學與技術學院副研究員。2019年在北京航空航天大學獲博士學位。主要研究方向包括計算機視覺、目標驅動的視覺導航、編譯器構造。主持了國家重點研發(fā)計劃與課題和自然科學基金重點項目與課題;主持多項橫向項目,曾參與華為昇騰芯片算子和眾智項目開發(fā),曾在 RPA 中設計了一種腳本語言并開發(fā)了解釋器。近年來在 ICDE、Com-Com、IoT-J、WASA、《中國科學》等期刊和會議發(fā)表學術論文 20余篇,申請發(fā)明專利 30 余項,擔任IoT-J、JMLC、SPL、CIT 等期刊審稿人。
陳鄞,哈爾濱工業(yè)大學計算學部軟件學院副教授。2008年在哈爾濱工業(yè)大學獲得計算機應用專業(yè)博士學位。國家一流課程“編譯原理”負責人,首批高校計算機專業(yè)優(yōu)秀教師獎勵計劃獲獎者。主要研究方向為軟件工程、自然語言處理、機器學習等。參與完成多項國家自然科學基金項目和國家重點研發(fā)計劃項目。2008年至今一直從事一線教學工作,主講“編譯原理”“信息檢索”“自
然語言處理”“中文信息處理”等本科和研究生課程。獲哈爾濱工業(yè)大學教學優(yōu)秀獎 1 次,主編教材 3 部。
譚添, 南京大學計算機科學與技術系準聘助理授。2017年在新南威爾士大學獲得博士學位,2017~2019年在奧胡斯大學從事博士后研究工作。主要研究方向為程序分析與程序設計語言,研究成果發(fā)表在TOPLAS、TOSEM、TSE、PLDI、OOPSLA、FSE 等領域內高水平期刊與會議上。
陳林,南京大學計算機科學與技術系副教授。2009年在東南大學獲得博士學位。主持和參與了多項國家和省部級科研項目,包括國家重點研發(fā)計劃和自然科學基金項目等,多次獲得省部級科技進步獎。研究興趣包括軟件分析測試、軟件生態(tài)系統質量保障等,與合作者在TSE、TOSEM、ICSE、FSE、《中國科學》和《軟件學報》等國內外期刊和會議上發(fā)表論文100余篇,部分成果在華為等知名公司轉化應用。
目 錄
出版說明
前言
第1章 概述 1
1.1 內容組織 1
1.2 編譯器的結構 3
1.2.1 詞法分析 4
1.2.2 語法分析 5
1.2.3 語義分析 5
1.2.4 中間代碼生成 6
1.2.5 目標代碼生成 7
1.2.6 中間代碼優(yōu)化 7
1.3 語言和工具簡介 8
1.3.1 源語言C--簡介 9
1.3.2 目標語言MIPS簡介 9
1.3.3 MIPS模擬器簡介 11
1.3.4 實踐環(huán)境 12
第2章 詞法分析和語法分析 13
2.1 詞法分析和語法分析的理論方法 16
2.1.1 詞法分析概要 16
2.1.2 正則表達式 18
2.1.3 有限狀態(tài)自動機 21
2.1.4 從NFA到DFA的轉換 24
2.1.5 狀態(tài)最小化算法 25
2.1.6 語法分析概要 26
2.1.7 上下文無關文法 28
2.1.8 自頂向下的語法分析算法 30
2.1.9 自底向上的語法分析算法 33
2.2 詞法分析和語法分析的實踐技術 36
2.2.1 詞法分析實現思想概述 37
2.2.2 GNU Flex介紹 37
2.2.3 Flex:編寫源代碼 38
2.2.4 Flex:書寫正則表達式 41
2.2.5 Flex:高級特性 42
2.2.6 詞法分析實踐的額外提示 45
2.2.7 語法分析實現思想概述 46
2.2.8 GUN Bison介紹 46
2.2.9 Bison:編寫源代碼 48
2.2.10 Bison:屬性值的類型 51
2.2.11 Bison:詞法單元的位置 52
2.2.12 Bison:二義性與沖突處理 53
2.2.13 Bison:源代碼的調試 55
2.2.14 Bison:錯誤恢復 56
2.2.15 語法分析實踐的額外提示 57
2.3 詞法分析和語法分析的實踐內容 58
2.3.1 實踐要求 58
2.3.2 輸入格式 58
2.3.3 輸出格式 59
2.3.4 驗證環(huán)境 59
2.3.5 提交要求 60
2.3.6 樣例(必做部分) 60
2.3.7 樣例(選做部分) 63
2.4 本章小結 67
習題 67
第3章 語義分析 69
3.1 語義分析的理論方法 72
3.1.1 屬性文法 72
3.1.2 基于屬性文法的處理方式 73
3.1.3 S屬性文法和L屬性文法 75
3.1.4 語法制導的定義 76
3.1.5 語法制導的翻譯方案 77
3.1.6 SDT中左遞歸的消除 78
3.1.7 類型檢查 80
3.2 語義分析的實踐技術 82
3.2.1 語義分析實現思想概述 82
3.2.2 符號表的設計與實現 83
3.2.3 支持多層作用域的符號表 85
3.2.4 類型表示 87
3.2.5 語義分析實踐的額外提示 89
3.3 語義分析的實踐內容 89
3.3.1 實踐要求 89
3.3.2 輸入格式 91
3.3.3 輸出格式 91
3.3.4 驗證環(huán)境 92
3.3.5 提交要求 92
3.3.6 樣例(必做部分) 92
3.3.7 樣例(選做部分) 98
3.4 本章小結 101
習題 102
第4章 中間代碼生成 105
4.1 中間代碼生成的理論方法 108
4.1.1 運行時環(huán)境概要 108
4.1.2 存儲組織與棧幀設計方法 108
4.1.3 中間表示 110
4.1.4 類型與聲明 111
4.1.5 表達式的翻譯 113
4.1.6 控制流與回填 117
4.2 中間代碼生成的實踐技術 122
4.2.1 線形中間表示 122
4.2.2 圖形中間表示 123
4.2.3 運行時環(huán)境簡介 123
4.2.4 基本表達式的翻譯模式 124
4.2.5 語句的翻譯模式 125
4.2.6 函數調用的翻譯模式 126
4.2.7 數組和結構體的翻譯模式 127
4.3 中間代碼生成的實踐內容 127
4.3.1 實踐要求 127
4.3.2 輸入格式 130
4.3.3 輸出格式 130
4.3.4 驗證環(huán)境 130
4.3.5 提交要求 130
4.3.6 樣例(必做部分) 131
4.3.7 樣例(選做部分) 133
4.4 本章小結 135
習題 136
第5章 目標代碼生成 139
5.1 目標代碼生成的理論方法 142
5.1.1 代碼生成概述 142
5.1.2 指令集架構 145
5.1.3 基本塊與流圖 147
5.1.4 指令選擇算法 150
5.1.5 寄存器分配算法 153
5.1.6 窺孔優(yōu)化 156
5.1.7 代碼生成器構建 159
5.2 目標代碼生成的實踐技術 162
5.2.1 QtSpim簡介 162
5.2.2 MIPS32匯編代碼簡介 165
5.2.3 指令選擇算法實現 167
5.2.4 樸素寄存器分配算法實現 169
5.2.5 局部寄存器分配算法實現 170
5.2.6 活躍變量分析算法實現 170
5.2.7 圖染色算法實現 171
5.2.8 MIPS寄存器的使用 174
5.2.9 MIPS棧管理 175
5.2.10 目標代碼生成實踐的額外提示 179
5.3 目標代碼生成的實踐內容 180
5.3.1 實踐要求 180
5.3.2 輸入格式 181
5.3.3 輸出格式 181
5.3.4 驗證環(huán)境 181
5.3.5 提交要求 181
5.3.6 樣例(必做部分) 182
5.4 本章小結 185
習題 186
第6