gpt4 book ai didi

jvm - 不要同时启用 JIT 和非 JIT 的解释器最终生成机器代码

转载 作者:行者123 更新时间:2023-12-04 11:28:46 25 4
gpt4 key购买 nike

好的,我已经阅读了一些关于 JIT 和非 JIT 启用解释器之间差异的讨论,以及为什么 JIT 通常会提高性能。

但是,我的问题是:

最终,不支持 JIT 的解释器是否必须像 JIT 编译器那样将字节码(逐行)转换为要执行的机器/ native 代码?我看过帖子和教科书说它有,也有帖子说它没有。后一个论点是解释器/JVM 直接执行此字节码,不与机器/ native 代码交互。

如果非 JIT 解释器确实将每一行转换为机器代码,那么 JIT 的主要好处似乎是......

  • 缓存字节码的所有(正常 JIT)或经常遇到的(热点/自适应优化)部分的智能,以便每次都不需要机器代码编译步骤。
  • 任何优化 JIT 编译器都可以将字节码转换为机器码。

  • 那是准确的吗?通过非 JIT 和启用 JIT 的解释器将字节码转换为机器代码之间似乎没有什么区别(除了可能的优化,或者 JITting 块与逐行可能)。

    提前致谢。

    最佳答案

    非 JIT 解释器不会将字节码转换为机器码。你可以想象一个非 JIT 字节码解释器的工作原理是这样的(我将使用类似 Java 的伪代码):

    int[] bytecodes = { ... };
    int ip = 0; // instruction pointer
    while(true) {
    int code = bytecodes[ip];
    switch(code) {
    case 0;
    // do something
    ip += 1; break;
    case 1:
    // do something else
    ip += 1; break;
    // and so on...
    }
    }

    因此,对于执行的每个字节码,解释器必须检索代码,打开其值以决定要做什么,并在进入下一次迭代之前增加其“指令指针”。

    使用 JIT,所有开销都将减少到零。它只需要适当的 switch 分支的内容(表示“//do something”的部分),将它们串在内存中,然后跳转到第一个分支的开头。不需要软件“指令指针”——只需要 CPU 的硬件指令指针。也没有从内存中检索字节码并打开它们的值。

    编写虚拟机并不难(如果它不需要非常高的性能),并且可以是一个有趣的练习。我曾经为一个嵌入式项目做过一次,其中程序代码必须非常紧凑。

    关于jvm - 不要同时启用 JIT 和非 JIT 的解释器最终生成机器代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8976078/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com