特定领域语言
每当你听到某个领域的专业人士们的讨论时,比如象棋选手、幼儿园老师或者保险代理人,你就会注意到他们的词汇和日常的语言大不相同。这就是特定领域语言(DSL)的一部分:特定的领域有着特定的词汇来描述该领域的特定事物。
软件行业中,DSL指的是为某个领域特定的、包含着有限的词汇和语法的、且该领域的专业人士能读、能理解且(希望)能写的语言中的可执行的表达式。以软件开发人员和科学家为目标人群的DSL已经存在很长一段时间了。例如,Unix配置文件中的“袖珍语言”和通过LISP宏创建的语言是一些比较老的例子。
DSL一般分为内部和外部两种:
内部DSL使用通用编程语言编写,语法进行了修改,看起来更像是自然语言。这对有提供更多的语法糖衣和格式化方法的语言(如Ruby和Scala)更容易一些,相对那些没有的(如Java)。大多数内部DSL包括了已有的API、库或者商业代码,并提供一个封装来更轻松地访问这些功能。只要运行它们就可以执行了。根据实现和领域,它们被用来构建数据结构、定义依赖性、执行过程或任务、与其它系统通信或者验证用户输入。内部DSL的语法受到宿主语言的约束。有很多模式,比如表达式构造器、方法链接和注释,可以帮助你将宿主语言修改成你的DSL。如果宿主语言不需要重新编译,内部DSL则可以和一个领域的专家一起快速开发。
外部DSL是语言的文字的或图形的表达式,尽管文字的DSL比图形的常见。文本表达式可以被一组工具链处理,包括语法分析器、解析器、模块转换器、生成器以及任何其它种类的后期处理。外部DSL通常会被读入构建用于进一步处理的基础内容的内部模块。它对于定义语法很帮助(如EBNF中)。语言提供工具链的生成部件(如编辑器,可视化工具、解析器和生成器)的初始位置。对于简单的DSL,一个手工制作的分析器可能就足够了,比如使用正则表达式。如果需求太多,自定义的分析器可能就变得笨重而不实用了,所以应该试试特定设计的语言语法和DSL——比如 openArchitectureWare,NTlr,SableCC,AndroMDA。将外部DSL定义为XML语言比较常见,尽管可读性经常是个问题,特别是对于非技术类的读者。
你一定要时时考虑你的DSL的目标用户。他们是开发人员、管理人员、商业客户或是终端用户?你必须修改语言的技术水平、可获得的工具、语法帮助(如智能提示)、技术水平、早期验证、可视化、表现以适应目标用户。通过隐藏技术细节,DSL可以给让用户修改系统以适应他们的需求,而无需寻求开发者的帮助。它可以加快开发速度,因为在最初的语言架构之后,工作中潜在的分布就出现了。语言可以渐渐进化;现有的表达式和语法也有很多可行的移植方法。