【问题标题】:What is a domain specific language? Anybody using it? And in what way?什么是领域特定语言?有人用吗?以什么方式?
【发布时间】:2010-10-23 00:20:35
【问题描述】:

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

维基百科:

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

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

【问题讨论】:

  • 实际上领域特定语言是一个在编程中具有明确含义的术语 - 查看维基百科文章
  • 如下所述,DSL 不是一种语言,而是一整类特殊用途语言的名称。
  • 那么我可以说 R 是 DSL 吗?
  • 在它的边缘,但我不会。 R 具有所有通用结构,可用于广泛的计算;数值计算和统计不是一个非常窄的领域。不过,这是对定义的一个很好的测试。
  • 发现了一个关于 DSL 的精彩 article

标签: terminology dsl


【解决方案1】:

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

Martin Fowler 是这个想法的大力支持者,here

【讨论】:

  • Ruby 有哪些特性可以更轻松地创建新的 DSL?
  • @Lernkurve - Ruby 有元编程,这很有帮助。 rubylearning.com/blog/2010/11/23/…
  • @CharlieMartin 你能告诉我关于“groovy”的信息吗?它到底是哪种语言?我想知道请在这里协助..
  • Groovy 是一种在 JVM 中运行的脚本语言。它基本上旨在成为 Ruby 的 Java 答案。它是一种通用语言,但可用于编写 DSL。 docs.groovy-lang.org/docs/latest/html/documentation/…
  • 我想添加 Gradle 的 groovy。如果没记错的话,他们有自己的语言来描述构建。
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 很有趣,你没有列出的一个例子是我想到的第一个例子:正则表达式
【解决方案3】:

(解决问题的症结)

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

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      一切都是 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;
      m,0,文件;
      m,1,open,open.gif,对话框打开文件;

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

        • 您的意思是客户/客户想要为他们的应用程序生成代码,我们提供/准备这些代码?
        【解决方案7】:

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

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

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

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

        【讨论】:

          【解决方案8】:

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

          I Wish We Used Domain Specific Languages (DSLs) More

          在其中,我将 DSL 定义为:

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

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

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

          【讨论】:

            【解决方案9】:

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

            【讨论】:

              【解决方案10】:

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

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

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

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

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

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

              【讨论】:

              • Objective-C 不是特定领域的语言
              • 它也不是由(和为)Apple 制造的。
              【解决方案11】:

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

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

              一旦深度学习领域(甚至现在)稍微稳定下来,我希望看到 Apache MXnet 项目中出现类似的情况。但是,我在the proposal page yet 上没有看到任何建议。

              【讨论】:

                【解决方案12】:

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

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

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

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

                【讨论】:

                  【解决方案13】:

                  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 太多次了,抱歉。

                  【讨论】:

                    【解决方案14】:

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

                    nextflow的主要目的是编写分析流水线,轻松实现从笔记本电脑到HPC到云端的转换,用conda,docker,singularity重复env

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2019-01-05
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2014-07-22
                      • 2010-09-06
                      • 1970-01-01
                      相关资源
                      最近更新 更多