C# 4.0 在.NET上实现DSL

C# 4.0 在.NET上实现DSL,c#-4.0,.net-4.0,expression-trees,dsl,C# 4.0,.net 4.0,Expression Trees,Dsl,我正在.NET(4.0)之上实现一个小型DSL,目前我正在使用表达式树将DSL转换为可执行代码块 DSL是预定义的,因为我们正在实现对遗留文件格式的支持 表达式树是否是此作业最合适的工具?如果要生成新类型,表达式树将毫无用处。对于大多数典型的DSL,您必须构建类型。因此,一个好的旧系统.Reflection.Emit可能是一个更好的选择。您可以查看并更具体地了解它,它是建立在它之上的。要想了解Boo在谈判桌上的表现,我们是一个很好的先发球员 Boo的接收者将其描述为: 一种新的面向对象的静态类型

我正在.NET(4.0)之上实现一个小型DSL,目前我正在使用表达式树将DSL转换为可执行代码块

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


表达式树是否是此作业最合适的工具?

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

您可以查看并更具体地了解它,它是建立在它之上的。要想了解Boo在谈判桌上的表现,我们是一个很好的先发球员

Boo的接收者将其描述为:

一种新的面向对象的静态类型编程语言,用于公共语言基础设施,具有受python启发的语法,特别关注语言和编译器的可扩展性

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

通过像Rhino.DSL那样将Boo放在管道中的某个地方,您可以释放出许多功能性,这些功能性甚至不是必要的臃肿或性能限制(它仍然是编译后的字节码)

如果你看一看,你会很快对可能发生的事情有一个印象

不过需要注意的是:所有提到的存储库目前都非常不活跃(去年没有任何活动),但这并不会降低它们的实际使用价值


希望这对您有所帮助。

谢谢您的回答,@SK logic。请你把它扩大一点好吗。为什么表达式树“没有用处,除非你想生成新类型”,而
Reflection.Emit
如何更好地为我服务?@GregB,我的意思是相反的-表达式树不能用于生成新类型。您只能将它们编译为委托。想象一下,比如说,某种ORM的DSL,它将数据库映射到对象的层次结构。它必须为该对象发射类型,并且您只能使用Reflection.emit进行发射。