在.NET上实现DSL

时间:2012-03-23 14:20:22

标签: c#-4.0 .net-4.0 expression-trees dsl

我在.NET(4.0)之上实现了一个小型DSL,而我目前正在使用Expression Trees将DSL转变为可执行代码块。

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

Expression Tree是否适合这项工作?

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

您可以查看Boo,并在Rhino.DSL更具体地了解它。为了了解Boo带来的影响,Ayende's posts是一个伟大的首发。

Boo被其接受者描述为:

  

面向公共语言基础结构的新的面向对象的静态类型编程语言,具有python启发语法,并特别关注语言和编译器的可扩展性。

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

通过将Boo放在管道中的某个位置,就像Rhino.DSL那样,你释放了许多通用性,甚至不需要膨胀或性能损失(它仍然是编译后运行的字节码)。

如果您查看the unit tests on Rhino.DSL,您会快速了解可能的情况。

但需要注意的是:所有提及的存储库目前都处于非活动状态(去年没有活动),但恕我直言并没有降低其实际使用价值。

希望这对你有所帮助。