【有庫存】NT售價: 750 元
《領域特定語言》是領域特定語言(Domain-Specific Language,DSL)領域的豐碑之作,由世界級軟件開發大師馬丁·福勒(Martin Fowler)歷時多年寫作而成。全書共57章,分為6個部分,全面介紹了DSL概念、DSL常見主題、外部DSL主題、內部DSL主題、備選計算模型以及代碼生成等內容,揭示了與編程語言無關的通用原則和模式,闡釋了如何通過DSL有效提高開發人員的生產力以及增進與領域專家的有效溝通,能為開發人員選擇和使用DSL提供有效的決策依據和指導方法。本書適合想要了解各種DSL及其構造方式,理解其通用原則、模式和適用場景,以提高開發生產力和溝通能力的軟件開發人員閱讀。
第 一部分 敘述第 1章 入門示例 21.1 古堡安全系統 21.2 狀態機模型 41.3 為格蘭特女士的控制器編程 71.4 語言和語義模型 131.5 使用代碼生成 151.6 使用語言工作臺 171.7 可視化 19第 2章 使用DSL 212.1 定義DSL 212.1.1 DSL的邊界 222.1.2 片段DSL和獨立DSL 252.2 為何使用DSL 252.2.1 提高開發效率 262.2.2 與領域專家溝通 262.2.3 改變執行環境 272.2.4 備選計算模型 282.3 DSL的問題 282.3.1 語言噪聲 292.3.2 構建成本 292.3.3 集中營語言 302.3.4 狹隘的抽象 302.4 廣義的語言處理 312.5 DSL的生命周期 312.6 設計優良的DSL從何而來 33第3章 實現DSL 343.1 DSL處理的架構 343.2 語法分析器的工作方式 373.3 文法、語法和語義 393.4 語法分析中的數據 393.5 宏 413.6 DSL的測試 423.6.1 語義模型的測試 423.6.2 語法分析器的測試 463.6.3 腳本的測試 493.7 錯誤處理 503.8 DSL的遷移 51第4章 實現內部DSL 534.1 連貫API和命令查詢API 534.2 對語法分析層的需要 564.3 使用函數 574.4 字面量集合 614.5 基于文法選擇內部元素 624.6 閉包 634.7 語法分析樹操作 654.8 注解 664.9 字面量擴展 674.10 降低語法噪聲 684.11 動態接收 684.12 提供類型檢查 69第5章 實現外部DSL 715.1 語法分析策略 715.2 輸出生成策略 745.3 解析中的概念 755.3.1 單獨的詞法分析 755.3.2 文法和語言 765.3.3 正則文法、上下文無關文法和上下文相關文法 775.3.4 自頂向下解析和自底向上解析 785.4 混入另一種語言 805.5 XML DSL 81第6章 在內部DSL和外部DSL之間做選擇 836.1 學習曲線 836.2 構建成本 846.3 程序員的熟悉度 856.4 與領域專家溝通 856.5 與宿主語言混合 856.6 表達性強邊界 866.7 運行時配置 866.8 趨于通用 876.9 組合多種DSL 876.10 小結 88第7章 備選計算模型 897.1 決策表 917.2 產生式規則系統 927.3 狀態機 937.4 依賴網絡 947.5 選擇模型 94第8章 代碼生成 958.1 選擇生成什么 968.2 如何生成 988.3 混合生成的代碼和手寫代碼 998.4 生成可讀的代碼 1008.5 語法分析前的代碼生成 1008.6 延伸閱讀 101第9章 語言工作臺 1029.1 語言工作臺的要素 1029.2 模式定義語言和元模型 1039.3 源編輯和投射編輯 1079.4 說明性編程 1099.5 工具之旅 1109.6 語言工作臺和CASE工具 1119.7 是否應該使用語言工作臺 112第二部分 常見主題第 10章 DSL集錦 11410.1 Graphviz 11410.2 JMock 11510.3 CSS 11610.4 HQL 11810.5 XAML 11810.6 FIT 12010.7 Make等 121第 11章 語義模型(Semantic Model) 12311.1 運行機制 12311.2 使用時機 12511.3 入門示例(Java) 126第 12章 符號表(Symbol Table) 12712.1 運行機制 12712.2 使用時機 12912.3 延伸閱讀 12912.4 以外部DSL實現的依賴網絡(Java和ANTLR) 13012.5 在內部DSL中使用符號鍵(Ruby) 13112.6 以枚舉作為靜態類型符號(Java) 132第 13章 上下文變量(Context Variable) 13513.1 運行機制 13513.2 使用時機 13613.3 讀取INI文件(C#) 136第 14章 構造型構建器(Construction Builder) 13914.1 運行機制 13914.2 使用時機 14014.3 構建簡單的航班數據(C#) 140第 15章 宏(Macro) 14215.1 運行機制 14215.1.1 文本宏 14315.1.2 語法宏 14615.2 使用時機 149第 16章 通知(Notification) 15016.1 運行機制 15016.2 使用時機 15116.3 非常簡單的通知(C#) 15116.4 對通知進行語法分析(Java) 152第三部分 外部DSL主題第 17章 分隔符制導翻譯(Delimiter-Directed Translation) 15617.1 運行機制 15617.2 使用時機 15917.3 常客記分(C#) 15917.3.1 語義模型 15917.3.2 語法分析器 16117.4 使用格蘭特女士的控制器對非自治語句進行語法分析(Java) 164第 18章 語法制導翻譯(Syntax-Directed Translation) 17118.1 運行機制 17218.1.1 詞法分析器 17218.1.2 語法分析器 17518.1.3 產生輸出 17718.1.4 語義謂詞 17718.2 使用時機 17818.3 延伸閱讀 178第 19章 巴克斯-諾爾范式(BNF) 17919.1 運行機制 17919.1.1 多重性符號(克林運算符) 18119.1.2 其他有用的運算符 18219.1.3 解析表達式文法 18219.1.4 將EBNF轉換為基礎BNF 18319.1.5 行為代碼 18519.2 使用時機 187第 20章 基于正則表達式表的詞法分析器(Regex Table Lexer) 18820.1 運行機制 18920.2 使用時機 19020.3 對格蘭特女士的控制器進行詞法分析(Java) 190第 21章 遞歸下降語法分析器(Recursive Descent Parser) 19321.1 運行機制 19421.2 使用時機 19621.3 延伸閱讀 19721.4 遞歸下降和格蘭特女士的控制器(Java) 197第 22章 語法分析器組合子(Parser Combinator) 20222.1 運行機制 20322.1.1 處理動作 20522.1.2 函數式風格的組合子 20622.2 使用時機 20722.3 語法分析器組合子和格蘭特女士的控制器(Java) 207第 23章 語法分析器生成器(Parser Generator) 21423.1 運行機制 21423.2 使用時機 21623.3 Hello World(Java和ANTLR) 21623.3.1 編寫基本的文法 21723.3.2 構建語法分析器 21823.3.3 為文法添加行為代碼 22023.3.4 使用代溝 221第 24章 樹構造(Tree Construction) 22424.1 運行機制 22424.2 使用時機 22624.3 使用ANTLR的樹構造語法(Java和ANTLR) 22724.3.1 分詞 22824.3.2 語法分析 22824.3.3 組裝語義模型 23024.4 使用行為代碼進行樹構造(Java和ANTLR) 233第 25章 內嵌翻譯(Embedded Translation) 23925.1 運行機制 23925.2 使用時機 24025.3 格蘭特女士的控制器(Java和ANTLR) 240第 26章 內嵌解釋(Embedded Interpretation) 24426.1 運行機制 24426.2 使用時機 24426.3 計算器(ANTLR和Java) 245第 27章 外來代碼(Foreign Code) 24727.1 運行機制 24727.2 使用時機 24827.3 嵌入動態代碼(ANTLR、Java和JavaScript) 24927.3.1 語義模型 24927.3.2 語法分析器 251第 28章 可變分詞方式(Alternative Tokenization) 25528.1 運行機制 25528.1.1 引用 25628.1.2 詞法狀態 25828.1.3 修改記號類型 25928.1.4 忽略記號類型 26028.2 使用時機 261第 29章 嵌套運算符表達式(Nested Operator Expression) 26229.1 運行機制 26229.1.1 自底向上的語法分析器 26229.1.2 自頂向下的語法分析器 26429.2 使用時機 266第30章 換行分隔符(Newline Separator) 26730.1 運行機制 26730.2 使用時機 269第31章 外部DSL拾遺 27131.1 語法縮進 27131.2 模塊化文法 273第四部分 內部DSL主題第32章 表達式構建器(Expression Builder) 27632.1 運行機制 27732.2 使用時機 27732.3 用構建器和不用構建器的連貫接口日程表(Java) 27832.4 對日程表使用多個構建器(Java) 280第33章 函數序列(Function Sequence) 28333.1 運行機制 28333.2 使用時機 28433.3 簡單的計算機配置范例(Java) 284第34章 嵌套函數(Nested Function) 28734.1 運行機制 28734.2 使用時機 28934.3 簡單的計算機配置示例(Java) 28934.4 用記號處理多個不同的參數(C#) 29134.5 針對IDE支持使用子類型記號(Java) 29234.6 使用對象初始化器(C#) 29434.7 重復事件(C#) 29534.7.1 語義模型 29534.7.2 DSL 298第35章 方法級聯(Method Chaining) 30035.1 運行機制 30035.1.1 使用構建器還是值 30135.1.2 收尾問題 30235.1.3 分層結構 30335.1.4 漸進式接口 30335.2 使用時機 30435.3 簡單的計算機配置示例(Java) 30435.4 帶有屬性的方法級聯(C#) 30735.5 漸進式接口(C#) 308第36章 對象作用域(Object Scoping) 31036.1 運行機制 31036.2 使用時機 31136.3 安全代碼(C#) 31236.3.1 語義模型 31236.3.2 DSL 31436.4 使用實例求值(Ruby) 31636.5 使用實例初始化程序(Java) 318第37章 閉包(Closure) 32037.1 運行機制 32037.2 使用時機 324第38章 嵌套閉包(Nested Closure) 32538.1 運行機制 32538.2 使用時機 32638.3 用嵌套閉包來包裝函數序列(Ruby) 32738.4 簡單的C#范例(C#) 32938.5 使用方法級聯(Ruby) 33038.6 帶有顯式閉包參數的函數序列(Ruby) 33138.7 使用實例求值(Ruby) 333第39章 字面量列表(Literal List) 33639.1 運行機制 33639.2 使用時機 336第40章 字面量映射(Literal Map) 33840.1 運行機制 33840.2 使用時機 33940.3 使用列表和映射表達計算機的配置信息(Ruby) 33940.4 演化為格林斯潘式(Ruby) 340第41章 動態接收(Dynamic Reception) 34441.1 運行機制 34441.2 使用時機 34541.3 積分—使用經過語法分析的方法名(Ruby) 34741.3.1 模型 34741.3.2 構建器 34941.4 積分—使用方法級聯(Ruby) 35041.4.1 模型 35141.4.2 構建器 35141.5 去除密室控制器中的引用(JRuby) 354第42章 注解(Annotation) 35942.1 運行機制 35942.1.1 定義注解 36042.1.2 處理注解 36142.2 使用時機 36242.3 用于運行時處理的自定義語法(Java) 36242.4 使用類方法(Ruby) 36442.5 動態代碼生成(Ruby) 365第43章 語法分析樹操作(Parse Tree Manipulation) 36743.1 運行機制 36743.2 使用時機 36843.3 由C#條件生成IMAP查詢(C#) 36943.3.1 語義模型 36943.3.2 使用C#構建 37143.3.3 退后一步 375第44章 類符號表(Class Symbol Table) 37744.1 運行機制 37744.2 使用時機 37844.3 靜態類型的類符號表(Java) 379第45章 文本打磨(Textual Polishing) 38545.1 運行機制 38545.2 使用時機 38645.3 打磨后的折扣規則(Ruby) 386第46章 字面量擴展(Literal Extension) 38946.1 運行機制 38946.2 使用時機 39046.3 食譜配料(C#) 390第五部分 備選計算模型第47章 適應性模型(Adaptive Model) 39447.1 運行機制 39547.1.1 在適應性模型中納入命令式代碼 39647.1.2 工具 39747.2 使用時機 398第48章 決策表(Decision Table) 40048.1 運行機制 40048.2 使用時機 40148.3 訂單費用計算(C#) 40248.3.1 模型 40248.3.2 語法分析器 405第49章 依賴網絡(Dependency Network) 40849.1 運行機制 40849.2 使用時機 41049.3 分析藥劑(C#) 41149.3.1 語義模型 41149.3.2 語法分析器 413第50章 產生式規則系統(Production Rule System) 41450.1 運行機制 41550.1.1 規則鏈 41550.1.2 矛盾的推理 41650.1.3 規則結構里的模式 41750.2 使用時機 41750.3 俱樂部會員驗證(C#) 41850.3.1 模型 41850.3.2 語法分析器 41950.3.3 演進DSL 42050.4 適任資格的規則:擴展俱樂部成員(C#) 42150.4.1 模型 42250.4.2 語法分析器 425第51章 狀態機(State Machine) 42651.1 運行機制 42651.2 使用時機 42851.3 密室控制器(Java) 428第六部分 代碼生成第52章 基于轉換器的代碼生成(Transformer Generation) 43052.1 運行機制 43052.2 使用時機 43152.3 密室控制器(Java生成C) 432第53章 基于模板的代碼生成(Templated Generation) 43553.1 運行機制 43553.2 使用時機 43653.3 使用嵌套條件生成密室狀態機(Velocity和Java生成C) 437第54章 嵌入助手(Embedment Helper) 44254.1 運行機制 44354.2 使用時機 44354.3 密室狀態(Java和ANTLR) 44454.4 輔助類是否應該生成HTML(Java和Velocity) 446第55章 基于模型的代碼生成(Model-Aware Generation) 44855.1 運行機制 44855.2 使用時機 44955.3 密室狀態機(C) 44955.4 動態加載狀態機(C) 455第56章 無視模型的代碼生成(Model Ignorant Generation) 45856.1 運行機制 45856.2 使用時機 45956.3 使用嵌套條件的密室狀態機(C) 459第57章 代溝(Generation Gap) 46157.1 運行機制 46157.2 使用時機 46257.3 根據數據模式生成類(Java和一些Ruby) 463參考文獻 467模式清單 468速查表 470