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

woo*_*ngs 4 clr jit jvm cpu-registers

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

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

tem*_*def 5

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

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

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

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

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

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

希望这可以帮助!