我什么时候应该使用领域特定语言?

时间:2009-06-16 18:42:12

标签: project-management dsl

我想在何时使用Domain Specific Language时提供一些实用指导。我找到了有关优缺点的资源,但是哪种项目可以保证使用?

似乎在创建和维护DSL方面需要投入大量资金,因此在什么应用领域我可以获得投资回报率?

编辑: DSL的最常见用途似乎是用于保持数据状态的文件格式,使用DSL进行程序逻辑和结构(可能是代码生成)怎么样?什么时候可行?

编辑#2 我主要询问何时创建特定的DSL值得。当然,我们应尽可能使用现有的DSL来节省时间。

6 个答案:

答案 0 :(得分:16)

创建另一个DSL的原因很少。使用专用语言,世界变得肥胖。

一起思考这些问题。

  1. 使用Python,Java,C ++等通用语言解决问题。

  2. 优化该解决方案以分解常见功能并构建一个非常好,非常优雅,真正可扩展的类库。

  3. 优化该类库以强调“正交性”。确保所有功能都能很好地协同工作,没有任何问题。

  4. 如果您只需要简化语法,请在您的好类库周围创建一个脚本包装器。这是你的DSL。对于Python来说,这很简单 - 它已经是一种动态语言。对于Java,您可以利用一些东西。对于C ++,构建这种灵活的脚本环境可能需要做一些工作。

  5. 如果您仍需要进一步优化,请考虑为您的DSL编写编译器。

答案 1 :(得分:13)

ACM Computing Surveys的文章When and How to Develop Domain-Specific Languages就这一主题提供了建议,Martin Fowler的2010年书Domain-Specific Languages也是如此。

答案 2 :(得分:11)

首先,当您开发的问题域是一个广为人知的域名时,我会 使用 DSL,并且该域名的某些业务专家已经通过了很好的建立这样一个DSL的长度,这样你就不必自己解决他们已经解决的所有问题。

如果您正在考虑 创建 DSL,我会考虑这样做,如果您的业务是在一个非常特定的领域完成的,并且您花费了大部分时间时间聚焦在特定的问题领域。如果你围绕为多个问题域做应用程序,那么我不建议采用这种方法。

例如,如果您的企业在建立税务申请方面非常谨慎,那么建立税务系统DSL可能是一个好主意。这样,您的语言不仅可以在您的各种税务申请中使用,而且您的行业中的其他企业也可以进行市场营销(可使用),这些企业希望执行与您正在完成的类似的事情。

当然,您必须在已有语言的基础上加权构建DSL与框架的成本/收益。

答案 3 :(得分:3)

想到的一种情况是需求需要非常高或不可能的自定义/配置级别。所以你会提供一种针对DSL的脚本模型。

以汽车装配“臂”为例,提供配置模型以支持各种工厂配置是不可能的。 (检测到这一点,不要检测到,当发生这种情况时......等等。)

但是为每个客户编译一个具有专用逻辑的新应用程序可能不是一个好方法。所以在这种情况下,你创建了一个小框架,它将成为一种DSL,然后对于你销售的每个机器人手臂,你在你的DSL上编写一个小应用程序并将其与编译和运行你的DSL的核心软件一起保存而是脚本。或者更好的是,编程DSL的工具与机器人手臂一起被包含在内,因此您的客户可以在您创建的DSL中自行“编程”手臂。

我想到的一个真实世界的例子是Yahoo Pipes(您可以将其视为DSL)或者自动网络爬虫的robots.txt指令。它们可能不是一个完整的DSL,但它们证明了DSL可能有用的地方。

答案 4 :(得分:3)

嗯,有人不得不说出来,所以这里有:

某些人认为Lisp是任何域的域特定语言。这是一个得到良好支持且非常可扩展的DSL。

在某些情况下,从Lisp(或类似语言,如Haskell)制作DSL实际上可以用最少的努力提供大量的功能,因此非常值得。 DSL并不总是需要很大的维护负担。

答案 5 :(得分:2)

最明显的是,当语言已经存在且得到良好支持时,您肯定应该使用它们。这方面的主要例子是UIL for Motif-based GUI development and make for software build。

如果你必须自己创建,我会说寻找域需要大量工作才能正确指定内容,以及编译器无法真正找到大多数错误,但特定于域的编译器可以。 GUI是一个很好的例子,因为大部分工作都是在设置布局,并且通常有很多方法可以使语法有效的C ++调用对你的底层GUI系统毫无意义(EG:试图嵌入整个对话框)按钮内的小部件)。

我发现UIL特别是GUI开发的巨大收益,因为UIL编译器可以在GUI规范中找到错误,看起来就像C ++编译器的正常可编译代码一样。它得到良好支持这一事实意味着代码很容易在平台之间移植,甚至是GUI构建器。