【问题标题】:Implementing a DSL on .NET在 .NET 上实现 DSL
【发布时间】:2012-03-23 14:20:21
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答,@SK-logic。请你扩大一点。为什么表达式树“除非你想生成新类型是无用的”,Reflection.Emit 如何更好地为我服务?
    • @GregB,我的意思正好相反——表达式树不能用于生成新类型。您只能将它们编译为委托。例如,想象一下用于某种 ORM 的 DSL,它将数据库映射到对象的层次结构。它必须为该对象发出类型,并且您只能使用 Reflection.Emit 来做到这一点。
    【解决方案2】:

    您可能会查看Boo 和更具体的Rhino.DSL,它是基于它构建的。要了解 Boo 带来的效果,Ayende's posts 是一个很好的开端。

    Boo 被它的 inceptors 描述为:

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

    因此,基本上,它是 C# 的替代方案:同样可以编译,但更加灵活,您可以动态设置新的语言结构。表达式树只是其中的一小部分。

    通过将 Boo 放置在管道中的某个位置,就像 Rhino.DSL 所做的那样,您可以释放出很多功能,甚至不需要臃肿或消耗性能(它仍然是运行的编译字节码)。

    如果您查看the unit tests on Rhino.DSL,您将快速了解可能发生的事情。

    但请注意:所有提到的存储库目前都非常不活跃(去年没有活动),但恕我直言,这并没有贬低它们的实际用途。

    希望这对你有帮助。

    【讨论】:

      猜你喜欢
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-26
      • 2017-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多