我只是对领域特定语言感到好奇。我在文章中已经多次看到它们,似乎它们可以在保证或银行数据定义问题之外使用。
所以我来这是一个具体的输入。
您使用过DSL吗?写一个。如果是的话,感觉如何?
您认为您的某个项目使用DSL可以更好(更高效,更易维护......)吗?
编辑:我很遗憾将其放在此之后,但我的意思是你自己编写的特定DSL。 它排除了Tex,HTML,Make,SQL。事实上,问题更多:“编写DSL”
答案 0 :(得分:8)
SQL是Michael Dorfman给出的一个很好的例子。我广泛使用的其他人是:
至于它如何运作,我认为这取决于语言和领域。 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:
答案 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以响应重复的问题并编写太多的模板代码。从我的个人经历中摘录:
另请注意,如果仔细观察,可以将许多文件格式视为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 ++ ;)
中成为了这个