JVM或CLR是否使用寄存器来运行JIT代码?

时间:2012-06-18 23:08:27

标签: jvm clr jit cpu-registers

据我所知,JVM和CLR被设计为基于堆栈的虚拟机。当JIT将字节码编译成本机代码时,它是否也将堆栈原语(加载/存储)转换为X86平台上的寄存器?

如果是,看起来字节码是基于堆栈还是基于寄存器并不重要。 JIT很重要。

3 个答案:

答案 0 :(得分:5)

我认为你混淆了两个不同的概念。

至少对于Java来说,JVM充当虚拟机 - 它是一个理想化的计算机器,具有相对高级的汇编语言(字节码),它基于带有堆栈帧的调用堆栈。在将Java编译为字节码时,Java程序(实质上)变成用于控制该机器的汇编程序。

当在给定系统上实际运行Java时,JVM实现的工作是使用实际可用的任何硬件忠实地模拟这个基于堆栈的机器的执行。这通常意味着在可能的情况下使用寄存器实现大量堆栈操作,并且可能使用Java虚拟机的描述中不存在的其他专用硬件。如何实现这一点的实际细节是特定于实现的 - 一些实现可能将其编译为机器代码,几乎可以完成寄存器中的所有操作,而更简单的实现可能只是编译为内存中操作。我在JVM的JavaScript实现上工作了几个月,在这种情况下,我们将代码“编译”为JS函数,然后将这些函数传递给浏览器的JS实现。

这种区别的原因是Java被设计为易于下载和嵌入(想想小程序)。在这种情况下,安全性和可移植性是重要的考虑因素。字节码必须有一些方法可以自动检查以排除某些类型的恶意代码(例如缓冲区溢出)。同样,无论使用何种格式都必须具有足够高的水平,以至于它可以在各种不同的平台(手持设备,超级计算机,PC等)上运行。基于堆栈的JVM的选择使这两个问题成为可能。同时满足。它足够高,可以检查字节码以排除许多类型错误或未初始化内存的读/写,同时JVM可以使用诸如使用寄存器编译成代码等技巧。

如果您好奇您的特定 JVM将对特定代码执行什么操作,您应该查看文档。大多数JVM都可以通过某种方式为您提供有关如何执行代码的信息。如果您的问题是“为什么不让字节码执行基于寄存器的操作”,原因有两个:

  1. 字节码中有一个寄存器模拟 - 每个堆栈帧都有一些额外的专用空间用于存储临时值,
  2. 没有像x86或MIPS中那样对寄存器提供强大的支持,因为JVM代码必须易于在多个硬件上执行,并且在许多寄存器中进行硬编码可能会使事情变得复杂。
  3. 希望这有帮助!

答案 1 :(得分:1)

不能在x86核心上使用寄存器是不可能的。处理器没有指令,比如添加两个局部变量。其中一个加载到寄存器中。然后,您可以将寄存器中的值添加到变量中的值。并将结果存储回堆栈变量。

从这个序列中可以看出优化机会。就像将其存回,但将结果保存在寄存器中并稍后使用它,同时保存存储和负载。这是优化器的工作,它寻找方法来充分利用可用的寄存器。

答案 2 :(得分:0)

唯一可以确定的方法是检查JIT编译输出,但可以肯定地说使用寄存器是JIT编译器最蹩脚的优化之一。我相信大多数程序员都很难编写比JIT编译器更快的代码。

JIT编译器能够提供很多功能,并且可能使用适当的寄存器。像方法内联这样的东西鼓励使用寄存器,并且许多命令式程序代码可以在基于寄存器的体系结构上更简单地表达,因此只有JIT编译器才能使用寄存器。