什么是域专用语言?有人用吗?以什么方式?

时间:2009-04-30 23:28:35

标签: dsl

我想我正在寻找某种介绍并查看是否有人使用过它。使用它有什么特别的好处吗?

百科:

  

domain-specific language (DSL)是一种编程语言或规范语言,专用于特定问题域,特定问题表示技术和/或特定解决方案技术。

任何人都可以提供有关如何实施它或在特定情况下它如何有用的具体示例吗?

15 个答案:

答案 0 :(得分:100)

特定于域的语言是为处理特定域或关注点而编写的语言。其中有很多,比如make,ant和rake用于描述软件构建,或lexx和yacc用于语言构建。近年来,它们变得流行,因为有些东西结合起来使它们更容易构建。其中最重要的是Ruby的日益普及,它具有一些可以轻松构建新DSL的功能。

Martin Fowler是这个想法的主要支持者,here

答案 1 :(得分:52)

您可以将DSL视为用更通用的编程语言编写的函数的过于复杂的参数。真正的编程语言解析DSL代码并对其执行某些操作,通常,DSL代码仅关注您想要执行的 ,而较大的系统会计算如何

DSL的例子包括所有查询语言(SQL,XPath,...),所有模板语言(Django,Smarty,...),shell脚本,特别是包括像twill,命令驱动的Web浏览器(主要使用的)用于自动化测试),数据存储和交换语言(XML,YAML,...)以及LaTex,HTML或CSS等文档语言。

一些语言非常灵活的语言(如TCL和Lisp)将其DSL直接构建到语言中......如果可能的话。大多数语言都使用字符串,通常是从外部文件加载的。

使用它们有什么特别的好处吗?将它们用于预期目的是非常有利的,你将不知不觉地转向它们,就像你一直在使用(我推测)SQL或HTML而不将它们视为DSL。

我敢说有足够的DSL用于你可能需要的任何应用程序;你几乎肯定不需要学习如何编写自己的。

答案 2 :(得分:12)

(解决问题的关键)

我认为我第一次在某处看到DSL并将其定义为“特定领域语言”我还认为这是一种特殊的,具体的语言我还没有听说过 - 但是,不,它是针对特定应用领域定制的语言的通用术语。

具有讽刺意味的是,如果您刚刚听说过TCL作为“工具命令语言”,您可能会认为,就像DSL一样,各种工具都会有很多TCL - 但是,不,它的具体名称一种特定的脚本语言。

答案 3 :(得分:9)

我认为这是一种适合解决特定领域问题的语言。它可以是一些规则处理语言或服务描述语言。

与域特定语言(DSL)相反的是通用语言

答案 4 :(得分:8)

DSL是开发非程序员使用的语言的好方法。例如,如果您为公司的财务人员安装了DSL,那么您可以让他们编写他们想要完成的程序,而不是编程到他们的规范。然后,如果它太慢,那么你可以把他们写的东西按照他们想要的方式工作,用编译语言写它来加速它。

答案 5 :(得分:8)

一切都是DSL ......

汇编程序:MOV R1到R2
编译器:分配语句 - A = A + 1,条件 - IF(TRUE)...,分支 - 返回
HTML:...描述嵌套结构
TCP / IP:向/从地址描述
PDF:描述纸张上的文字/图像放置
字体:描述字符

我们用于描述特定流程的任何语言都是DSL。遗憾的是,即使是我们最基本的流程,也缺乏特定领域的语言,所以我们使用少数几种语言来描述我们所做的一切。 "在我的网站上压缩所有html文件"需要300行3或4种不同语言才能完成。

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

我会远离使用可能方便但不适合问题的其他解决方案,例如用于定义数据(XML)的HTML。 CSV非常有用,适合大多数问题。 JSON不适合易用性部分,对于大多数问题,CSV工作增加了不必要的复杂性是过度的。我们大量使用EXCEL用于DSL,它非常适合描述小问题,在65K到1M行之下,例如树结构或菜单,列A是级别,其他列是图标,颜色,标签等(EXCEL是一个可编辑的CSV)。

