领域特定语言

什么是领域特定语言(DSL)?

域特定语言是一种针对特定问题类别进行了优化的,具有更高抽象级别的编程语言。DSL使用来自现场或域的概念和规则。

领域特定语言与“真实”编程语言有何不同?

领域特定语言通常不如Java,C或Ruby等通用语言复杂。通常,DSL是与要为其设计DSL的领域的专家紧密合作开发的。在许多情况下,DSL并非由软件人员使用,而是由精通DSL地址域的非程序员使用。

特定领域语言的好处是什么?我为什么要在乎?

使用DSL可以带来很多好处。使用DSL的最明显的好处是,一旦有了语言和转换引擎,您在DSL涵盖的软件开发的特定方面的工作就会变得更加高效 ,这仅仅是因为您不必做手动工作。如果从DSL程序生成源代码(而不是对其进行解释),则可以使用特定于域的精美抽象, 而无需支付任何运行时开销 ,因为生成器就像编译器一样,可以删除抽象并生成有效的代码。

如果您可以用一种与领域紧密结合的语言来表达领域关注点,那么您的思路就会变得更加清晰,因为您编写的代码不会因实现细节而混乱。换句话说,使用DSL可使您将本质与偶然的复杂性分开。

DSL的域,抽象和符号与域专家(即,非程序员)表达自己的方式紧密一致,从而使技术人员和域人员之间能够很好地集成

使用DSL和执行引擎可以使以DSL代码表示的应用程序逻辑独立于目标平台 。使用DSL可以提高所创建产品的质量 :减少错误,更好的体系结构一致性,增强的可维护性。这是由于消除了(不必要的)自由度,避免了代码重复以及自动化重复工作的结果。

领域特定语言和常规代码如何结合在一起?

传统代码和DSL代码如何集成有两种根本不同的方法。第一个将DSL代码和常规代码保存在单独的文件中。然后,通过自动代码生成器将DSL代码转换为编程语言代码,或者,程序加载特定于域的代码并执行该代码。具有分离的通用语言(GPL)和DSL代码的第一种方法称为外部DSL。将SQL视为外部DSL的示例。

另一种方法是将DSL代码和通用代码混合在同一程序文件中,从而使它们之间的集成更为紧密。DSL重用了GPL的语法和解析器,并利用了主机语言的可用扩展选项。术语内部DSL用于描述这种情况。

值得一提的是,某些GPL比其他GPL更适合扩展。

两种方法都可能有意义,具体取决于环境,MPS支持这两种方法。

DSL的结构和语法是通过使用将要嵌入DSL代码的语言编写代码来定义的。通常,IDE不了解DSL,因此不提供支持(代码完成,自定义错误检查等)。但是,通过MPS,您可以将MPS框架及其专用DSL一起用于语言开发,以定义语言扩展。因此,IDE知道它们,因此系统可以为特定于域的嵌入式语言提供完整的IDE支持。

什么是面向语言的编程?

术语“ 面向语言的编程”是JetBrains的首席执行官兼MPS的“父亲” 谢尔盖·德米特里耶夫Sergey Dmitriev)在其2004年的文章《 面向语言的编程:下一个编程范式》中提出的 。其他人想出了一些相关的方法,通常使用不同的名称。主要的例子是Charles Simonyi及其有意编程方法,Martin Fowler在其2005年的文章《 语言工作平台:领域特定语言的杀手级应用?

核心思想是,我们在开发软件时不仅使用一种语言,还使用最适合每个任务的那些语言。与表面上提倡类似方法的多语言编程相反, 面向语言的编程明确鼓励开发人员构建自己的DSL或使用领域特定的概念扩展现有语言,以此作为方法的一部分。为了使之可行,诸如MPS之类的语言工作台是面向语言方法的重要组成部分。

使用MPS,您可以为任何新语言定义一个自定义编辑器,以使使用DSL更简单。即使是不熟悉传统编程的领域专家,也可以轻松地在MPS中工作,他们可以使用根据自己的特定领域术语设计的特定领域语言。

在下面的视频中,您可以看到有关如何使用MPS进行交互式语音响应(IVR)的示例。该DSL面向非技术人员,因此用户体验适用于他们。