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

问题描述 投票:91回答:13

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

维基百科:

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

任何人都可以提供有关如何实现它或在特定场景中它如何有用的具体示例吗?

dsl
13个回答
103
投票

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

作为here,马丁福勒是这个想法的重要支持者。


3
投票

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

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

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

  • SAP与AbAp
  • PeopleSoft与PeopleCode
  • 带有Objective-C的Apple
  • Facebook有像FBML和FQL这样的东西

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

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


2
投票

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

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

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

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

一旦深度学习领域有所稳定(甚至现在),我很乐意在Apache MXnet项目中看到类似的东西。但是,我没有看到有关the proposal page yet的任何建议。


1
投票

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

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

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

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


0
投票

DSL - DomainSpecificLanguage

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

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

DSL是一种声明式编程 - 该怎么做而不是怎么做

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

内部DSL是使用宿主语言为主机语言提供特定语言感觉的特殊方式(例如,Lisp,Ruby,Java注释,宏)。

阅读更多herehere


55
投票

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

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

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

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

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


12
投票

(解决问题的关键)

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

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


9
投票

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

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


9
投票

一切都是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,Dialog Open File;

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


8
投票

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


4
投票

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

I Wish We Used Domain Specific Languages (DSLs) More

在其中,我将DSL定义为:

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

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

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


4
投票

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

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

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

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


3
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.