什么是域特定的语言? 任何人使用它? 以什么方式?

我想我正在寻找一些介绍,看看有没有人使用过它。 使用它有什么特别的优势吗?

维基百科:

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

任何人都可以给出具体的例子,说明你是如何实现它的,或者它是如何在特定场景中有用的?

域专用语言是为处理特定域或关注点而编写的语言。 他们中有很多人,比如用于描述软件构build的make,ant和rake,或者用于语言构build的lexx和yacc。 近些年来,随着一些事物的结合,它们变得stream行起来,使它们更易于build造。 其中最重要的是Ruby的日益stream行,它具有几个特性,可以很容易地构build新的DSL。

马丁·福勒(Martin Fowler)就是这个想法的主要支持者。

你可以把DSL看作用更通用的编程语言编写的函数的过于复杂的参数。 真正的编程语言parsingDSL代码并做一些事情,通常,DSL代码只关注你想做的事情,而更大的系统则会指出如何做

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

一些语言非常灵活的语言,如TCL和Lisp,在可能的情况下直接将DSL语言构build成语言。 大多数语言使用string,通常从外部文件加载。

使用它们有什么特别的好处吗? 使用它们达到预期的目的对于你不需要知道的点来说是非常有利的,正如你所使用的(我认为)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。 不幸的是,缺乏领域专用语言来描述甚至是我们最基本的过程,所以我们使用less数语言来描述我们所做的一切。 “在我的网站上压缩所有html文件”需要300行3或4种不同的语言才能完成。

构build一个DSL可以确定描述一个你可以记住并且不需要文档的过程所需要的最less字符数。 请记住,速度和易用性是主要的devise标准。 parsing速度如此之快以至于您使用的任何语法都很好,在大多数情况下,我更喜欢自然语言作为“在每个月的第一个月支付员工”,但是具体领域就是这样,具体而言,您确定最好的语法适合这个问题。

我将远离使用其他可能方便的解决scheme,但不适合用于定义数据(XML)的HTML等问题。 CSV非常有用,它适合大多数问题。 JSON不适合易用性的部分,这是矫枉过正,增加了不必要的复杂性,CSV是为大多数问题的作品。 我们大量使用EXCEL来处理DSL,对于描述65K到1M行(如树结构或菜单)中的小问题,列A是关卡,其他列是图标,颜色,标签等等(EXCEL是可编辑的CSV)。

我发现HTML并没有真正解决页面布局的问题,所以我摆脱了它,并定义了一个合适的DSL。 我在页面上定义了6个区域,标题,身体,踏板,左/右边缘以及左/右全angular边缘。 然后,我可以告诉页面生成器将TITLE BAR,STATUS BAR,MENUS,TABLE,FORMS …添加到特定单元格。 然后可以将这些单元格中的每一个都分割成行和列,以达到任何深度。 页面布局需要几秒钟的任何风格。

BODY包含我的员工表
HEADER包含一个标题栏标题“Hello World”,login到Collins软件

菜单DSL不适合页面布局DSL,所以我build立了一个独特的DSL菜单。

资源我的主菜单
*定义:菜单,男,水平,标签,图标,动作;
米,0,文件;
m,1,open,open.gif,Dialog Open File;

每个问题都是独一无二的,计算机可以使用任何格式,DSLs是为人类devise的,所以人类可以理解,他们可以input的东西,使语言脱离真实的语言; 因为它是真实的人,地方和我们所描述的东西。

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

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

其中,我将DSL定义为:

一种小型编程语言,专门用于为特定领域的问题交stream解决scheme。

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

我喜欢使用DSL,因为他们专注于促进向特定问题空间的解决scheme的交stream,并且这样做是为了促进域专家的包容。

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

我刚刚听到DSL,但find一个非常有用的例子:LUNA(前lunascript)。

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

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

  • SAP与AbAp
  • PeopleSode的PeopleSoft
  • 苹果与Objective-C
  • Facebook有像FBML和FQL的东西

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

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

这个博客提供了一个很好的基于Objective-C和iOS的示例http://lowcoupling.com/dslengineering

好! 上面解释了很多东西。 我会尝试用更简单的方式来解释这个问题,就像我这样的人会理解。

由于通用语言被用于广泛的目的,所以DSL仅被用于特定领域。 像HTML或CSS一样。

你可以说,如果你写了一篇文章,只有一些人或你唯一的最好的朋友可以理解,没有人可以。 那么它可能是一个DSL。 但是,如果你用很多人可以理解和可以遵循的术语编写指令,那么这不是DSL。

我创build了一个用户的开关板,可以通过计算机的串口进行操作,用户需要一个可以在该开发板上执行的用于该开发板的程序,继电器开关将相应地打开和closures。 所以我写了一些说明,并告诉用户按照这些指示编写该板。 这是DSL的一个例子。 我没有发明一种新的语言,而是创build了一堆string,微控制器可以从EEPROM中读取数据,并可以进行相应的parsing,并执行特定的任务。

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

社区正在成长,但还没有达到其他“主stream”技术的水平。

大多数情况下,DSL是为了提高公司内部的生产力而做出的,所以他们保持私密,不分享他们的结果/见解。

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