什么是领域特定语言?有人用吗?又以什么方式?


107

我想我正在寻找某种介绍,看看是否有人使用过它。使用它有什么特别的优点吗?

维基百科:

特定领域语言(DSL)是专用于特定问题域,特定问题表示技术和/或特定解决方案技术的编程语言或规范语言。

谁能提供任何具体示例来说明您如何实现它或在给定场景中它如何有用?


实际上,特定领域的语言是一个在编程中定义明确的术语-请查看Wikipedia文章
1800信息

如下所述,DSL不是一种语言,而是一类特殊用途语言的名称。
dmckee ---前主持人小猫

那么我可以说R是DSL吗?
斯里卡·多迪(Srikar Doddi)

2
在它的边缘,但我不会。R具有所有通用结构,并且用于各种计算;数值计算和统计数据不是一个非常狭窄的领域。不过,这是对定义的很好的检验。
查理·马丁

Answers:


114

领域特定语言是为处理特定领域或关注点而编写的语言。周围有很多它们,例如用于描述软件构建的make,ant和rake,或者用于语言构建的lexx和yacc。近年来,由于某些方面的结合使它们更易于构建,它们已变得越来越流行。其中最重要的是Ruby的日益普及,它具有多项功能,可以轻松构建新的DSL。

就像这里一样,马丁·福勒(Martin Fowler)就是这个主意。


3
Ruby有哪些功能使创建新DSL更容易?
Lernkurve

2
@Lernkurve-Ruby进行了元编程,这很有帮助。rubylearning.com/blog/2010/11/23/…–
詹姆斯·布莱克

@CharlieMartin能否让我知道有关“ groovy”的信息?到底是哪种语言?我想知道,请帮助这里..
摹dangi

2
Groovy是一种在JVM中运行的脚本语言。基本上,它旨在成为Ruby的Java答案。这是一种通用语言,但可以用来编写DSL。docs.groovy-lang.org/docs/latest/html/documentation/…–
查理·马丁

1
我要添加Gradle的常规功能。如果没有记错的话,他们会用自己的语言来描述构建。
霓虹灯Warge

67

您可以将DSL视为使用更通用的编程语言编写的函数的过于复杂的参数。真正的编程语言解析DSL代码,并做一些事情吧,通常情况下,DSL代码只专注于什么,你想做的事,和更大的系统的数字了如何

DSL的示例包括所有查询语言(SQL,XPath等),所有模板语言(Django,Smarty等),shell脚本,尤其包括诸如twill之类的东西,一个命令驱动的Web浏览器(主要用于自动化测试) ),数据存储和交换语言(XML,YAML等)以及文档语言(例如LaTex,HTML或CSS)。

可能的话,某些具有非常灵活的语法的语言(例如TCL和Lisp)会将DSL直接构建到该语言中。大多数语言使用字符串,通常是从外部文件加载的。

使用它们有什么特别的优点吗?将它们用于它们的预期目的非常有利,这将使您在不知道它们的情况下转向它们,就像您一直在使用(我假设)SQL或HTML而不将它们视为DSL一样。

我敢说那里有足够的DSL来满足您可能需要的任何类型的应用程序。您几乎肯定不需要学习如何编写自己的书。


1
有趣的是,您未列出的示例是我想到的第一个示例:regex
CoffeeTableEspresso

12

(解决问题的症结)

我认为我是第一次看到DSL,并将其定义为“特定于域的语言”,我还认为这是一种我从未听说过的特定而具体的语言,但是,不,它是一种通用语言,针对特定应用领域量身定制。

具有讽刺意味的是,如果您刚刚听说过TCL是一种“工具命令语言”,那么您可能会想像DSL一样,会有很多TCL用于各种工具,但是,不是,它是特定脚本语言的特定名称。



10

一切都是DSL ...

汇编器:MOV R1至R2
编译器:赋值语句-A = A + 1,条件语句-IF(TRUE)...,分支-RETURN
HTML:...描述嵌套结构
TCP / IP:描述往返解决
PDF:描述纸上文本/图像的位置
字体:描述字符

