2012-03-23 61 views
3

我在.NET(4.0)上实现了一个小型DSL,并且我正在使用表达式树来将DSL转换为可执行代码的块。在.NET上实现DSL

DSL是预定义的,因为我们正在实现对传统文件格式的支持。

表达树是这个工作最适合的工具吗?

回答

5

如果要生成新类型,则表达式树无用。对于大多数典型的DSL,你必须建立类型。所以,一个好的旧System.Reflection.Emit可能是一个更好的选择。

+0

感谢您的回答,@ SK逻辑。请你稍微扩展一下。为什么表达式树“没有用处,除非想生成新类型”,“Reflection.Emit”将如何更好地服务于我? – 2012-03-23 21:18:41

+0

@GregB,我的意思是相反 - 表达式树不能用于生成新类型。你只能将它们编译成代表。想象一下,某种ORM的DSL,它将数据库映射到对象的层次结构。它必须为该对象发出类型,并且只能用Reflection.Emit来完成。 – 2012-03-26 15:38:25

1

您可能会看看Boo,更具体地说,它是在Rhino.DSL上构建的。为了得到Boo带来的印象,Ayende's posts是一个很好的开局。

一个新的面向对象的静态类型的编程语言与Python的启发语法和特别注重语言和编译器扩展的通用语言基础:

嘘由其inceptors描述。

所以基本上,它是C#的替代品:也是编译的,但更灵活,可以动态设置新的语言结构。表达树只是所涉及的一小部分。

通过把Boo放在你的管道中,就像Rhino.DSL一样,你释放了很多通用性,甚至不需要臃肿或性能猪(它仍然编译运行的字节码)。

如果你看看the unit tests on Rhino.DSL,你会对可能发生的事情有一个快速的印象。

虽然有一点需要注意:所有提到的存储库目前都非常不活跃(去年没有活动),但恕我直言,不会降低其实际使用。

希望这可能会帮助你。