开发者需要了解的领域特定语言

DSL 用于特定领域的特定上下文。了解更多关于它们是什么以及为什么您可能想要使用它们。
127 位读者喜欢这篇文章。
Various programming languages in use

领域特定语言 (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 或计划将来使用,请在评论中分享您的经验。

接下来阅读什么
标签
User profile image.
Girish 在印度一家全球 IT 服务组织拥有超过 20 年的技术和软件经验。 Girish 是“I Got”云平台的架构师,该平台旨在提升金字塔底层,采用开源堆栈和现代架构模式,如微服务、容器化和多租户。 Girish 撰写关于开源和技术主题的文章。

评论已关闭。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© . All rights reserved.