-
>
全國計算機等級考試最新真考題庫模擬考場及詳解·二級MSOffice高級應用
-
>
決戰行測5000題(言語理解與表達)
-
>
軟件性能測試.分析與調優實踐之路
-
>
第一行代碼Android
-
>
JAVA持續交付
-
>
EXCEL最強教科書(完全版)(全彩印刷)
-
>
深度學習
自己動手構建編程語言:如何設計編譯器、解釋器和DSL 版權信息
- ISBN:9787111738213
- 條形碼:9787111738213 ; 978-7-111-73821-3
- 裝幀:平裝-膠訂
- 冊數:暫無
- 重量:暫無
- 所屬分類:>>
自己動手構建編程語言:如何設計編譯器、解釋器和DSL 本書特色
對不同類型計算機語言的需求正在迅速增長,開發人員更喜歡創建領域特定語言來解決特定的應用程序領域問題。雖然構建自己的編程語言可以解決軟件不斷增長的規模和復雜性問題,但這并不容易。
本書融合作者構建Unicon編程語言的經驗,全面系統地闡述了編程語言的設計與實現。書中既涵蓋語法樹的一系列遍歷、字節碼虛擬機的代碼生成,又介紹了如何通過內置于語言中的操作符和函數而不是庫函數來很好地表示領域特定語言的特性,而且展示了如何實現垃圾收集,包括引用計數和標記-清理垃圾收集。在整本書中,作者提供了基于Unicon和Java的相關示例,以幫助讀者更好地理解概念的上下文并掌握相關技術和方法。
學完本書,讀者將能夠構建和部署自己的領域特定語言,并編譯和運行程序。
閱讀完本書,讀者將能夠:
·對新語言進行需求分析,并設計語言語法和語義;
·為常用表達式和控制結構編寫詞法和上下文無關的文法規則;
·開發一個讀取源代碼的掃描器,并生成一個檢查語法的解析器;
·在編譯器中構建關鍵數據結構,并使用編譯器構建語法著色代碼編輯器;
·實現一個字節碼解釋器,并運行由編譯器生成的字節碼;
·編寫將信息插入語法樹的樹遍歷;
·用自己的語言實現垃圾收集。
自己動手構建編程語言:如何設計編譯器、解釋器和DSL 內容簡介
本書主要研究如何構建一種新的編程語言。書中將介紹編程語言設計方面的主題,并重點介紹編程語言實現。本書的新穎之處在于將傳統的編譯器-編譯器工具(Flex和BYACC)與兩種更高級的實現語言融合。一種非常高級的語言(Unicon)可以像黃油一樣穿透編譯器的數據結構和算法,而另一種主流的現代語言(Java)則展示了如何在更典型的生產環境中實現相同的代碼。 本書主要面向對發明編程語言或開發領域特定語言感興趣的軟件開發人員。學習編譯器構建課程的計算機科學相關專業學生也會發現這本書非常適合作為語言實現的實用指南,可以為理論教材提供有益補充。
自己動手構建編程語言:如何設計編譯器、解釋器和DSL 目錄
前言
**部分 編程語言導論
第1章 為什么要構建另一種編程
語言2
1.1 編寫自己的編程語言的動機2
1.1.1 編程語言實現的類型3
1.1.2 組織字節碼語言實現4
1.1.3 示例中使用的語言4
1.2 編程語言與庫的差別5
1.3 適用于其他軟件工程任務6
1.4 建立語言需求6
1.5 案例研究:Unicon語言的創建需求8
1.5.1 Unicon需求#1—保留人們
對Icon的喜愛8
1.5.2 Unicon需求#2—支持大型
大數據項目9
1.5.3 Unicon需求#3—現代應用
程序的高級輸入/輸出9
1.5.4 Unicon需求#4—提供可實
現的通用系統接口9
1.6 本章小結10
1.7 思考題10
第2章 編程語言設計11
2.1 確定要編程語言提供的單詞和
標點符號的類型11
2.2 指定控制流13
2.3 決定支持哪種數據14
2.3.1 原子類型14
2.3.2 復合類型15
2.3.3 領域特定類型16
2.4 整體程序結構16
2.5 完成Jzero語言的定義17
2.6 案例研究:設計Unicon中的圖形
功能18
2.6.1 2D圖形語言支持18
2.6.2 添加3D圖形支持20
2.7 本章小結21
2.8 思考題21
第3章 掃描源代碼22
3.1 技術需求22
3.2 詞素、詞類和標記23
3.3 正則表達式24
3.3.1 正則表達式規則24
3.3.2 正則表達式示例25
3.4 使用UFlex和JFlex26
3.4.1 頭部分26
3.4.2 正則表達式部分27
3.4.3 編寫一個簡單的源代碼掃
描器27
3.4.4 運行掃描器30
3.4.5 標記和詞法屬性31
3.4.6 擴展示例以構造標記31
3.5 為Jzero編寫掃描器34
3.5.1 Jzero Flex規范34
3.5.2 Unicon Jzero代碼36
3.5.3 Java Jzero代碼39
3.5.4 運行Jzero掃描器42
3.6 正則表達式并不總是足夠的44
3.7 本章小結46
3.8 思考題47
第4章 解析48
4.1 技術需求48
4.2 語法分析49
4.3 理解上下文無關文法49
4.3.1 編寫上下文無關文法規則50
4.3.2 編寫編程構造規則51
4.4 使用iyacc和BYACC/J53
4.4.1 聲明頭部分中的符號53
4.4.2 組合yacc上下文無關文法
部分54
4.4.3 理解yacc解析器55
4.4.4 修復yacc解析器中的沖突56
4.4.5 語法錯誤修復57
4.4.6 組合簡單示例57
4.5 為Jzero編寫解析器62
4.5.1 Jzero lex規范62
4.5.2 Jzero yacc規范62
4.5.3 Unicon Jzero代碼66
4.5.4 Java Jzero解析器代碼68
4.5.5 運行Jzero解析器69
4.6 改進語法錯誤消息70
4.6.1 向Unicon語法錯誤消息添加
詳細信息71
4.6.2 向Java語法錯誤消息添加詳
細信息71
4.6.3 使用Merr生成更好的語法錯
誤消息72
4.7 本章小結72
4.8 思考題73
第5章 語法樹74
5.1 技術需求74
5.2 GNU make的使用75
5.3 樹77
5.3.1 定義語法樹類型78
5.3.2 解析樹與語法樹79
5.4 從終結符創建葉子81
5.4.1 用葉子包裝標記81
5.4.2 使用YACC的值棧82
5.4.3 為解析器的值棧包裝葉子83
5.4.4 確定需要哪些葉子84
5.5 從產生式規則構建內部節點85
5.5.1 訪問值棧上的樹節點85
5.5.2 使用樹節點工廠方法86
5.6 為Jzero語言形成語法樹88
5.7 調試并測試語法樹93
5.7.1 避免常見的語法樹錯誤94
5.7.2 以文本格式輸出語法樹95
5.7.3 使用dot輸出語法樹96
5.8 本章小結101
5.9 思考題101
第二部分 語法樹遍歷
第6章 符號表104
6.1 技術需求104
6.2 建立符號表基礎105
6.2.1 聲明和作用域105
6.2.2 賦值和取消引用變量106
6.2.3 選擇正確的樹遍歷106
6.3 為每個作用域創建和填充符號表107
6.3.1 向語法樹添加語義屬性108
6.3.2 定義符號表和符號表條目的類109
6.3.3 創建符號表110
6.3.4 填充符號表112
6.3.5 綜合isConst屬性114
6.4 檢查未聲明的變量115
6.4.1 識別方法體115
6.4.2 發現方法體中變量的使用116
6.5 查找重新聲明的變量118
6.5.1 將符號插入符號表118
6.5.2 報告語義錯誤119
6.6 在Unicon中處理包和類作用域119
6.6.1 名稱修飾120
6.6.2 為成員變量引用插入self120
6.6.3 在方法調用中插入self作為
**個參數121
6.7 測試和調試符號表122
6.8 本章小結123
6.9 思考題124
第7章 基本類型檢查125
7.1 技術需求125
7.2 編譯器中的類型表示125
7.2.1 定義表示類型的基類126
7.2.2 子類化復雜類型的基類127
7.3 將類型信息分配給聲明的變量129
7.3.1 從保留字合成類型130
7.3.2 將類型繼承到變量列表中131
7.4 確定每個語法樹節點的類型132
7.4.1 確定葉子的類型133
7.4.2 計算和檢查內部節點的類型135
7.5 Unicon中的運行時類型檢查和
類型推斷139
7.6 本章小結140
7.7 思考題140
第8章 檢查數組、方法調用和結
構訪問的類型142
8.1 技術需求142
8.2 檢查數組類型的操作142
8.2.1 處理數組變量聲明143
8.2.2 在數組創建期間檢查類型143
8.2.3 在數組訪問期間檢查類型145
8.3 檢查方法調用146
8.3.1 計算參數和返回類型信息147
8.3.2 檢查每個方法調用站點的類型149
8.3.3 檢查返回語句中的類型152
8.4 檢查結構化類型訪問153
8.4.1 處理實例變量聲明154
8.4.2 在創建實例時檢查類型154
8.4.3 在實例訪問時檢查類型157
8.5 本章小結159
8.6 思考題160
第9章 中間代碼生成161
9.1 技術需求161
9.2 準備生成代碼161
9.2.1 為什么要生成中間代碼162
9.2.2 了解生成程序的存儲區域162
9.2.3 為中間代碼引入數據類型163
9.2.4 將中間代碼屬性添加到樹中165
9.2.5 生成標簽和臨時變量165
9.3 中間代碼指令集168
9.3.1 指令168
9.3.2 聲明168
9.4 用標簽為控制流注釋語法樹 169
9.5 為表達式生成代碼171
9.6 為控制流生成代碼173
9.6.1 為條件表達式生成標簽目標174
9.6.2 生成循環代碼177
9.6.3 為方法調用生成中間代碼178
9.6.4 檢查生成的中間代碼179
9.7 本章小結180
第10章 IDE中的語法著色182
10.1 下載本章中使用的示例IDE183
10.2 將編譯器集成到程序員的編輯
器中184
10.2.1 從IDE中分析源代碼185
10.2.2 將編譯器輸出發送到IDE185
10.3 避免在每次更改時重新解析
整個文件186
10.4 使用詞法信息為標記著色189
10.4.1 擴展EditableTextList組件以
支持顏色189
10.4.2 在繪制單個標記時對其
進行著色190
10.5 使用解析結果突出顯示錯誤191
10.6 添加Java支持192
10.7 本章小結194
第三部分 代碼生成與運行時系統
第11章 字節碼解釋器196
11.1 技術需求196
11.2 什么是字節碼196
11.3 比較字節碼和中間碼198
11.4 為Jzero構建字節碼指令集200
11.4.1 定義Jzero字節碼文件格式200
11.4.2 了解棧機操作的基礎知識202
11.5 實現字節碼解釋器203
11.5.1 將字節碼加載到內存中203
11.5.2 初始化解釋器狀態205
11.5.3 獲取指令并推進指令指針206
11.5.4 指令解碼207
11.5.5 執行指令208
11.5.6 啟動Jzero解釋器211
11.6 編寫Jzero運行時系統212
11.7 運行Jzero程序213
11.8 檢查Unicon字節碼解釋器iconx213
11.8.1 了解目標導向的字節碼214
11.8.2 在運行時保留類型信息214
11.8.3 獲取、解碼和執行指令214
11.8.4 制作運行時系統的其余部分215
11.9 本章小結215
11.10 思考題215
第12章 生成字節碼217
12.1 技術需求217
12.2 轉換中間代碼為Jzero字節碼217
12.2.1 為字節碼指令添加類218
12.2.2 將中間代碼地址映射到
字節碼地址219
12.2.3 實現字節碼生成器方法220
12.2.4 為簡單表達式生成字節碼221
12.2.5 生成指針操作的代碼223
12.2.6 為分支和條件分支生成
字節碼224
12.2.7 為方法調用和返回生成代碼225
12.2.8 處理中間代碼中的標簽和
其他偽指令226
12.3 比較字節碼匯編程序與二進制
格式227
12.3.1 以匯編格式輸出字節碼227
12.3.2 以二進制格式輸出字節碼229
12.4 鏈接、加載并包括運行時系統230
12.5 Unicon示例:icont中的字節碼
生成230
12.6 本章小結232
12.7 思考題232
第13章 生成本機代碼233
13.1 技術需求233
13.2 決定是否生成本機代碼233
13.3 x64指令集234
13.3.1 為x64指令添加類234
13.3.2 將內存區域映射到基于x64
寄存器的地址模式235
13.4 使用寄存器235
13.4.1 從空策略開始236
13.4.2 分配寄存器以加速本地
區域237
13.5 將中間代碼轉換為x64代碼239
13.5.1 將中間代碼地址映射到x64
內存地址240
13.5.2 實現x64代碼生成器方法243
13.5.3 生成簡單表達式的x64代碼244
13.5.4 生成指針操作的代碼245
13.5.5 為分支和條件分支生成
本機代碼246
13.5.6 為方法調用和返回生成代碼247
13.5.7 處理標簽和偽指令249
13.6 生成x64輸出250
13.6.1 以匯編語言格式編寫x64
代碼251
13.6.2 從本機匯編程序到目標文件251
13.6.3 鏈接、加載并包括運行時
系統252
13.7 本章小結253
13.8 思考題253
第14章 運算符和內置函數的實現254
14.1 實現運算符254
14.1.1 運算符是否需要硬件支持255
14.1.2 在中間代碼生成中添加字符
串連接255
14.1.3 為字節碼解釋器添加字符
串連接257
14.1.4 將字符串連接添加到本機
運行時系統259
14.2 編寫內置函數260
14.2.1 向字節碼解釋器添加內置
函數260
14.2.2 編寫用于本機代碼實現的
內置函數261
14.3 集成內置組件與控制結構262
14.4 為Unicon開發運算符和函數262
14.4.1 在Unicon中編寫運算符263
14.4.2 開發Unicon的內置函數265
14.5 本章小結266
14.6 思考題266
第15章 域控制結構267
15.1 了解何時需要新的控制結構267
15.1.1 定義控制結構268
15.1.2 減少過多的冗余參數268
15.2 Icon和Unicon中的字符串掃描269
15.2.1 掃描環境及其基本操作270
15.2.2 通過控制結構消除過多參數271
15.3 Unicon中的渲染區域271
15.3.1 從顯示列表渲染3D圖形272
15.3.2 使用內置函數指定渲染區域272
15.3.3 使用嵌套渲染區域更改
圖形細節層次273
15.3.4 創建渲染區域控制結構274
15.4 本章小結278
15.5 思考題278
第16章 垃圾收集279
16.1 認識垃圾收集的重要性279
16.2 對象的引用計數281
16.2.1 將引用計數添加到Jzero281
16.2.2 生成堆分配代碼281
16.2.3 為賦值運算符修改生成的
代碼283
16.2.4 引用計數的缺點和局限性283
16.3 標記實時數據并清理剩余數據284
16.3.1 組織堆內存區域285
16.3.2 遍歷基本變量以標記實時
數據286
16.3.3 回收實時內存并將其放入
連續內存塊290
16.4 本章小結293
16.5 思考題293
第17章 結語294
17.1 反思從編寫這本書中學到的
東西294
17.2 決定何去何從295
17.2.1 學習編程語言設計295
17.2.2 學習如何實現解釋器和字
節碼機器296
17.2.3 獲取代碼優化方面的專業
知識297
17.2.4 監視和調試程序執行297
17.2.5 設計和實現IDE和GUI
構建器298
17.3 延伸閱讀的參考資料298
17.4 本章小結301
第四部分 附錄
附錄A Unicon基礎304
附錄B 部分章節要點324
自己動手構建編程語言:如何設計編譯器、解釋器和DSL 作者簡介
克林頓 · L. 杰弗瑞
(Clinton L. Jeffery)Clinton L. Jeffery是New Mexico Institute of Mining and Technology計算機科學與工程系的教授和系主任。他在華盛頓大學獲得計算機科學學士學位,在亞利桑那大學獲得計算機科學碩士和博士學位。他主要從事編程語言、程序監控、調試、圖形、虛擬環境和可視化方面的研究,并撰寫了許多相關書籍和論文。他與同事一起發明了Unicon編程語言,該語言在Unicon網站上托管。
- >
我從未如此眷戀人間
- >
煙與鏡
- >
上帝之肋:男人的真實旅程
- >
朝聞道
- >
【精裝繪本】畫給孩子的中國神話
- >
詩經-先民的歌唱
- >
月亮與六便士
- >
羅庸西南聯大授課錄