目 錄
         第1章  引子  001
         1.1 為什麼要製作編程語言  002
         1.2 自製編程語言並不是很難  003
         1.3 本書的構成與麵嚮讀者  004
         1.4 用什麼語言來製作  006
         1.5 要製作怎樣的語言  007
         1.5.1 要設計怎樣的語法  007
         1.5.2 要設計怎樣的運行方式  009
         補充知識  “用戶”指的是誰?  012
         補充知識  解釋器並不會進行翻譯  012
         1.6 環境搭建  012
         1.6.1 搭建開發環境  012
         補充知識 關於bison與flex的安裝  014
         1.6.2 本書涉及的源代碼以及編譯器  015
         第2章  試做一個計算器  017
         2.1 yacc/lex是什麼  018
         補充知識  詞法分析器與解析器是各自獨立的  019
         2.2 試做一個計算器  020
         2.2.1 lex  021
         2.2.2 簡單正則錶達式講座  024
         2.2.3 yacc  026
         2.2.4 生成執行文件  033
         2.2.5 理解衝突所代錶的含義  034
         2.2.6 錯誤處理  040
         2.3 不藉助工具編寫計算器  041
         2.3.1 自製詞法分析器  041
         補充知識  保留字(關鍵字)  046
         補充知識 避免重復包含  047
         2.3.2 自製語法分析器  048
         補充知識 預讀記號的處理  053
         2.4 少許理論知識——LL(1)與LALR(1)  054
         補充知識 Pascal/C 中的語法處理訣竅  056
         2.5 習題:擴展計算器  056
         2.5.1 讓計算器支持括號  056
         2.5.2 讓計算器支持負數  058
         第3章  製作無類型語言crowbar  061
         3.1 製作crowbar ver.0.1語言的基礎部分  062
         3.1.1 crowbar是什麼  062
         3.1.2 程序的結構  063
         3.1.3 數據類型  064
         3.1.4 變量  064
         補充知識 初次賦值兼做變量聲明的理由  066
         補充說明 各種語言的全局變量處理  067
         3.1.5 語句與結構控製  067
         補充知識 elif、elsif、elseif的選擇  068
         3.1.6 語句與運算符  069
         3.1.7 內置函數  069
         3.1.8 讓crowbar支持C 語言調用  070
         3.1.9 從crowbar中調用C 語言(內置函數的編寫)  071
         3.2 預先準備  071
         3.2.1 模塊與命名規則  072
         3.2.2 內存管理模塊MEM  073
         補充知識 valgrind  075
         補充知識 富翁式編程  075
         補充知識 符號錶與扣留操作  076
         3.2.3 調試模塊DBG  076
         3.3 crowbar ver.0.1的實現  077
         3.3.1 crowbar的解釋器——CRB_Interpreter  077
         補充知識 不完全類型  080
         3.3.2 詞法分析——crowbar.l  081
         補充知識 靜態變量的許可範圍  084
         3.3.3 分析樹的構建——crowbar.y 與create.c  085
         3.3.4 常量摺疊  089
         3.3.5 錯誤信息  089
         補充知識 關於crowbar中使用的枚舉型定義  091
         3.3.6 運行——execute.c  092
         3.3.7 錶達式評估——eval.c  096
         3.3.8 值——CRB_Value  104
         3.3.9 原生指針型  105
         3.3.10 變量  106
         3.3.11 字符串與垃圾迴收機製——string_pool.c  108
         3.3.12 編譯與運行  110
         第4章  數組和mark-sweep垃圾迴收器  113
         4.1 crowbar ver.0.2  114
         4.1.1 crowbar的數組  114
         4.1.2 訪問數組元素  115
         4.1.3 數組是一種引用類型  116
         補充知識  “數組的數組”和多維數組  116
         4.1.4 為數組添加元素  118
         4.1.5 增加( 模擬) 函數調用功能  118
         4.1.6 其他細節  118
         4.2 製作mark-sweep GC  119
         4.2.1 引用數據類型的結構  119
         4.2.2 mark-sweep GC  121
         補充知識 引用和immutable  123
         4.2.3 crowbar棧  124
         4.2.4 其他根  127
         4.2.5 原生函數的形式參數  128
         4.3 實現GC 本身  129
         4.3.1 對象的管理方法  129
         4.3.2 GC 何時啓動  129
         4.3.3 sweep階段  132
         補充知識 GC 現存的問題  133
         補充知識 Coping GC  134
         4.4 其他修改  136
         4.4.1 修改語法  136
         4.4.2 函數的模擬  137
         4.4.3 左值的處理  139
         4.4.4 創建數組和原生函數的書寫方法  142
         4.4.5 原生指針類型的修改  144
         第5章  中文支持和Unicode  147
         5.1 中文支持策略和基礎知識  148
         5.1.1 現存問題  148
         5.1.2 寬字符(雙字節)串和多字節字符串  149
         補充知識 wchar_t 肯定能錶示1 個字符嗎?  150
         5.1.3 多字節字符/ 寬字符之間的轉換函數群  150
         5.2 Unicode  153
         5.2.1 Unicode的曆史  153
         5.2.2 Unicode的編碼方式  154
         補充知識 Unicode可以固定(字節)長度嗎?  156
         5.3 crowbar book_ver.0.3的實現  156
         5.3.1 要實現到什麼程度?  156
         5.3.2 發起轉換的時機  157
         5.3.3 關於區域設置  158
         5.3.4 解決0x5C問題  158
         補充知識 失敗的 #ifdef  160
         5.3.5 應該是什麼樣子  160
         補充知識 還可以是彆的樣子——Code Set Independent  161
         第6章  製作靜態類型的語言Diksam  163
         6.1 製作Diksam Ver 0.1語言的基本部分  164
         6.1.1 Diksam的運行狀態  164
         6.1.2 什麼是Diksam  165
         6.1.3 程序結構  165
         6.1.4 數據類型  166
         6.1.5 變量  166
         6.1.6 語句和流程控製  167
         6.1.7 錶達式  167
         6.1.8 內建函數  168
         6.1.9 其他  168
         6.2 什麼是靜態的/ 執行字節碼的語言  169
         6.2.1 靜態類型的語言  169
         6.2.2 什麼是字節碼  169
         6.2.3 將錶達式轉換為字節碼  170
         6.2.4 將控製結構轉換為字節碼  173
         6.2.5 函數的實現  173
         6.3 Diksam ver.0.1的實現——編譯篇  175
         6.3.1 目錄結構  175
         6.3.2 編譯的概要  176
         6.3.3 構建分析樹(create.c)  176
         6.3.4 修正分析樹(fix_tree.c)  179
         6.3.5 Diksam的運行形式——DVM_Executable  185
         6.3.6 常量池  186
         補充知識 YARV 的情況  187
         6.3.7 全局變量  188
         6.3.8 函數  189
         6.3.9 頂層結構的字節碼  189
         6.3.10 行號對應錶  190
         6.3.11 棧的需要量  190
         6.3.12 生成字節碼(generate.c)  191
         6.3.13 生成實際的編碼  193
         6.4 Diksam虛擬機  197
         6.4.1 加載/ 鏈接DVM_Executable到DVM  200
         6.4.2 執行——巨大的switch case  202
         6.4.3 函數調用  204
         第7章  為Diksam引入數組  207
         7.1 Diksam中數組的設計  208
         7.1.1 聲明數組類型的變量  208
         7.1.2 數組常量  209
         補充知識 D 語言的數組  210
         7.2 修改編譯器  210
         7.2.1 數組的語法規則  210
         7.2.2 TypeSpecifier結構體  212
         7.3 修改DVM  213
         7.3.1 增加指令  213
         補充知識 創建Java 的數組常量  215
         補充知識 C 語言中數組的初始化  217
         7.3.2 對象  217
         補充知識 ArrayStoreException  218
         7.3.3 增加null  219
         7.3.4 哎! 還缺點什麼吧?  219
         第8章  將類引入Diksam  221
         8.1 分割源文件  222
         8.1.1 包和分割源代碼  222
         補充知識 #include、文件名、行號  225
         8.1.2 DVM_ExecutableList  225
         8.1.3 ExecutableEntry  226
         8.1.4 分開編譯源代碼  227
         8.1.5 加載和再鏈接  230
         補充知識 動態加載時的編譯器  233
         8.2 設計Diksam中的類  233
         8.2.1 超簡單的麵嚮對象入門  233
         8.2.2 類的定義和實例創建  237
         8.2.3 繼承  239
         8.2.4 關於接口  241
         8.2.5 編譯與接口  242
         8.2.6 Diksam怎麼會設計成這樣?  243
         8.2.7 數組和字符串的方法  245
         8.2.8 檢查類的類型  246
         8.2.9 嚮下轉型  246
         8.3 關於類的實現——繼承和多態  247
         8.3.1 字段的內存布局  247
         8.3.2 多態——以單繼承為前提  249
         8.3.3 多繼承——C++  250
         8.3.4 Diksam的多繼承  252
         補充知識 無類型語言中的繼承  254
         8.3.5 重寫的條件  254
         8.4 關於類的實現  256
         8.4.1 語法規則  256
         8.4.2 編譯時的數據結構  258
         8.4.3 DVM_Executable中的數據結構  260
         8.4.4 與類有關的指令  262
         補充知識 方法調用、括號和方法指針  263
         8.4.5 方法調用  264
         8.4.6 super  266
         8.4.7 類的鏈接  266
         8.4.8 實現數組和字符串的方法  267
         8.4.9 類型檢查和嚮下轉型  267
         補充知識 對象終結器(finalizer)和析構函數(destructor)  268
         第9章  應用篇  271
         9.1 為crowbar引入對象和閉包  272
         9.1.1 crowbar的對象  272
         9.1.2 對象實現  273
         9.1.3 閉包  274
         9.1.4 方法  276
         9.1.5 閉包的實現  278
         9.1.6 試著跟蹤程序實際執行時的軌跡  281
         9.1.7 閉包的語法規則  284
         9.1.8 普通函數  284
         9.1.9 模擬方法(修改版)  285
         9.1.10 基於原型的麵嚮對象  286
         9.2 異常處理機製  286
         9.2.1 為crowbar引入異常  286
         9.2.2 setjmp()/longjmp()  289
         補充知識 Java 和C# 異常處理的不同  293
         9.2.3 為Diksam引入異常  295
         補充知識 catch 的編寫方法  296
         9.2.4 異常的數據結構  297
         9.2.5 異常處理時生成的字節碼299
         9.2.6 受查異常  301
         補充知識 受查異常的是與非 303
         補充知識 異常處理本身的是與非  304
         9.3 構建腳本  305
         9.3.1 基本思路  306
         9.3.2 YY_INPUT  307
         9.3.3 Diksam的構建腳本  308
         9.3.4 三次加載/ 鏈接  308
         9.4 為crowbar引入鬼車  309
         9.4.1 關於“鬼車”  309
         9.4.2 正則錶達式常量  310
         9.4.3 正則錶達式的相關函數  311
         9.5 其他  312
         9.5.1 foreach 和迭代器(crowbar)  312
         9.5.2 switch case(Diksam)  314
         9.5.3 enum(Diksam)  315
         9.5.4 delegate(Diksam)  316
         9.5.5 final、const(Diksam)  319
         附錄A  crowbar語言的設計  322
         附錄B  Diksam語言的設計  336
         附錄C  Diksam Virtual Machine 指令集  359
         編程語言實用化指南——寫在最後  369
         參考文獻  375
      · · · · · ·     (
收起)