领域特定语言 (DSL) 是一种旨在用于特定领域上下文的语言。领域可以是业务上下文(例如,银行、保险等)或应用程序上下文(例如,Web 应用程序、数据库等)。相比之下,通用语言 (GPL) 可用于广泛的业务问题和应用程序。
DSL 并不试图满足所有人。相反,它是为有限的适用范围和用途而创建的,但它足够强大,可以表示和解决该范围内的难题和解决方案。HTML 是 DSL 的一个很好的例子。它是一种用于 Web 应用程序领域的语言。它不能用于,例如,数值计算,但很明显 HTML 在 Web 上的应用有多么广泛。
GPL 的创建者不知道该语言可能在何处使用,也不知道用户打算用它解决什么问题。因此,GPL 是用通用结构创建的,这些结构可能适用于任何问题、解决方案、业务或需求。Java 是一种 GPL,因为它用于台式机和移动设备,嵌入在银行、金融、保险、制造等领域的 Web 中,等等。
DSL 分类
在 DSL 世界中,有两种类型的语言
- 领域特定语言 (DSL): 编写或呈现 DSL 的语言
- 宿主语言: 执行或处理 DSL 的语言
用不同的语言编写并由另一个宿主语言处理的 DSL 称为外部 DSL。
这是一个 SQL 中的 DSL,可以在宿主语言中处理
SELECT account
FROM accounts
WHERE account = '123' AND branch = 'abc' AND amount >= 1000
就此而言,DSL 可以用英语编写,具有定义的词汇和形式,可以使用 ANTLR 等解析器生成器在另一个宿主语言中处理
if smokes then increase premium by 10%
如果 DSL 和宿主语言相同,则 DSL 类型为内部,其中 DSL 是用该语言的语义编写并由其处理的。这些也称为嵌入式 DSL。以下是两个示例。
- 可以在 Bash 引擎中执行的 Bash DSL
if today_is_christmas; then apply_christmas_discount; fi
这是有效的 Bash,用类似英语的方式编写。
- 用像 Java 这样的 GPL 编写的 DSL
orderValue = orderValue .applyFestivalDiscount() .applyCustomerLoyalityDiscount() .applyCustomerAgeDiscount();
这使用流畅的风格,并且像英语一样可读。
是的,DSL 和 GPL 之间的界限有时会变得模糊。
DSL 示例
用于 DSL 的一些语言包括
- Web:HTML
- Shell:sh、Bash、CSH 以及 *nix 的类似工具;MS-DOS、Windows 终端、Windows PowerShell
- 标记语言:XML
- 建模:UML
- 数据管理:SQL 及其变体
- 业务规则:Drools
- 硬件:Verilog、VHD
- 构建工具:Maven、Gradle
- 数值计算和模拟:MATLAB(商业)、GNU Octave、Scilab
- 各种类型的解析器和生成器:Lex、YACC、GNU Bison、ANTLR
为什么选择 DSL?
DSL 的目的是捕获或记录一个领域的需求和行为。DSL 的用途甚至可能更狭窄,用于领域内的特定方面(例如,金融领域的商品交易)。DSL 将业务和技术团队聚集在一起。这并不意味着 DSL 仅供商业用途。例如,设计人员和开发人员可以使用 DSL 来表示或设计应用程序。
DSL 也可用于为已解决的领域或问题生成源代码。但是,从 DSL 生成代码不被认为是强制性的,因为其主要目的是领域知识。但是,当使用它时,代码生成是领域工程中的一个重要优势。
DSL 的优点和缺点
从好的方面来看,DSL 在捕获领域的属性方面非常强大。此外,由于 DSL 很小,因此易于学习和使用。最后,DSL 为领域专家以及领域专家和开发人员之间提供了一种语言。
不利的一面是,DSL 仅在预期的领域和用途内狭隘地使用。此外,DSL 还有一个学习曲线,尽管它可能不是很高。此外,尽管使用工具捕获 DSL 可能有优势,但它们不是必需的,并且开发或配置此类工具需要付出额外的努力。最后,DSL 创建者需要领域知识以及语言开发知识,而个人很少同时拥有两者。
DSL 软件选项
开源 DSL 软件选项包括
- Xtext: Xtext 支持 DSL 的开发,并与 Eclipse 集成。它使代码生成成为可能,并已被多个开源和商业产品用于提供特定功能。MADS(多用途农业数据系统)是一个基于 Xtext 的有趣想法,用于“农业活动的建模和分析”(但是,该项目似乎不再活跃)。
- JetBrains MPS: JetBrains MPS 是一个用于创建 DSL 的集成开发环境 (IDE)。它称自己为投影编辑器,它将文档存储为其底层抽象树结构。(Microsoft Word 等程序也使用了这个概念。)JetBrains MPS 还支持代码生成到 Java、C、JavaScript 或 XML。
DSL 最佳实践
想使用 DSL 吗?以下是一些技巧
- DSL 不是 GPL。尝试解决明确领域中有限范围的问题。
- 您不需要定义自己的 DSL。那将是乏味的。在 DSLFIN 等网站上查找可以满足您需求的现有 DSL,该网站列出了金融领域的 DSL。如果您找不到合适的 DSL,您可以定义自己的 DSL。
- 最好使 DSL “像英语一样”,而不是过于技术性。
- 从 DSL 生成代码不是强制性的,但当完成时,它可以提供显着且高效的优势。
- DSL 被称为语言,但与 GPL 不同,它们不必是可执行的。可执行不是 DSL 的目的。
- DSL 可以用文字处理器编写。但是,使用 DSL 编辑器可以更轻松地进行语法和语义检查。
如果您现在正在使用 DSL 或计划将来使用,请在评论中分享您的经验。
评论已关闭。