.net - 在 C# 中实现编译器最有趣和最有前途的方法是什么?

标签 .net reflection.emit codedom mono.cecil roslyn

我刚刚开始我的毕业项目,该项目应该持续 6 个月。
该项目的目标是为一种脚本语言实现一个 .Net 编译器。我在类(class)中将编译器构造作为一个主题,并且知道如何实现编译器的基本步骤,但是我们使用了 Bison 和简单的编译器以及 GCC 作为后端,因此我对实现编译器知之甚少在.Net平台上。

在对这个主题进行了一些研究之后,我发现了以下代码生成的替代解决方案(我不是在谈论编译器的其他重要部分,比如解析器——它超出了这里的范围):

  • 使用 Reflection.Emit 直接生成代码.
  • 使用 Common Compiler Interface对 Reflection.Emit 的抽象,用于自动生成某些代码。
  • 使用 CodeDOM用于运行时的 C# 和 VB 编译。
  • 有一个新出现的 C#“编译器即服务”,称为 Roslyn。 ,现在可作为 CTP 使用。
  • DLR提供对动态代码生成的支持,并具有一些通过表达式树等生成运行时代码的接口(interface)。
  • Mono 随附 Mono.Cecil似乎也有一些代码生成功能的库。

  • 我项目的主要目标是更深入地研究 .Net,学习编译器构造并为我的工作取得好成绩。第二个目标是提出一个编译器实现,以后可以在许可的开源许可下向社区开放。

    那么,什么是最有趣、最有教育意义、最有趣和最有前途的方法呢?如果我有更多时间,我肯定会尝试所有这些,但我需要在 6 个月内提交我的工作以获得积极的成绩......

    先感谢您,
    亚历山大。

    最佳答案

    如果您想要更简单的方法并且您的语言可以合理地翻译成 C#,我建议您生成 C# 代码(或类似代码)并编译它。罗斯林可能是最擅长的。显然,CCI 也可以使用 CCI Code ,但我从来没有使用过。我不会推荐 CodeDOM,因为 it doesn't support features like static classes or extension methods .

    如果你想要更多的控制或者你想要去低级,你可以使用 Reflection.Emit 直接生成 CIL。但这将是(更多)工作,特别是如果您不熟悉 CIL。我认为 Cecil 可以以相同的方式使用,但它是用于其他用途的,而且我认为它与 Reflection.Emit 相比没有任何优势。

    顾名思义,DLR 是动态语言的意思。 Expression它使用的 s 可以用于代码生成,但我认为它们最擅长在运行时生成相对简单的方法。当然,如果您的语言是动态的,DLR 本身就会非常有用。

    关于.net - 在 C# 中实现编译器最有趣和最有前途的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8072833/

    相关文章:

    .net - 如何覆盖 ASP.NET Web 应用程序当前区域性的货币格式?

    c# - 带有 LINQ 的 Netflix OData : "The method ' Select' is not supported. "

    .net - .NET 中类型名称的最大长度是多少

    c# - 当通过 TypeBuilder.CreateType 实现具有参数为 'in' 的方法的接口(interface)时,抛出 TypeLoadException

    c# - 创建没有引用的对象

    c# - LINQ : Reading objects from database, 出现异常时遇到问题

    c# - 生成动态方法来设置结构的字段而不是使用反射

    c# - Type.GetType(string) 应该知道动态生成的类型吗?

    c# - 如何使用 CodeDOM 表达空合并运算符?

    c# - 有没有办法让 CodeDom 在命名空间之前放置 using 语句