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

标签 jvm clr jit cpu-registers

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

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

最佳答案

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

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

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

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

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

  • 字节码中有一个寄存器的类比——每个堆栈帧都有一些额外的专用空间来存储临时值,
  • 没有像 x86 或 MIPS 中那样对寄存器的强大支持,因为 JVM 代码必须易于在多个硬件上执行,并且在多个寄存器中进行硬编码可能会使事情复杂化。

  • 希望这可以帮助!

    关于jvm - JVM 或 CLR 是否使用寄存器来运行 JIT 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11092346/

    相关文章:

    asp.net - 保护 IL 免受逆向工程影响

    .net - 从 native c++ 代码将托管 dll 加载到 AppDomain

    java - 如何在 jvm 中创建超过 Integer.MAX_VALUE 的对象?

    java - 为什么我的网络浏览器版本的 java 与命令行版本不同

    c# - 哪些方法在内部调用 GetHashCode?

    c# - 字节码大小对 JIT/内联/性能有多大影响?

    c# - 如何更改我要使用的 JIT 类型

    jvm - 'a' 在 'aload' 或 'areturn' 等 JVM 指令中是什么意思?

    java - JVM内存: Why memory on task manager difference with JProbe (or JConsole tool)