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

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

维基百科:

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

有没有人能给出一些具体的例子,说明您是如何实现它的,或者它在给定的场景中是如何有用的?

92569 次浏览

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

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

DSL 是开发供非程序员使用的语言的好方法。例如,如果您有一个面向公司财务人员的 DSL,那么您可以让他们编写他们想要完成的程序,而不是根据他们的规范进行编程。然后,如果速度太慢的话,你可以把他们写的东西按照他们的要求写出来,用编译语言写出来,加快速度。

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

Martin Fowler 是这个想法的大力支持者,就像 给你一样。

(解决问题的关键)

我想我第一次在某个地方看到 DSL以及它作为“领域特定语言”我还认为它是一种特别的,具体的语言的定义时,我只是没有听说过——但是,不,它是一个为特定应用领域量身定制的语言的通用术语。

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

可以将 DSL 视为用更通用的编程语言编写的函数的复杂参数。真正的编程语言解析 DSL 代码并对其进行处理,通常,DSL 代码只关注您想要执行的 什么,而较大的系统会计算出 怎么做

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

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

使用它们有什么特别的好处吗?将它们用于预期的目的是非常有利的,以至于您将在不知情的情况下求助于它们,就像您一直在使用 SQL 或 HTML 而没有将它们视为 DSL 一样。

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

一切都是 DSL..。

汇编程序: MOV R1到 R2
编译器: 赋值语句—— A = A + 1,条件语句—— IF (TRUE) ... ,分支——返回
HTML: ... 描述嵌套结构
TCP/IP: 描述到/来自地址
PDF: 描述文字/图像在纸上的位置
字体: 描述字符 < br >

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

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

我将避免使用其他方便但不适合这个问题的解决方案,比如用于定义数据(XML)的 HTML。CSV 是非常有用的,它适合大多数问题。JSON 不适合易用性部分,它是过度杀伤,增加了不必要的并发症是 CSV 工程的大多数问题。我们经常在 DSL 中使用 EXCEL,它对于描述小问题非常有效,在65K 到1M 行之间,比如树结构或菜单,列 A 是级别,其他列是图标,颜色,标签等(EXCEL 是一个可编辑的 CSV)。

我发现 HTML 并没有真正解决页面布局的问题,所以我摆脱了它,并定义了一个适合的 DSL。我在页面上定义了6个区域: 页眉、页眉、页脚、左/右边距和左/右边距。然后,我可以告诉页面生成器向特定的单元格添加一个标题栏、状态栏、菜单、表格、窗体... 。然后,这些单元格中的每一个都可以被分割成任意深度的行和列。任何样式的页面布局都需要几秒钟。

BODY 包含一个“我的雇员表”
HEADER 包含一个标题栏标题“ Hello World”,用于登录 Collins Software

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

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

每个问题都是独一无二的,计算机可以使用任何格式,领域特定语言就是为人类设计的,所以要让人类能够理解,让他们能够输入一些东西,用真实的词语创造出语言; 因为我们描述的是真实的人,真实的地方,真实的事物。

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

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

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

  • 使用 AAP 的 SAP
  • PeopleSoft 与 PeopleCode
  • 使用 Objective-C 的苹果
  • Facebook 有 FBML 和 FQL 之类的东西

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

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

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

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

在其中,我将 DSL 定义为:

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

在使用方面,如果您曾经使用过 Ant、 SQL (SQL)或者层叠样式表(CSS) ,那么您已经使用了 DSL。

我喜欢使用 DSL,因为它们专注于促进针对特定问题空间的解决方案的交流,并且它们的方式促进了领域专家的参与。

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

好吧!上面有很多解释。我会试着用更简单的方式来解释,因为像我这样的人会理解的。

由于通用语言用途广泛,DSL 只适用于特定领域。比如 HTML 或 CSS。

你可以说,如果你在一篇论文中写下了只有某个人或者你唯一最好的朋友能够理解而其他人不能理解的说明。那么它可能是一个 DSL。但是如果你用这样的术语编写指令,很多人都能理解并且能够遵循,那么这就不是 DSL。

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

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

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

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

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

机器学习中使用的 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

哈德利在他的高级 R 书中有一个很好的章节描述了如何构建一个 DSL w/R: Http://adv-r.had.co.nz/dsl.html

一旦深度学习领域有所稳定(甚至现在) ,我希望看到类似的东西出现在 ApacheMXnet 项目中。然而,我还没有看到任何建议的 求婚页面虽然。

领域特定语言。让我们开始什么是域-域是一些定义的领域,范围。这个域名可以是网站的外观,你可以为它 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,这是使用本地网络平台的替代选择。如果您可以从现有的特定于领域的工具组合功能,那么您就是在使用 DSL 编写。更深入的反应,对不起所有人不从这个 DSL: D,您可以创建一组组件,并组成他们作为构建块,和万岁!现在你在 DSL 之上做了 DSL。

是的,这里重复 DSL 太多次了,抱歉。

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

Nextflow 的主要功能是编写流水线进行分析,从笔记本电脑到高性能计算机再到云计算,可以使用 conda、 docker、 singality 进行重复 env