我们用来描述特定过程的任何语言都是DSL。不幸的是,甚至没有描述特定领域的语言来描述我们最基本的过程,因此我们使用必须使用的几种语言来描述我们所做的一切。“压缩我网站上的所有html文件”需要300行3或4种不同语言的语言来完成。

要构建DSL,请确定描述一个您可以记住且不需要文档的过程所需的最少字符数。请记住,速度和易用性是主要的设计标准。解析速度如此之快,以至于您使用的任何语法都很好,在大多数情况下,我更喜欢自然语言作为我的语法,“每月第一天付钱给雇员”,但是特定于域的只是特定于域的,您可以确定最适合的语法适合这个问题。

我不会使用其他可能方便但不适合该问题的解决方案,例如用于定义数据(XML)的HTML。CSV非常有用,可以解决大多数问题。JSON不适合易用性部分,如果CSV可以解决大多数问题,那会增加不必要的复杂性,这是过头了。我们在DSL上经常使用EXCEL,它非常适合描述65K至1M行以下的小问题,例如树状结构或菜单,A列是级别,其他列是图标,颜色,标签等(EXCEL是可修改的CSV)。

我发现HTML并不能真正解决页面布局的问题,因此我摆脱了它,并定义了适合的DSL。我在页面上定义了6个区域,分别为HEADER,BODY,FOOTER,LEFT / RIGHT MARGINS和LEFT / RIGHT FULL MARGINS。然后,我可以告诉页面生成器向特定单元格添加标题栏,状态栏,菜单,表格,表格...。然后可以将这些单元格中的每个单元划分为任意深度的行和列。任何样式的页面布局都需要几秒钟。

身体包含我的员工表
HEADER包含标题栏标题“ Hello World”,并登录到Collins Software

菜单DSL不适合页面布局DSL,因此我为菜单构建了唯一的DSL。

资源我的主菜单
*定义:菜单,米,级别,标签,图标,操作;
m,0,文件;
m,1,open,open.gif,对话框打开文件;

每个问题都是独特的,计算机可以使用任何格式,DSL是为人类而设计的,因此使人类可以理解它,他们可以键入某些内容,并用真实的文字使语言成为现实。因为它是我们所描述的真实的人,地方和事物。


8

DSL是开发供非程序员使用的语言的好方法。例如,如果您为公司的财务人员提供了DSL,则可以让他们编写他们想要完成的程序,而不是按照他们的规范进行编程。然后,如果速度太慢,那么您可以按照他们的意愿接受他们编写的内容,然后以编译语言编写它以加快速度。


5

好!上面有很多解释。我将尝试以更简单的方式来解释这一点,因为像我这样的人会理解。

由于通用语言用于广泛用途,因此DSL仅用于特定领域。像HTML或CSS。

您可以说,如果您在纸上写了说明,只有某些人或您唯一的朋友可以理解,而其他人则不能。然后可能是DSL。但是,如果您以许多人可以理解并且可以遵循的术语来编写说明,则说明这不是DSL。

我曾经为用户创建了一个开关板,该开关板可以通过计算机的串行端口进行操作,并且用户希望可以在该板上执行该板的程序,并且继电器开关将相应地打开和关闭。因此,我写了一些说明,并告诉用户根据这些说明对该板进行编程。这是DSL的一个例子。我没有发明新的语言,而是创建了一堆字符串,微控制器可以从EEPROM读取这些字符串,并且可以据此进行解析并可以执行特定任务。


4

我写了一篇简短的博客文章,讨论了我为什么喜欢使用DSL:

我希望我们使用域特定语言(DSL)更多

在其中,我将DSL定义为:

一种小型编程语言,专门用于传达特定问题领域的解决方案。

在使用方面,如果您曾经使用过Ant,结构化查询语言(SQL)或级联样式表(CSS),那么您已经使用过DSL。

我喜欢使用DSL,因为它们专注于促进解决方案与特定问题空间的通信,并且这样做的方式可以促进域专家的参与。



3

我最近刚刚听说过DSL,但是找到了一个非常有用的示例:LUNA(以前的脚本)。

这是Asana团队针对自己的平台制作的定制编程语言/框架。

