123

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

维基百科:

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

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

4

14 回答 14

123

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

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

于 2009-04-30T23:40:23.640 回答
74

您可以将 DSL 视为用更通用的编程语言编写的函数的复杂参数。真正的编程语言会解析 DSL 代码并对其进行处理,通常情况下,DSL 代码只关注想要做的事情,而更大的系统会弄清楚如何做。

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

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

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

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

于 2009-05-01T00:19:38.007 回答
13

(解决问题的症结)

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

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

于 2009-04-30T23:48:30.577 回答
11

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

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

于 2009-04-30T23:34:05.730 回答
11

一切都是DSL...

汇编器:MOV R1 到 R2
编译器:赋值语句 -- A = A + 1,条件 -- IF (TRUE) ...,分支 -- RETURN
HTML:... 描述嵌套结构
TCP/IP:描述到/从地址
PDF:描述文本/图像在纸上的位置
字体:描述字符

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

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

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

我发现 HTML 并没有真正解决页面布局的问题,所以我把它去掉,定义了一个适合的 DSL。我在页面上定义了 6 个区域,HEADER、BODY、FOOTER、LEFT/RIGHT MARGINS 和 LEFT/RIGHT FULL MARGINS。然后我可以告诉页面生成器将标题栏、状态栏、菜单、表格、表格、...添加到特定的单元格。然后可以将这些单元中的每一个拆分为任意深度的行和列。任何样式的页面布局都需要几秒钟。

BODY 包含我的员工表
HEADER 包含标题栏标题“Hello World”,并登录到柯林斯软件

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

资源 我的主菜单
*define:menu,m,Level,Label,Icon,Action;
米,0,文件;
m,1,open,open.gif,对话框打开文件;

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

于 2014-08-29T23:36:36.130 回答
8

DSL 是开发供非程序员使用的语言的好方法。例如,如果您为公司的财务人员准备了 DSL,那么您可以让他们编写他们想要完成的程序,而不是按照他们的规范进行编程。然后,如果它太慢,那么您可以按照他们想要的方式使用他们编写的内容,用编译语言编写以加快速度。

于 2009-04-30T23:38:10.727 回答
7

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

由于通用语言用于广泛用途,因此 DSL 仅适用于特定领域。像 HTML 或 CSS。

你可以说,如果你在一篇论文上写了一些指令,只有某个人或你唯一最好的朋友能理解,而其他人都不能理解。那么它可能是一个DSL。但是,如果您以许多人可以理解并可以遵循的方式编写说明,那么这不是 DSL。

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

于 2017-10-06T18:16:22.103 回答
6

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

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

在其中,我将 DSL 定义为:

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

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

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

于 2015-07-26T22:17:55.933 回答
3

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

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

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

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

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

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

于 2015-03-19T02:54:55.323 回答
3

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

于 2015-09-12T11:49:34.490 回答
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

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

一旦深度学习领域在某种程度上(甚至现在)稳定下来,我很乐意看到 Apache MXnet 项目中出现类似的东西。但是,我还没有在提案页面上看到任何提案。

于 2018-11-19T22:32:17.243 回答
1

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

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

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

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

于 2017-10-13T13:55:26.090 回答
1

DSL - 领域特定语言。让我们开始什么是域 - 域是一些定义的区域,范围。这个域可以是网站外观,你有它的 CSS,第二个域可以是网站结构,这里有 HTML。

但是,域也可以是 Company X Application。在这个领域的范围内,可以创建一些语言。语言并不意味着 - 具有自己的语法、语法、编译器或运行时的完全风味的东西。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,你可以创建一组组件,并将它们组合成构建块,哇!,现在你在 DSL 之上制作了 DSL。

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

于 2019-10-27T22:25:53.830 回答
0

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

nextflow 的主要目的是编写用于分析的管道,并轻松地从笔记本电脑到 HPC 到云,并使用 conda、docker、singularity 重复 env

于 2020-12-02T06:40:37.153 回答