在.NET中使用DSL(工具)的经验

时间:2011-01-03 10:16:05

标签: .net azure dsl

我正在寻找符合以下标准的良好DSL工具/框架:

  • 可以与C#一起使用
  • 在Windows Azure上运行 - 可以在任何地方生成编译器,但实际的解析在云中进行
  • 尽可能快速且资源效率

我希望用户能够指定随后由程序解释的规则。 DSL基本上是任何脚本语言的子集 - 数学运算,if语句,字符串操作等 - 适用于域对象(例如if (SomeComponent.Child3.SomeProperty > 3) SomethingElse.Color = Color(50,0,0))。
由于它是创建规则的用户,我认为使用像IronPhyton这样的真实脚本语言(闻起来像SqlInjection,但更糟)是个坏主意 - 而且,我不希望用户实际编程,所以语法应该是尽可能简单易懂,因此是DSL。

我到目前为止所使用的工具是:

...还有更多我在这里读过的关于SO的内容但是还没有详细介绍(比如Oslo / MGrammar,Boo,Antlr ......)

我到底在问什么?
1.我应该详细查看哪些用于在C#(或.NET)中创建DSL的工具,您建议我应该使用哪种工具?
你有什么经验,你有什么经验?某项技术是否繁琐,缓慢,过时,即将更换/取消?请告诉我。

4 个答案:

答案 0 :(得分:6)

你似乎做了很多研究,我看到你对M语言的意思看起来会被丢弃。 但是,我认为它不会真正走出去,因为它似乎被sqlserver团队吞没了。 (谁最近,我已经提出了我所相信的最有趣的开发.net - > Reactive Extensions,IQbservable,Linq to Anything)

我会看:http://channel9.msdn.com/Blogs/Charles/Jeffrey-Snover-Martin-Fowler-and-Neil-Ford-Domain-Specific-Languages 并快速阅读http://blogs.msdn.com/b/powershell/archive/2008/10/09/domain-specific-languages-dsls-in-general-and-how-powershell-relates.aspx

这里有一些背景知识,Jeffry Snover是Powershell的创建者,这为他赢得了Window of Window服务器的推广。 Snover,Eini和Fowler都同意,外部DSL比内部DSL需要更多的努力。 还有一种观点认为外部DSL本质上是死胡同。这是因为它们仅适用于他们的区域。框架也是这样。它往往是具有外在价值的外部语言。

此外,它是DSL语法和DSL词汇之间的区别。通过编写外部DSL,您实际上是在编写这两个方面,而如果您将DSL嵌入到另一种语言中,则只需要指定DSL词汇表。

因此,Powershell非常适合DSL,因为它将闭包作为第一类对象(scriptblocks)来处理。它的未来也得到了保证,所有窗口版本都存在。在应用程序中托管powershell只需要几个引用和几行代码,并且它可以完全访问.net类型系统。 在powershell中编写DSL的实际行为是微不足道的。

Douglas Finke MVP是DSL和Powershell的优秀资源

较旧的DSL帖子: http://www.dougfinke.com/blog/index.php/2009/07/01/powershell-powerboots-and-an-oslo-dsl-grammar/ 创建体面的DSL是多么微不足道的一个例子。 http://www.dougfinke.com/blog/index.php/2009/03/18/powershell-dsl-for-deploying-biztalk-applications/

http://www.dougfinke.com/blog/index.php/2008/03/24/fluent-interfaces-dsl-and-language-oriented-programming/

如果您是PowerShell的新手,那么他在这里有一个快速入门: http://www.dougfinke.com/blog/index.php/2011/01/10/how-to-practice-powershell/ 虽然我建议将'Powershell in Action,第2版'作为完整参考,但有一节专门用于在其中编写DSL的权限(它是由Wilson的右手man在powershell团队中编写的)。

您似乎在描述编写完整的外部DSL:本质上是一种语言。 你可能想看看有些冗长的CodeDom,以及DLR(http://dlr.codeplex.com

对于很多这些东西的基础背景,建议你开始研究强调延续,以及LISP / Scheme中开创的其他技术。尊敬的SICP http://mitpress.mit.edu/sicp/http://www.cs.brown.edu/~sk/Publications/Books/ProgLangs/以及http://www.ccs.neu.edu/home/matthias/HtDP2e/index.html 碰巧的是,LISP / Scheme是编写DSL和其他语言的完美语言,如果您还没有,只是学习它们,将在您正在寻找的领域中改进您的编程。

你还提到你想做一些天蓝云工作。作为一个旁观但非常有用的背景文章,我建议观看Bart De Smet关于微软如何扩展其“可枚举生态系统”以满足扩展和分布式系统的描述。 http://community.bartdesmet.net/blogs/bart/archive/2008/10/20/linq-to-anything-channel-9-interview-and-a-few-more-thoughts.aspx

如果您要对powershell进行任何开发,Bart的博客上有一些关于此主题的开创性文章(包含完整而清晰的代码示例),包括如何使用它们并在其上放置MMC 3接口。 / p>

无论你最终选择什么,从痛苦的个人经验来看:写内部DSL,它们更快,更容易,更少花费,更低的学习曲线,你不需要在CV的需求领域。正如您所知,出于以前的原因,我建议使用Powershell,以及访问所需的所有.Net / COM / WMI / Webservice资源。此外,它的未来是有保障的。

无论如何,我希望这会有所帮助,祝你好运。

答案 1 :(得分:1)

答案 2 :(得分:0)

您是否尝试过ANTLR

答案 3 :(得分:0)