你写了什么样的问题?

时间:2009-07-10 12:27:32

标签: language-agnostic dsl

我只是对领域特定语言感到好奇。我在文章中已经多次看到它们,似乎它们可以在保证或银行数据定义问题之外使用。

所以我来这是一个具体的输入。

您使用过DSL吗?写一个。如果是的话,感觉如何?

您认为您的某个项目使用DSL可以更好(更高效,更易维护......)吗?

编辑:我很遗憾将其放在此之后,但我的意思是你自己编写的特定DSL。 它排除了Tex,HTML,Make,SQL。事实上,问题更多:“编写DSL”

12 个答案:

答案 0 :(得分:8)

SQL是Michael Dorfman给出的一个很好的例子。我广泛使用的其他人是:

  • UIL - GUI构建
  • Make - 程序构建和安装
  • regexp - 字符串模式匹配
  • lex and yacc - 词法分析器和编译器创建

至于它如何运作,我认为这取决于语言和领域。 UIL对于指定GUI来说是非常棒的。如果你在内联Motif代码中执行相同的操作,那么UIL编译器捕获的GUI规范错误看起来就像是C或Ada编译器完全可编译的代码。这导致浪费更多时间浪费调试。另外,使用Motif API调用的通用代码看起来很简单。

Make真的可以成为一场噩梦,但是没有很多工具可以做它做的事情,我怀疑它们都有同样的问题。

正常表达式对于非常简单的任务是不必要的,对于非常复杂的任务来说是一场噩梦。对于中间人来说,他们是一个很棒的工具。

Lex和yacc非常有帮助。但是,知道自己在做什么的人可以手工创建解析器和词法分析器,并且工作量相同。

答案 1 :(得分:8)

我认为非常易读的API作为DSL的弱形式(有些人称之为流畅的接口),内部DSL作为介于两者之间的东西和另一端的完整语法定义的外部DSL之间存在着相当大的连续性。 。

最弱的形式是我总是试图实现的(即使API尽可能最接近问题域)。如果非程序员将使用该软件,则连续体另一端的DSL非常有意义。输入数据。

使用类似Xtext的框架,即使是完整的外部DSL,包括支持语法着色和错误检查的编辑器也比最初看起来更容易实现。

答案 2 :(得分:7)

你的问题很合适。我最近使用工具Antlr编写了一个DSL。 Antlr是一个解析器/词法分析器生成器 它允许轻松构建DSL(以及许多其他东西),当与StringTemplate(由同一个人编写)结合使用时,代码生成变得非常强大。它还可以针对多种语言。我们的解析器和词法分析器在C#(目标之一)中,即使默认为Java。

Antlr的众多优点之一是描述性错误消息和IDE /调试器(AntlrWorks),它允许您逐步查看语法并直观地查看AST树。

John Saunders在下面建议使用内置的visual studio DSL工具包。最终,我发现这些工具远远不能收缩。要求GUI,没有任何能够轻松描述基础文本语法的能力,似乎不足以满足我的需求。

除了DSL解析器/词法分析器,我还编写了一个Visual Studio语言服务,以提供智能感知,错误突出显示,代码完成和模板项目/项目。

即使您不实施附加功能,DSL也可以简化重复性工作。我的DSL专门针对CSLA framework,使用所有管道轻松生成业务对象,允许开发人员只关心业务逻辑。

以下是DSL的一个小例子:

datadef Object1Datadef
{

   tables
   {
      MyTable:PK[MyTableID], column1, column2;
   }

}

root MyObject
{
    datadef Object1Datadef;

    read "all";
    write "admin", "superusers";

    int _Myvariable;    

}

如果您的DSL允许您更快,更轻松地描述您的域并提高工作效率,那么这是值得的。

答案 3 :(得分:6)

我认为我们大多数人经常使用的DSL是SQL,一种用于数据处理和提取的小语言。

答案 4 :(得分:3)

最近两次使用DSL:

  1. 使用construct库 - 它基本上定义了一个DSL,用于描述数据的二进制结构(如文件格式)和协议。
  2. 实现基于Python的DSL以验证硬件。该DSL列出了将测试编写为可以使用底层DSL组件的“场景功能”所需的所有基础设施。

答案 5 :(得分:3)

我是NUnit版本2.0及以上版本的人之一。它是使用C#属性编写的DSL来描述单元测试。它不是DSL的最明显的例子,但我已经把它想象成一个。 我用ANTLR甚至MGrammar写了一些其他的。经验往往是一样的。一旦你向其他人展示,他们就想做一些你从未想过的事情。这是一件好事,但你必须准备继续前进并添加功能。

我现在习惯于经常思考和编写DSL。我使用的当前对象关系映射器是dsl。它不是一种新语言。它是纯粹的C#,但通过考虑域的语言,并且Domain不仅仅是Business Domain,我们创建了一种用于映射对象的迷你语言。关于DSL的思考已经改变了我们的API和框架构建方法。

答案 6 :(得分:2)

实际上,你几乎每天都使用DSL而不知道它...... HTML,make,XML,latex和许多配置语言......

我喜欢使用声明性的DSL来生成一堆东西......感觉很好......

DSL的影响是多么有趣但很难评估......如果你的DSL是针对目标社区设计的(目标社区是一个非常重要的点...)就这个社区而言我期待并且做得很好,它会感觉很好......

但是,如果您在不了解社区的情况下设计DSL,或者他们是否需要经常与语言的限制作斗争(DSL仍然可以完成图片......),那将会受到伤害......

答案 7 :(得分:2)

根据我的经验,任何软件工程组织都会创建DSL以响应重复的问题并编写太多的模板代码。从我的个人经历中摘录:

  • 编译器自下而上的重写系统生成器
  • 汇编程序生成器
  • 对象代码生成器(实现为带有运算符重载的C ++库)
  • CPU模拟器生成器
  • Simulator device model generator
  • 交互式工具的命令行语言

另请注意,如果仔细观察,可以将许多文件格式视为DSL。

Mark Shapiro in ACM Queue有一篇很好的文章也反过来讨论这个现象。

另一个例子是用户最终用不适合它的东西编写大型程序的方式......就像使用旧的“SNIFF”调试器脚本语言的测试台一样。

答案 8 :(得分:2)

这可能是一个老问题,但标题中的问题(而不是正文中的问题)并没有真正被任何人回答:

有两个(双)实例可以编写DSL:

  • 当问题域被很好地理解并且已经存在名词(对象),动词(动作,组合器等)和形容词(属性,修饰符)的词汇时。
  • 当解析域非常清楚并且......

正则表达式是第一个的好例子,而汇编程序生成器则是第二个。通用编程语言是其余的:当问题领域和解决方案领域都没有得到充分理解时,必须承担一般工具。

答案 9 :(得分:0)

BNF作为解析器生成器的DSL怎么样?

答案 10 :(得分:0)

使用Visual Studio DSL Toolkit创建的DSL可用于从DSL定义的域模型的实例生成任何基于文本的工件。当然,当时在Visual Studio内部,如果有文件工件的编译器或其他处理器,那么它可以自动运行。

一些例子是

当然,你可以创建自己的。

答案 11 :(得分:0)

我还是学生,但我对spirit

非常着迷

我在'编程语言'课程中使用过一点点。这就是它的工作原理,基本上你是在写EBNF。

alt text http://img6.imageshack.us/img6/1461/reala.png

C ++ ;)

中成为了这个

alt text http://img6.imageshack.us/img6/8809/dsl.png