代码之家  ›  专栏  ›  技术社区  ›  Pedro

Java JVM/.NET CLR的代码生成

  •  2
  • Pedro  · 技术社区  · 15 年前

    我在大学里做一个编译器专业,我们必须为我们发明的语言生成代码到任何我们想要的平台上。我认为最简单的情况是为Java JVM或.NETCLR生成代码。有什么建议可以选择哪一个,哪些API可以帮助我完成这项任务?我已经完成了所有的语义分析,只需要为给定的程序生成代码。

    谢谢你

    3 回复  |  直到 15 年前
        1
  •  4
  •   Pavel Minaev    15 年前

    据我所知,在更高的层次上,两个虚拟机实际上非常相似:两个虚拟机都是基于堆栈的经典机器,具有很大程度的高级操作(例如,虚拟方法调度是一个操作码)。也就是说,如果需要,clr允许您深入到金属元素,因为它具有带算术的原始数据指针、原始函数指针、联合等。它还具有适当的尾调用。因此,如果语言的实现需要上述任何一种(例如,scheme spec强制进行tailcalls),或者如果拥有这些特性对语言的实现具有显著的优势,那么您可能希望使用clr方法。

    另一个优点是,您可以使用stock api在那里发出字节码。- System.Reflection.Emit -尽管它对于成熟的编译器场景有一定的限制,但对于简单的编译器来说,它仍然足够。

    使用JVM,您得到的两个主要优势是更好的可移植性,以及字节码本身可以说更简单(因为特性更少)。

        2
  •  1
  •   scptre    15 年前

    我遇到的另一个选项是运行夏普库,它可以在运行时使用emit生成msil代码。但以一种更友好的用户方式,这更像C。图书馆的最新版本可以在这里找到。 http://code.google.com/p/runsharp/

        3
  •  0
  •   scptre    15 年前

    在.NET中,可以使用Reflection.Emit命名空间生成MSIL代码。

    请参阅msdn链接: http://msdn.microsoft.com/en-us/library/3y322t50.aspx