正如我进一步发现的那样,许多公司创建自己的框架和语言以创造适当的竞争优势,例如:

  • 具有AbAp的SAP
  • PeopleSoft与PeopleCode
  • 苹果与Objective-C
  • Facebook拥有FBML和FQL之类的东西

这些是特定于域的,因为您几乎只能在这些平台上使用它们。

我希望这个答案可以帮助您澄清这个概念。


3
Objective-C不是特定领域的语言
boraseoksoon

它也不是(不是为)Apple制造的。
亚历山大·罗萨

2

机器学习中使用的DSL的示例是python中的patsy: https //patsy.readthedocs.io/en/latest/formulas.html#

它基于R中的DSL公式:https//stat.ethz.ch/R-manual/R-devel/library/stats/html/formula.html

https://cran.r-project.org/web/packages/Formula/vignettes/Formula.pdf

Hadley在他的高级R书中有一个不错的部分,描述了如何构建带w / R的DSL: http //adv-r.had.co.nz/dsl.html

一旦深度学习领域(或什至现在)稳定了一点,我很乐意看到Apache MXnet项目内部出现类似的情况。但是,我还没有在提案页面上看到针对此的任何提案。


1

特定领域的语言使用直接使用您特定领域的概念和逻辑的语言来表达您的领域过程和知识。

社区肯定在增长,但仍未达到其他“主流”技术的水平。

大多数时候,DSL都是为了提高公司内部的生产率而设计的,因此他们将其保密,并且不共享结果/见解。

这是一个会议,发言人在会议上使用JetBrains MPS和Projectional编辑技术给出了DSL的一些示例:https : //vimeo.com/197381453


1

DSL-特定于域的语言。让我们开始定义域-域是一些定义的区域,范围。该域可以是网站外观,您可以使用CSS,第二个域可以是网站结构,此处您可以使用HTML。

但是,域也可以是X公司的应用程序。在此领域的范围内,可以创建一些语言。语言并不意味着-具有自己的语法,语法,编译器或运行时的功能丰富的东西。DSL只是解决域问题的工具列表。

让我们考虑OOP及其模型,以类和方法将领域对象表示为对象行为。如果我们创建这样的结构并赋予这些对象行为,则可以使用这些概念编写代码。考虑以下伪代码示例:

cookie = async getCookie(cookieId)
user = async getUser(userId)
result async user.buy(cookie)
if (result.isError()) {
  error.showAlert("User has not enough money")
} else {
  confirmation.showSuccess("Cookie was bought")
}

GPL(通用语言)从上方是多少,特定领域术语和工具是多少。这是两者的混合,但是所有命令在这里都是特定于域的。也就是说,可以说上面的内容是用DSL编写的,其中DSL是某个应用程序x。

继续这个示例,我可以创建更多的抽象工具,并主要使用那些工具执行控制流,请考虑一下(这是更多的FP,但希望您能理解我的意思):

waitForMany(getCookie(cookieId), getUser(userId)
  .andThen([cookie, user] -> user.buy(cookie))
  .andThen(showSuccess("Cookie was bought"))
  .whenError(showError("User has not enough money"))

如您所见,我能够抽象很多,并使用这种抽象来执行控制流程。一切都基于GPL,并且在GPL范围内有效。

为了揭示事实,我们都编写了DSL,您可以使用的每个域特定的抽象都是这样的。但是,这些抽象中的大多数都不是完整的解决方案,这就是为什么我们希望不要过于频繁地使用该词。但是,如果您拥有一组可以抽象化您的域的工具和功能,它们就可以形成DSL。

DSL也是很多东西,例如提供规则集的任何框架都是DSL。如果您看到有人声称他是React开发人员,那么您就知道他是域特定开发人员,因为React正是DSL,可以替代使用本机Web平台。如果可以从现有的特定于域的工具中组合功能,那么您正在使用DSL进行编写。更深入地了解React,对不起所有使用此DSL:D的人们,您可以创建一组组件,并将它们组合为构建块,然后是hurra !,现在您可以在DSL之上构建DSL。

是的,在这里重复DSL太多次了,对不起。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.