領域特定語言( 簡體 字) | |
作者:[美]馬丁·福勒(Martin Fowler) | 類別:1. -> 程式設計 -> 綜合 |
出版社:人民郵電出版社 | 3dWoo書號: 54730 詢問書籍請說出此書號! 有庫存 NT售價: 750 元 |
出版日:7/1/2021 | |
頁數:473 | |
光碟數:0 | |
站長推薦: | |
印刷:黑白印刷 | 語系: ( 簡體 字 ) |
ISBN:9787115563163 | 加入購物車 │加到我的最愛 (請先登入會員) |
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證, 繁體書的下載亦請直接連絡出版社) | |
第 一部分 敘述
第 1章 入門示例 2 1.1 古堡安全系統 2 1.2 狀態機模型 4 1.3 為格蘭特女士的控制器編程 7 1.4 語言和語義模型 13 1.5 使用代碼生成 15 1.6 使用語言工作臺 17 1.7 可視化 19 第 2章 使用DSL 21 2.1 定義DSL 21 2.1.1 DSL的邊界 22 2.1.2 片段DSL和獨立DSL 25 2.2 為何使用DSL 25 2.2.1 提高開發效率 26 2.2.2 與領域專家溝通 26 2.2.3 改變執行環境 27 2.2.4 備選計算模型 28 2.3 DSL的問題 28 2.3.1 語言噪聲 29 2.3.2 構建成本 29 2.3.3 集中營語言 30 2.3.4 狹隘的抽象 30 2.4 廣義的語言處理 31 2.5 DSL的生命周期 31 2.6 設計優良的DSL從何而來 33 第3章 實現DSL 34 3.1 DSL處理的架構 34 3.2 語法分析器的工作方式 37 3.3 文法、語法和語義 39 3.4 語法分析中的數據 39 3.5 宏 41 3.6 DSL的測試 42 3.6.1 語義模型的測試 42 3.6.2 語法分析器的測試 46 3.6.3 腳本的測試 49 3.7 錯誤處理 50 3.8 DSL的遷移 51 第4章 實現內部DSL 53 4.1 連貫API和命令查詢API 53 4.2 對語法分析層的需要 56 4.3 使用函數 57 4.4 字面量集合 61 4.5 基于文法選擇內部元素 62 4.6 閉包 63 4.7 語法分析樹操作 65 4.8 注解 66 4.9 字面量擴展 67 4.10 降低語法噪聲 68 4.11 動態接收 68 4.12 提供類型檢查 69 第5章 實現外部DSL 71 5.1 語法分析策略 71 5.2 輸出生成策略 74 5.3 解析中的概念 75 5.3.1 單獨的詞法分析 75 5.3.2 文法和語言 76 5.3.3 正則文法、上下文無關文法和上下文相關文法 77 5.3.4 自頂向下解析和自底向上解析 78 5.4 混入另一種語言 80 5.5 XML DSL 81 第6章 在內部DSL和外部DSL之間做選擇 83 6.1 學習曲線 83 6.2 構建成本 84 6.3 程序員的熟悉度 85 6.4 與領域專家溝通 85 6.5 與宿主語言混合 85 6.6 表達性強邊界 86 6.7 運行時配置 86 6.8 趨于通用 87 6.9 組合多種DSL 87 6.10 小結 88 第7章 備選計算模型 89 7.1 決策表 91 7.2 產生式規則系統 92 7.3 狀態機 93 7.4 依賴網絡 94 7.5 選擇模型 94 第8章 代碼生成 95 8.1 選擇生成什么 96 8.2 如何生成 98 8.3 混合生成的代碼和手寫代碼 99 8.4 生成可讀的代碼 100 8.5 語法分析前的代碼生成 100 8.6 延伸閱讀 101 第9章 語言工作臺 102 9.1 語言工作臺的要素 102 9.2 模式定義語言和元模型 103 9.3 源編輯和投射編輯 107 9.4 說明性編程 109 9.5 工具之旅 110 9.6 語言工作臺和CASE工具 111 9.7 是否應該使用語言工作臺 112 第二部分 常見主題 第 10章 DSL集錦 114 10.1 Graphviz 114 10.2 JMock 115 10.3 CSS 116 10.4 HQL 118 10.5 XAML 118 10.6 FIT 120 10.7 Make等 121 第 11章 語義模型(Semantic Model) 123 11.1 運行機制 123 11.2 使用時機 125 11.3 入門示例(Java) 126 第 12章 符號表(Symbol Table) 127 12.1 運行機制 127 12.2 使用時機 129 12.3 延伸閱讀 129 12.4 以外部DSL實現的依賴網絡(Java和ANTLR) 130 12.5 在內部DSL中使用符號鍵(Ruby) 131 12.6 以枚舉作為靜態類型符號(Java) 132 第 13章 上下文變量(Context Variable) 135 13.1 運行機制 135 13.2 使用時機 136 13.3 讀取INI文件(C#) 136 第 14章 構造型構建器(Construction Builder) 139 14.1 運行機制 139 14.2 使用時機 140 14.3 構建簡單的航班數據(C#) 140 第 15章 宏(Macro) 142 15.1 運行機制 142 15.1.1 文本宏 143 15.1.2 語法宏 146 15.2 使用時機 149 第 16章 通知(Notification) 150 16.1 運行機制 150 16.2 使用時機 151 16.3 非常簡單的通知(C#) 151 16.4 對通知進行語法分析(Java) 152 第三部分 外部DSL主題 第 17章 分隔符制導翻譯(Delimiter-Directed Translation) 156 17.1 運行機制 156 17.2 使用時機 159 17.3 常客記分(C#) 159 17.3.1 語義模型 159 17.3.2 語法分析器 161 17.4 使用格蘭特女士的控制器對非自治語句進行語法分析(Java) 164 第 18章 語法制導翻譯(Syntax-Directed Translation) 171 18.1 運行機制 172 18.1.1 詞法分析器 172 18.1.2 語法分析器 175 18.1.3 產生輸出 177 18.1.4 語義謂詞 177 18.2 使用時機 178 18.3 延伸閱讀 178 第 19章 巴克斯-諾爾范式(BNF) 179 19.1 運行機制 179 19.1.1 多重性符號(克林運算符) 181 19.1.2 其他有用的運算符 182 19.1.3 解析表達式文法 182 19.1.4 將EBNF轉換為基礎BNF 183 19.1.5 行為代碼 185 19.2 使用時機 187 第 20章 基于正則表達式表的詞法分析器(Regex Table Lexer) 188 20.1 運行機制 189 20.2 使用時機 190 20.3 對格蘭特女士的控制器進行詞法分析(Java) 190 第 21章 遞歸下降語法分析器(Recursive Descent Parser) 193 21.1 運行機制 194 21.2 使用時機 196 21.3 延伸閱讀 197 21.4 遞歸下降和格蘭特女士的控制器(Java) 197 第 22章 語法分析器組合子(Parser Combinator) 202 22.1 運行機制 203 22.1.1 處理動作 205 22.1.2 函數式風格的組合子 206 22.2 使用時機 207 22.3 語法分析器組合子和格蘭特女士的控制器(Java) 207 第 23章 語法分析器生成器(Parser Generator) 214 23.1 運行機制 214 23.2 使用時機 216 23.3 Hello World(Java和ANTLR) 216 23.3.1 編寫基本的文法 217 23.3.2 構建語法分析器 218 23.3.3 為文法添加行為代碼 220 23.3.4 使用代溝 221 第 24章 樹構造(Tree Construction) 224 24.1 運行機制 224 24.2 使用時機 226 24.3 使用ANTLR的樹構造語法(Java和ANTLR) 227 24.3.1 分詞 228 24.3.2 語法分析 228 24.3.3 組裝語義模型 230 24.4 使用行為代碼進行樹構造(Java和ANTLR) 233 第 25章 內嵌翻譯(Embedded Translation) 239 25.1 運行機制 239 25.2 使用時機 240 25.3 格蘭特女士的控制器(Java和ANTLR) 240 第 26章 內嵌解釋(Embedded Interpretation) 244 26.1 運行機制 244 26.2 使用時機 244 26.3 計算器(ANTLR和Java) 245 第 27章 外來代碼(Foreign Code) 247 27.1 運行機制 247 27.2 使用時機 248 27.3 嵌入動態代碼(ANTLR、Java和JavaScript) 249 27.3.1 語義模型 249 27.3.2 語法分析器 251 第 28章 可變分詞方式(Alternative Tokenization) 255 28.1 運行機制 255 28.1.1 引用 256 28.1.2 詞法狀態 258 28.1.3 修改記號類型 259 28.1.4 忽略記號類型 260 28.2 使用時機 261 第 29章 嵌套運算符表達式(Nested Operator Expression) 262 29.1 運行機制 262 29.1.1 自底向上的語法分析器 262 29.1.2 自頂向下的語法分析器 264 29.2 使用時機 266 第30章 換行分隔符(Newline Separator) 267 30.1 運行機制 267 30.2 使用時機 269 第31章 外部DSL拾遺 271 31.1 語法縮進 271 31.2 模塊化文法 273 第四部分 內部DSL主題 第32章 表達式構建器(Expression Builder) 276 32.1 運行機制 277 32.2 使用時機 277 32.3 用構建器和不用構建器的連貫接口日程表(Java) 278 32.4 對日程表使用多個構建器(Java) 280 第33章 函數序列(Function Sequence) 283 33.1 運行機制 283 33.2 使用時機 284 33.3 簡單的計算機配置范例(Java) 284 第34章 嵌套函數(Nested Function) 287 34.1 運行機制 287 34.2 使用時機 289 34.3 簡單的計算機配置示例(Java) 289 34.4 用記號處理多個不同的參數(C#) 291 34.5 針對IDE支持使用子類型記號(Java) 292 34.6 使用對象初始化器(C#) 294 34.7 重復事件(C#) 295 34.7.1 語義模型 295 34.7.2 DSL 298 第35章 方法級聯(Method Chaining) 300 35.1 運行機制 300 35.1.1 使用構建器還是值 301 35.1.2 收尾問題 302 35.1.3 分層結構 303 35.1.4 漸進式接口 303 35.2 使用時機 304 35.3 簡單的計算機配置示例(Java) 304 35.4 帶有屬性的方法級聯(C#) 307 35.5 漸進式接口(C#) 308 第36章 對象作用域(Object Scoping) 310 36.1 運行機制 310 36.2 使用時機 311 36.3 安全代碼(C#) 312 36.3.1 語義模型 312 36.3.2 DSL 314 36.4 使用實例求值(Ruby) 316 36.5 使用實例初始化程序(Java) 318 第37章 閉包(Closure) 320 37.1 運行機制 320 37.2 使用時機 324 第38章 嵌套閉包(Nested Closure) 325 38.1 運行機制 325 38.2 使用時機 326 38.3 用嵌套閉包來包裝函數序列(Ruby) 327 38.4 簡單的C#范例(C#) 329 38.5 使用方法級聯(Ruby) 330 38.6 帶有顯式閉包參數的函數序列(Ruby) 331 38.7 使用實例求值(Ruby) 333 第39章 字面量列表(Literal List) 336 39.1 運行機制 336 39.2 使用時機 336 第40章 字面量映射(Literal Map) 338 40.1 運行機制 338 40.2 使用時機 339 40.3 使用列表和映射表達計算機的配置信息(Ruby) 339 40.4 演化為格林斯潘式(Ruby) 340 第41章 動態接收(Dynamic Reception) 344 41.1 運行機制 344 41.2 使用時機 345 41.3 積分—使用經過語法分析的方法名(Ruby) 347 41.3.1 模型 347 41.3.2 構建器 349 41.4 積分—使用方法級聯(Ruby) 350 41.4.1 模型 351 41.4.2 構建器 351 41.5 去除密室控制器中的引用(JRuby) 354 第42章 注解(Annotation) 359 42.1 運行機制 359 42.1.1 定義注解 360 42.1.2 處理注解 361 42.2 使用時機 362 42.3 用于運行時處理的自定義語法(Java) 362 42.4 使用類方法(Ruby) 364 42.5 動態代碼生成(Ruby) 365 第43章 語法分析樹操作(Parse Tree Manipulation) 367 43.1 運行機制 367 43.2 使用時機 368 43.3 由C#條件生成IMAP查詢(C#) 369 43.3.1 語義模型 369 43.3.2 使用C#構建 371 43.3.3 退后一步 375 第44章 類符號表(Class Symbol Table) 377 44.1 運行機制 377 44.2 使用時機 378 44.3 靜態類型的類符號表(Java) 379 第45章 文本打磨(Textual Polishing) 385 45.1 運行機制 385 45.2 使用時機 386 45.3 打磨后的折扣規則(Ruby) 386 第46章 字面量擴展(Literal Extension) 389 46.1 運行機制 389 46.2 使用時機 390 46.3 食譜配料(C#) 390 第五部分 備選計算模型 第47章 適應性模型(Adaptive Model) 394 47.1 運行機制 395 47.1.1 在適應性模型中納入命令式代碼 396 47.1.2 工具 397 47.2 使用時機 398 第48章 決策表(Decision Table) 400 48.1 運行機制 400 48.2 使用時機 401 48.3 訂單費用計算(C#) 402 48.3.1 模型 402 48.3.2 語法分析器 405 第49章 依賴網絡(Dependency Network) 408 49.1 運行機制 408 49.2 使用時機 410 49.3 分析藥劑(C#) 411 49.3.1 語義模型 411 49.3.2 語法分析器 413 第50章 產生式規則系統(Production Rule System) 414 50.1 運行機制 415 50.1.1 規則鏈 415 50.1.2 矛盾的推理 416 50.1.3 規則結構里的模式 417 50.2 使用時機 417 50.3 俱樂部會員驗證(C#) 418 50.3.1 模型 418 50.3.2 語法分析器 419 50.3.3 演進DSL 420 50.4 適任資格的規則:擴展俱樂部成員(C#) 421 50.4.1 模型 422 50.4.2 語法分析器 425 第51章 狀態機(State Machine) 426 51.1 運行機制 426 51.2 使用時機 428 51.3 密室控制器(Java) 428 第六部分 代碼生成 第52章 基于轉換器的代碼生成(Transformer Generation) 430 52.1 運行機制 430 52.2 使用時機 431 52.3 密室控制器(Java生成C) 432 第53章 基于模板的代碼生成(Templated Generation) 435 53.1 運行機制 435 53.2 使用時機 436 53.3 使用嵌套條件生成密室狀態機(Velocity和Java生成C) 437 第54章 嵌入助手(Embedment Helper) 442 54.1 運行機制 443 54.2 使用時機 443 54.3 密室狀態(Java和ANTLR) 444 54.4 輔助類是否應該生成HTML(Java和Velocity) 446 第55章 基于模型的代碼生成(Model-Aware Generation) 448 55.1 運行機制 448 55.2 使用時機 449 55.3 密室狀態機(C) 449 55.4 動態加載狀態機(C) 455 第56章 無視模型的代碼生成(Model Ignorant Generation) 458 56.1 運行機制 458 56.2 使用時機 459 56.3 使用嵌套條件的密室狀態機(C) 459 第57章 代溝(Generation Gap) 461 57.1 運行機制 461 57.2 使用時機 462 57.3 根據數據模式生成類(Java和一些Ruby) 463 參考文獻 467 模式清單 468 速查表 470 《領域特定語言》是領域特定語言(Domain-Specific Language,DSL)領域的豐碑之作,由世界級軟件開發大師馬丁·福勒(Martin Fowler)歷時多年寫作而成。
全書共57章,分為6個部分,全面介紹了DSL概念、DSL常見主題、外部DSL主題、內部DSL主題、備選計算模型以及代碼生成等內容,揭示了與編程語言無關的通用原則和模式,闡釋了如何通過DSL有效提高開發人員的生產力以及增進與領域專家的有效溝通,能為開發人員選擇和使用DSL提供有效的決策依據和指導方法。 本書適合想要了解各種DSL及其構造方式,理解其通用原則、模式和適用場景,以提高開發生產力和溝通能力的軟件開發人員閱讀。 |