領域特定語言 Domain-Specific Languages

[美]馬丁·福勒(Martin Fowler)

  • 領域特定語言-preview-1
  • 領域特定語言-preview-2
領域特定語言-preview-1

買這商品的人也買了...

商品描述

《領域特定語言》是領域特定語言(Domain-Specific Language,DSL)領域的豐碑之作,由世界級軟件開發大師馬丁·福勒(Martin Fowler)歷時多年寫作而成。

全書共57章,分為6個部分,全面介紹了DSL概念、DSL常見主題、外部DSL主題、內部DSL主題、備選計算模型以及代碼生成等內容,揭示了與編程語言無關的通用原則和模式,闡釋瞭如何通過DSL有效提高開發人員的生產力以及增進與領域專家的有效溝通,能為開發人員選擇和使用DSL提供有效的決策依據和指導方法。

本書適合想要瞭解各種DSL及其構造方式,理解其通用原則、模式和適用場景,以提高開發生產力和溝通能力的軟件開發人員閱讀。

作者簡介

馬丁.福勒(Martin Fowler),***軟件開發大師,ThoughtWorks首席科學家。
他是一位作家、演說者、諮詢師和泛軟件開發領域的意見領袖。
他致力於改善企業級的軟件設計,對優秀的設計以及支撐優秀設計的工程實踐孜孜以求。
他在重構、面向對象分析設計、模式、XP和UML等領域都有卓越貢獻,著有《重構:改善既有代碼的設計》《分析模式:可複用的對像模型》《領域特定語言》《企業應用架構模式》等經典著作。

目錄大綱

第一部分敘述
第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