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

StackOverflow https://stackoverflow.com/questions/809574

  •  03-07-2019
  •  | 
  •  

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

维基百科:

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

任何人都可以提供任何具体示例来说明您如何实现它或者它如何在给定场景中发挥作用吗?

有帮助吗?

解决方案

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

Martin Fowler是这个想法的主要支持者,如此处

其他提示

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

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

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

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

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

(解决问题的关键)

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

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

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

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

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

一切都是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包含Title Bar标题'Hello World',登录Collins Software

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

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

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

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

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

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

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

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

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

在其中,我将DSL定义为:

  

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

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

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

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

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

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

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

  • SAP 与 AbAp
  • PeopleSoft 与 PeopleCode
  • Apple 与 Objective-C
  • Facebook 有 FBML 和 FQL 之类的东西

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

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

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

基于来自R的公式DSL: https://stat.ethz.ch/ R-手动/ R-devel的/库/统计/ HTML / formula.html

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项目中看到类似的东西。但是,我还没有在提案页面上看到任何提案虽然。

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

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

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

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

DSL - DomainSpecificLanguage

  

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

其中: 配置(TravisCI .yaml),构建脚本( gradle ),目标的依赖关系(< a href =“https://guides.cocoapods.org/syntax/podspec.html”rel =“nofollow noreferrer”> pod ),UI编程( Anko )等。

DSL是一种声明式编程 - 要做什么 如何

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

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

了解更多此处这里

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top