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

本文关键字:型语言 静态类 开发 DLR | 更新日期: 2023-09-27 18:10:36

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

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

编辑:我没有使用DLR提供的任何动态表达式来实现该语言,而是使用了其他表达式。

之后,我可以说,当实现一个编译器来针对DLR而不是直接针对IL时,这要好得多。生成的代码仍然会非常干净。

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

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

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

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

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

然而,

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

DLR不能帮助您进行解析或词法分析。

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

顺便说一下,您需要为您的own DSL(领域特定语言)实现您的自己的解析器。编译可以在CLR上执行,但不能在解析器上执行。DLRCLR对你实际问题的意义没有影响。

一个有用的链接:为。net Framework创建一个语言编译器