Compiler construction 编写编译器;哪个虚拟机?

Compiler construction 编写编译器;哪个虚拟机?,compiler-construction,Compiler Construction,我将尝试为一种动态语言编写一个编译器。最好是对一些现有的虚拟机——我(还)不想处理垃圾收集和一个好的虚拟机为您处理的无数其他问题。你建议使用什么虚拟机 我使用Linux,所以我不知道.NET(通过Mono)是否是个好主意。我听说Parrot对动态语言很有帮助,但我从未听说过有人使用过这种语言。我应该发明我自己的吗?LLVM算不算是我应该编译的VM,还是和直x86一样难 另外,基于堆栈的虚拟机与基于寄存器的虚拟机有哪些优缺点 性能和工具支持非常重要。我将用Haskell编写编译器,因此与它的良好接

我将尝试为一种动态语言编写一个编译器。最好是对一些现有的虚拟机——我(还)不想处理垃圾收集和一个好的虚拟机为您处理的无数其他问题。你建议使用什么虚拟机

我使用Linux,所以我不知道.NET(通过Mono)是否是个好主意。我听说Parrot对动态语言很有帮助,但我从未听说过有人使用过这种语言。我应该发明我自己的吗?LLVM算不算是我应该编译的VM,还是和直x86一样难

另外,基于堆栈的虚拟机与基于寄存器的虚拟机有哪些优缺点

性能和工具支持非常重要。我将用Haskell编写编译器,因此与它的良好接口是一个加号。

JVM(Java)和CLR(.NET)似乎是这方面最常见的两个目标,因为它们都为您处理大多数问题。两者都提供了相当简单的指令集


CLR有一个优点——它的设计目标是从一开始就支持多种语言,而且(IMO)使用起来稍微容易一些,特别是如果您不打算编写一种适合于针对该运行时的初始语言的原始“模式”的语言。Mono工作得很好,我不会因为它而回避CLR目标。

.NET有动态语言运行库,如Reed Copsey所述。但是我甚至不知道CLR,更不用说DLR了——我也不能告诉你任何事情。 LLVM应该比普通的x86更好,但它仍然是低级别的。但我也不能说得太多——只看几眼

但我看着鹦鹉。这个想法本身非常棒,而且实现看起来很好。如果我能创造一种动态语言,我敢肯定它会以鹦鹉为目标。(Parrot中间表示)对于VM来说是非常高级的。你有语法糖(arimethic运算符、赋值、调用子例程并从中返回是小菜一碟,…),不要弄乱确切的寄存器编号,只需要取你想要的数量,并给它们分配任何数字,甚至有命名变量


如果我必须选择,我想我更喜欢基于寄存器的虚拟机。研究表明,这些以字节码大小换取执行速度,这非常适合我。此外,当我试图理解太复杂的堆栈操作时,它们往往会让我的大脑陷入混乱——基于寄存器的操作更自然。

LLVM为您提供了比直接的x86汇编更好的编程模型。是的,这是低级的。但您不必担心寄存器调度或完全优化输出。另外,当您还在编写前端时,您可以利用它的类型系统来捕捉可能犯的错误


也就是说,您必须开发自己的运行时层来处理语言的“动态”部分。仅就这一部分而言,我可能倾向于使用CLR。

著名的Donald E.Knuth设计用于解释其算法的“神秘机器”如何?现在仍然有几种混合仿真器。但是动态语言(一种类似Python的语言)必须使用邪恶的变通方法才能工作吗。NET毕竟是为C#。。。另外,如何为非C语言提供工具支持?我的意思是,我肯定会有字节码级的调试,但编写更高级的工具有多容易?@pavpanchekha:CLR并不是专门为C#设计的-它从一开始就考虑了其他语言(如VB.NET)。对于DLR,它也更棒了——请参见IronPython、IronRuby、VB.NET、C#和这里的所有语言:这就是我说CLR在这里有一些优势的主要原因——它从第一天起就被设计为“语言中立”——JVM可以这样做,它从一开始就是为Java设计的……您仍然需要担心如何充分优化您的输出。寄存器调度在x86上是否有用,这是个疑问。您从它的6个“通用”寄存器中获得了什么性能优势?LLVM的指令集公开了无限数量的SSA寄存器。作为程序员,您不必担心将所有变量装入平台实际提供的寄存器数量,也不必担心如何最好地将它们溢出到堆栈中。在LLVM中,获取IR表示只是编译器前端完成的第一步。大多数优化都是在后端的IR上完成的。如果您编写一个工具来输出IR,您可以利用现有的后端优化器,这样您就不必设计系统来执行循环不变代码运动。