我发现HTML并没有真正解决页面布局的问题,所以我摆脱了它并定义了一个适合的DSL。我在页面上定义了6个区域,HEADER,BODY,FOOTER,LEFT / RIGHT MARGINS和LEFT / RIGHT FULL MARGINS。然后,我可以告诉页面生成器向特定单元格添加TITLE BAR,STATUS BAR,MENUS,TABLE,FORMS等。然后可以将这些单元格中的每一个拆分为行和列到任何深度。任何样式的页面布局都需要几秒钟。

BODY包含我的员工表 HEADER包含标题栏标题' Hello World'登录Collins Software

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

资源我的主菜单
*定义:菜单,男,水平,标签,图标,行动;
米,0,文件;
m,1,open,open.gif,对话框打开文件;

每个问题都是独一无二的,计算机可以使用任何格式,它是DSL设计的人类,所以让它可以被人类理解,他们可以输入的东西,并用真正的单词制作语言;因为它是我们正在描述的真实的人,地方和事物。

答案 6 :(得分:4)

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

由于通用语言用于大量目的,DSL仅针对特定域。像HTML或CSS。

你可以说,如果你写了一篇论文,只有一些人或你唯一最好的朋友才能理解,而其他人也无法理解。然后它可能是DSL。但是,如果你用许多人可以理解并且可以遵循的术语编写指令那么这不是DSL。

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

答案 7 :(得分:3)

我刚刚听过DSL,但发现了一个非常有用的例子:LUNA(前lunascript)。

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

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

  • SAP with AbAp
  • PeopleCoft with PeopleCode
  • Apple with Objective-C
  • Facebook有类似FBML和FQL的东西

这些是特定于域的,因为您几乎专门用于在这些平台上工作。

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

答案 8 :(得分:3)

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

I Wish We Used Domain Specific Languages (DSLs) More

在其中,我将DSL定义为:

  

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

就使用而言,如果您曾经使用过Ant,结构化查询语言(SQL)或层叠样式表(CSS),那么您已经使用过DSL。

我喜欢使用DSL,因为他们专注于促进特定问题空间的解决方案的沟通,并且他们这样做是为了促进领域专家的加入。

答案 9 :(得分:3)

域特定语言(DSL)的一个简单示例是HTML,它用于称为基于Web的应用程序的特定域。

答案 10 :(得分: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项目内部出现类似的情况。但是,尽管如此,我在the proposal page yet上还没有看到任何建议。

答案 11 :(得分:1)

特定于域的语言以直接使用特定领域中的概念和逻辑的语言表达您的域流程和知识。

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

大多数情况下,DSL都是为了提高公司内部的生产力,因此他们将其保密,不分享他们的结果/见解。

这是一个会议,演讲者使用JetBrains MPS提供DSL的一些示例,使用投影编辑技术:https://vimeo.com/197381453

答案 12 :(得分:0)

DSL-DomainSpecificLanguage

  

DSL是一种针对特定类型问题的计算机语言,而不是针对任何一种软件问题的通用语言。

其中: 配置(TravisCI .yaml),构建脚本(gradle),目标的依存关系(pod),UI编程(Anko)等。

DSL是声明性编程-用做什么代替如何

外部DSL 有其自己的自定义语法,您可以编写完整的解析器来处理它们(例如XML,RegExp,SQL,HTML,CSS,UML)。

内部DSL 是使用宿主语言使宿主语言具有特定语言(例如Lisp,Ruby,Java注释,宏)的特定方式。

了解更多herehere

答案 13 :(得分:0)

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编写的,其中的域是某些应用程序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的次数太多了。

答案 14 :(得分:0)

nextflow(https://github.com/nextflow-io/nextflow )是groovy编写的一种DSL语言;

nextflow的主要目的是编写用于分析的管道,并轻松地从笔记本电脑迁移到HPC并迁移到云,并使用conda,docker,奇点重复环境。