领域特定语言

Martin Fowler

文学

DSL 编程 程序设计 软件开发 计算机 软件工程 计算机科学 Programming

2013-3

机械工业出版社华章公司

目录
译者序 前言 第一部分 叙  述 第1章入门例子2 1.1 哥特式建筑安全系统2 1.2 状态机模型4 1.3 为格兰特小姐的控制器编写程序7 1.4 语言和语义模型13 1.5使用代码生成15 1.6 使用语言工作台17 1.7 可视化20 第2章 使用DSL21 2.1定义DSL21 2.1.1DSL的边界22 2.1.2片段DSL和独立DSL25 2.2为何需要DSL25 2.2.1 提高开发效率26 2.2.2与领域专家的沟通26 2.2.3执行环境的改变27 2.2.4其他计算模型28 2.3DSL的问题28 2.3.1语言噪音29 2.3.2构建成本29 2.3.3集中营语言30 2.3.4 “一叶障目”的抽象30 2.4广义的语言处理31 2.5DSL的生命周期31 2.6设计优良的DSL从何而来32 第3章实现DSL34 3.1DSL处理之架构34 3.2解析器的工作方式37 3.3文法、语法和语义39 3.4解析中的数据39 3.5宏41 3.6测试DSL42 3.6.1语义模型的测试42 3.6.2解析器的测试45 3.6.3脚本的测试49 3.7错误处理50 3.8DSL迁移51 第4章实现内部DSL54 4.1连贯API与命令–查询API54 4.2解析层的需求57 4.3使用函数58 4.4字面量集合61 4.5基于文法选择内部元素63 4.6闭包64 4.7解析树操作66 4.8标注67 4.9为字面量提供扩展69 4.10消除语法噪音69 4.11动态接收69 4.12提供类型检查70 第5章实现外部DSL72 5.1语法分析策略72 5.2输出生成策略74 5.3解析中的概念76 5.3.1单独的词法分析76 5.3.2文法和语言77 5.3.3正则文法、上下文无关文法和上下文相关文法77 5.3.4自顶向下解析和自底向上解析79 5.4混入另一种语言81 5.5XML DSL82 第6章内部DSL vs 外部DSL84 6.1学习曲线84 6.2创建成本85 6.3程序员的熟悉度85 6.4与领域专家沟通86 6.5与宿主语言混合86 6.6强边界87 6.7运行时配置87 6.8趋于平庸88 6.9组合多种DSL88 6.10总结89 第7章其他计算模型概述90 7.1几种计算模型92 7.1.1决策表92 7.1.2产生式规则系统93 7.1.3状态机94 7.1.4依赖网络95 7.1.5选择模型95 第8章代码生成96 8.1选择生成什么96 8.2如何生成99 8.3混合生成代码和手写代码100 8.4生成可读的代码101 8.5解析之前的代码生成101 8.6延伸阅读101 第9章语言工作台102 9.1语言工作台之要素102 9.2模式定义语言和元模型103 9.3源码编辑和投射编辑107 9.4说明性编程109 9.5工具之旅110 9.6语言工作台和CASE工具112 9.7我们该使用语言工作台吗112 第二部分 通 用 主 题 第10章各种DSL116 10.1Graphviz116 10.2JMock117 10.3CSS118 10.4HQL119 10.5XAML120 10.6FIT122 10.7Make等123 第11章语义模型125 11.1工作原理125 11.2使用场景127 11.3入门例子(Java)128 第12章符号表129 12.1工作原理129 12.2使用场景131 12.3参考文献131 12.4以外部DSL实现的依赖网络(Java和ANTLR)131 12.5在一个内部DSL中使用符号键(Ruby)133 12.6用枚举作为静态类型符号(Java)134 第13章语境变量137 13.1工作原理137 13.2使用场景137 13.3读取INI文件(C#)138 第14章构造型生成器141 14.1工作原理141 14.2使用场景142 14.3构建简单的航班信息(C#)142 第15章宏144 15.1工作原理144 15.1.1文本宏145 15.1.2语法宏148 15.2使用场景151 第16章通知153 16.1工作原理153 16.2使用场景154 16.3一个非常简单的通知(C#)154 16.4解析中的通知(Java)155 第三部分 外部DSL主题 第17章分隔符指导翻译160 17.1工作原理160 17.2使用场景162 17.3常客记分(C#)163 17.3.1 语义模型163 17.3.2解析器165 17.4使用格兰特小姐的控制器解析非自治语句(Java)168 第18章语法指导翻译175 18.1工作原理175 18.1.1词法分析器176 18.1.2语法分析器179 18.1.3产生输出181 18.1.4语义预测181 18.2使用场景182 18.3参考文献182 第19章BNF183 19.1工作原理183 19.1.1多重性符号(Kleene运算符)184 19.1.2其他一些有用的运算符186 19.1.3解析表达式文法186 19.1.4将EBNF转换为基础BNF187 19.1.5行为代码189 19.2使用场景191 第20章基于正则表达式表的词法分析器192 20.1工作原理192 20.2使用场景193 20.3格兰特小姐控制器的词法处理(Java)194 第21章递归下降法语法解析器197 21.1工作原理197 21.2使用场景200 21.3参考文献200 21.4递归下降和格兰特小姐的控制器(Java)201 第22章解析器组合子205 22.1工作原理206 22.1.1处理动作208 22.1.2函数式风格的组合子209 22.2使用场景209 22.3解析器组合子和格兰特小姐的控制器(Java)210 第23章解析器生成器217 23.1工作原理217 23.2使用场景219 23.3Hello World(Java和ANTLR)219 23.3.1编写基本的文法220 23.3.2构建语法分析器221 23.3.3为文法添加代码动作223 23.3.4使用代沟225 第24章树的构建227 24.1工作原理227 24.2使用场景229 24.3使用ANTLR的树构建语法(Java和ANTLR)230 24.3.1标记解释230 24.3.2解析231 24.3.3组装语义模型233 24.4使用代码动作进行树的构建(Java和ANTLR)236 第25章嵌入式语法翻译242 25.1工作原理242 25.2使用场景243 25.3格兰特小姐的控制器(Java和ANTLR)243 第26章内嵌解释器247 26.1工作原理247 26.2使用场景247 26.3计算器(ANTLR和Java)247 第27章外加代码250 27.1工作原理250 27.2使用场景251 27.3嵌入动态代码(ANTLR、Java和JavaScript)252 27.3.1语义模型252 27.3.2语法分析器254 第28章可变分词方式258 28.1工作原理258 28.1.1字符引用259 28.1.2词法状态261 28.1.3修改标记类型262 28.1.4忽略标记类型263 28.2使用场景264 第29章嵌套的运算符表达式265 29.1工作原理265 29.1.1使用自底向上的语法分析器265 29.1.2自顶向下的语法分析器266 29.2使用场景268 第30章以换行符作为分隔符269 30.1工作原理269 30.2使用场景271 第31章外部DSL拾遗272 31.1语法缩进272 31.2模块化文法274 第四部分 内部DSL主题 第32章表达式生成器276 32.1工作原理276 32.2使用场景277 32.3具有和没有生成器的连贯日历(Java)278 32.4对于日历使用多个生成器(Java)280 第33章函数序列282 33.1工作原理282 33.2使用场景283 33.3简单的计算机配置(Java)283 第34章嵌套函数286 34.1工作原理286 34.2使用场景287 34.3简单计算机配置范例(Java)288 34.4用标记处理多个不同的参数(C#)289 34.5针对IDE支持使用子类型标记(Java)291 34.6使用对象初始化器(C#)292 34.7周期性事件(C#)293 34.7.1语义模型294 34.7.2DSL296 第35章方法级联299 35.1工作原理299 35.1.1生成器还是值300 35.1.2收尾问题301 35.1.3分层结构301 35.1.4渐进式接口302 35.2使用场景303 35.3简单的计算机配置范例(Java)303 35.4带有属性的方法级联(C#)306 35.5渐进式接口(C#)307 第36章对象范围309 36.1工作原理309 36.2使用场景310 36.3安全代码(C#)310 36.3.1 语义模型311 36.3.2DSL313 36.4使用实例求值(Ruby)315 36.5使用实例初始化器(Java)317 第37章闭包319 37.1工作原理319 37.2使用场景323 第38章嵌套闭包324 38.1工作原理324 38.2使用场景325 38.3用嵌套闭包来包装函数序列(Ruby)326 38.4简单的C#示例(C#)327 38.5使用方法级联(Ruby)328 38.6带显式闭包参数的函数序列(Ruby)330 38.7采用实例级求值(Ruby)332 第39章列表的字面构造335 39.1工作原理335 39.2使用场景335 第40章Literal Map336 40.1工作原理336 40.2使用场景336 40.3使用List和Map表达计算机的配置信息(Ruby)337 40.4演化为Greenspun式(Ruby)338 第41章动态接收342 41.1工作原理342 41.2使用场景343 41.3积分——使用方法名解析(Ruby)344 41.3.1模型345 41.3.2生成器347 41.4积分——使用方法级联(Ruby)348 41.4.1模型349 41.4.2生成器349 41.5去掉安全仪表盘控制器中的引用(JRuby)351 第42章标注357 42.1工作原理357 42.1.1定义标注358 42.1.2处理标注359 42.2使用场景360 42.3用于运行时处理的特定语法(Java)360 42.4使用类方法(Ruby)362 42.5动态代码生成(Ruby)363 第43章解析树操作365 43.1工作原理365 43.2使用场景366 43.3由C#条件生成IMAP查询(C#)367 43.3.1语义模型367 43.3.2以C#构建369 43.3.3退后一步373 第44章类符号表375 44.1 工作原理375 44.2使用场景376 44.3在静态类型中实现类符号表(Java)377 第45章文本润色383 45.1工作原理383 45.2使用场景383 45.3使用润色的折扣规则(Ruby)384 第46章为字面量提供扩展386 46.1工作原理386 46.2使用场景387 46.3食谱配料(C#)387 第五部分 其他计算模型 第47章适应性模型390 47.1工作原理390 47.1.1在适应性模型中使用命令式代码391 47.1.2工具393 47.2使用场景394 第48章决策表395 48.1工作原理395 48.2使用场景396 48.3为一个订单计算费用(C#)396 48.3.1模型397 48.3.2解析器400 第49章依赖网络403 49.1工作原理403 49.2使用场景405 49.3分析饮料(C#)405 49.3.1语义模型406 49.3.2解析器407 第50章产生式规则系统409 50.1工作原理409 50.1.1链式操作410 50.1.2矛盾推导411 50.1.3规则结构里的模式412 50.2使用场景412 50.3俱乐部会员校验(C#)412 50.3.1模型413 50.3.2解析器414 50.3.3演进DSL414 50.4适任资格的规则:扩展俱乐部成员(C#)416 50.4.1模型417 50.4.2解析器419 第51章状态机421 51.1工作原理421 51.2使用场景423 51.3安全面板控制器(Java)423 第六部分 代 码 生 成 第52章基于转换器的代码生成426 52.1工作原理426 52.2使用场景427 52.3安全面板控制器(Java生成的C)427 第53章模板化的生成器431 53.1工作原理431 53.2使用场景432 53.3生成带有嵌套条件的安全控制面板状态机(Velocity和Java生成的C)432 第54章嵌入助手438 54.1工作原理438 54.2使用场景439 54.3安全控制面板的状态(Java和ANTLR)439 54.4助手类应该生成HTML吗(Java和Velocity)442 第55章基于模型的代码生成444 55.1工作原理444 55.2使用场景445 55.3安全控制面板的状态机(C)445 55.4动态载入状态机(C)451 第56章无视模型的代码生成454 56.1工作原理454 56.2使用场景455 56.3使用嵌套条件的安全面板状态机(C)455 第57章代沟457 57.1工作原理457 57.2使用场景458 57.3根据数据结构生成类(Java和一些Ruby)459 参考文献463
【展开】
内容简介
本书是DSL领域的丰碑之作,由世界级软件开发大师和软件开发“教父”Martin Fowler历时多年写作而成,ThoughtWorks中国翻译。全面详尽地讲解了各种DSL及其构造方式,揭示了与编程语言无关的通用原则和模式,阐释了如何通过DSL有效提高开发人员的生产力以及增进与领域专家的有效沟通,能为开发人员选择和使用DSL提供有效的决策依据和指导方法。 全书共57章,分为六个部分:第一部分介绍了什么是DSL,DSL的用途,如何实现外部DS和内部DSL,如何生成代码,语言工作台的使用方法;第二部分介绍了各种DSL,分别讲述了语义模型、符号表、语境变量、构造型生成器、宏和通知的工作原理和使用场景;第三部分分别揭示分隔符指导翻译、语法指导翻译、BNF、易于正则表达式表的词法分析器、递归下降法词法分析器、解析器组合子、解析器生成器、树的构建、嵌入式语法翻译、内嵌解释器、外加代码等;第四部分介绍了表达式生成器、函数序列、嵌套函数、方法级联、对象范围、闭包、嵌套闭包、标注、解析数操作、类符号表、文本润色、字面量扩展的工作原理和使用场景;第五部分介绍了适应性模型、决策表、依赖网络、产生式规则系统、状态机等计算模型的工作原理和使用场景;第六部分介绍了基于转换器的代码生成、模板化的生成器、嵌入助手、基于模型的代码生成、无视模型的代码生成和代沟等内容。
【展开】
下载说明

1、追日是作者栎年创作的原创作品,下载链接均为网友上传的的网盘链接!

2、相识电子书提供优质免费的txt、pdf等下载链接,所有电子书均为完整版!

下载链接
热门评论
  • 王公仆射的评论
    影响力较大的趋势有三个,声明式的编程风格(包括领域特定语言、函数式编程)、动态语言(最重要的方面是元编程能力)以及多核环境下的并发编程。此外边界也变得越来越模糊因此多范式程序设计语言也是一个愈发明显的趋势。网页链接
  • 白开水and妞妞的评论
    从开发者角度看微软领域特定语言(DSL)工具 网页链接
  • Python开发者的评论
    《Pydata:基于Python的数据分析库》Pandas 是一个遵循BSD许可证的基于Python的开源库,提供高性能,易使用的数据结构与数据分析工具。pandas的优点在于可以使用Python进行整体的数据流分析,不用切换到特定的领域语言……网页链接
  • 好力诚的评论
    比较框架和模型集成式计算 模型集成式计算(MIC)是一种新兴的开发范式,它使用针对特定领域的建模语言来系统地设计软件,范围从小型的实时嵌入式系统直至大型的企业应用
  • jyun_zhang的评论
    【如何深入理解语言的各种特性?】@prettykernel:编程语言实现模式 程序设计语言――实践之路(第3版) Parsing Techniques 领域特定语言 编程语言:原理与范型(第2版) 汗牛充栋,慢慢看,多看几本你就知道,就那些东西。 你… 网页链接(分享自 @知乎)
  • 解道jdon的评论
    anycmd【推出了用以解决Query问题的领域特定语言——UQML】: daxnet推出了用以解决Query问题的领域特定语言——UQML: Unified Queries Markup Language可以简称UQML。 UQML是一个基于xml的标记语言,它由一系列predicate和几个可以将一个pred.....网页链接
  • 伯乐在线官方微博的评论
    《Gradle入门系列(3):依赖管理》Gradle是一种构建工具,它抛弃了基于XML的构建脚本,取而代之的是采用一种基于Groovy的内部领域特定语言。近期,Gradle获得了极大的关注,这也是作者决定去研究Gradle的原因。本文是Gradle教程的第三篇,主要讲述如何使......网页链接 @微风12345678 译
  • 草木易禾魚的评论
    假想微博有一项功能,首页显示被关注人的微博,但隐藏其ID,场面一定很有趣。当然,这个功能没什么用,也不会讨人喜欢,面对满屏的 “萌死了”、“美cry”、“……的节奏”、“我在哪哪哪”,大概只会分辨出极少的几个有特定领域内容或语言风格的账号。如果在微信试行,基本上就像只关注了一个人吧。
  • 我可以吞下玻璃而不伤身体的评论
    在读《领域特定语言》 “我看完了开头,却猜不到这结局 —— 完全是云里雾里的节奏。” 网页链接