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

enz*_*nzi 0 .net dsl azure

我正在寻找一个符合以下标准的良好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的工具,您建议我应该使用哪些工具?
你有什么经验,你有什么经验?某项技术是否繁琐,缓慢,过时,即将更换/取消?请告诉我.

Jam*_*mes 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中/存档/ 2008/10/09 /特定领域的语言,DSL的功能于普通型和知识,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的权利人在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接口.

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

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