可以使用DLR开发静态类型语言吗?

时间:2011-10-05 20:29:28

标签: c# compiler-construction language-design dynamic-language-runtime

我必须为.NET的静态类型语言开发编译器我正在考虑使用DLR而不是构建所有部分(Lexer / Parser,语法,语义,代码生成)。

DLR是否适合这种情况?或者最好直接为.NET构建编译器并避免所有动态调用。

编辑:我确实在不使用DLR提供的任何动态表达式的情况下实现了该语言,而是使用了其他表达式。

之后我可以说在实现编译器直接定位DLR而不是IL时要好得多。生成的代码仍然非常干净。

如果您想查看一些代码检查:tigerconverters.codeplex.com /

3 个答案:

答案 0 :(得分:4)

在这种情况下,DLR为您提供的最好的事情是表达树。这些是为LINQ引入的相同表达式树,但它们已经扩展为支持生成完整程序。与IL相比,生成表达式树要简单得多,并且在生成树时会得到一堆有用的检查,而不是在生成无效IL时难以诊断故障。所以你应该看看System.Linq.Expressions。要编译并保存到程序集,您需要使用LambdaExpression.CompileToMethod。

使用它们时唯一动态的是DynamicExpression节点,您可以完全避免这些节点。

答案 1 :(得分:3)

DLR提供了许多对静态语言有用的基础结构。例如,它具有绑定方法调用和重载解析的默认实现。如果您的语言的语义与默认行为匹配,那么这很好。

然而,错误处理可能有点棘手。例如,如果方法查找失败,默认绑定器仍将返回有效表达式,但它将是抛出异常的代码...

DLR无法帮助您解析或解决问题。

还有其他选择。例如,您可能想要查看由MSR的Herman Vitter创建的Common Compiler Infrastructure项目。这可能实际上是一个更好的整体匹配。

答案 2 :(得分:2)

顺便说一下,您需要为拥有 DSL(域特定语言)实现拥有解析器。 编译可以在CLR上进行中继,但不能您的解析器。从你的实际问题来看,DLRCLR不会产生任何影响。

一个有用的链接:Create a Language Compiler for .NET Framework

相关问题