关于传统解释器、编译器和 JIT 编译器/解释器的澄清

2023-12-11

我正在学习 Java,以下事情对我来说有点困惑。我的理解是:

  • Java编译器→ Java 编译器只是转换.java程序进入.class文件,这意味着将我们的源代码转换为字节码(它是虚拟机(JVM)的操作码列表,这使得 Java 平台无关)。

  • Java解释器→ 只是“解释”代码并且does not将其转换为本机机器代码。它将字节码的每条指令作为命令逐一执行并执行,无论同一指令出现多少次。这就是它速度慢的原因,Java 引入了 JIT 概念。

  • 即时编译器→ 这也会在执行时发挥作用。 JIT 编译器能够通过缓存已编译的代码块的结果来提高性能。翻译的– 与每次发生时简单地重新评估字节码中的每一行或操作数相比。

现在我有几个问题:

  1. 由于我的物理处理器只能理解本机机器代码,因此如何使用 JVM 的解释器执行 Java 程序?解释器不会将字节码转换为本机机器代码。除非有人将机器代码放入内存,否则物理处理器将无法执行它。

  2. 假设以某种方式,解释器还将字节码转换为本机机器代码,那么“带有缓存的代码执行块(JIT)和逐行执行(解释器)”是唯一区分 JIT 和解释器的东西吗?

  3. 如果在执行时,JIT 编译器将字节码翻译为本机机器代码(用于执行程序),那么为什么 Java 不使用提前编译呢?在生成依赖于 JVM 的字节码(这又使得 Java 平台无关)之后,我们可以将其带到我们想要执行它的目标机器上,然后将其转换为本机机器代码(创建一个.exe or .out文件与 C 编译的情况相同)。这是可能的,因为我们每个系统上都有一个特定的 JVM。这比使用 JIT 编译要快得多,因为编译和加载程序需要一些时间。通过仅分发字节码(在从字节码最终转换为机器码之前生成),它仍然是平台无关的。


免责声明:对所有这些持保留态度;这太简单化了。

1:你是对的,计算机本身不理解代码,这就是需要 JVM 本身的原因。让我们假装XY意思是“将顶部的两个元素添加到堆栈上并推送结果”。然后 JVM 将实现如下所示:

for(byte bytecode : codeToExecute) {
    if (bytecode == XX) {
        // ...do stuff...
    } else if (bytecode == XY) {
        int a = pop();
        int b = pop();
        push(a+b);
    } else if (bytecode == XZ) {
        // ...do stuff...
    } // ... and so on for each possible instruction ...
}

JVM 在计算机的本机机器代码中实现了每条单独的指令,并实质上查找每个字节码块以了解如何执行它。通过 JIT 代码,您可以通过省略这种解释(即查找每条指令应该如何处理)来实现大幅加速。那,还有优化。

2:JIT 并不真正运行代码;一切仍然在 JVM 内运行。基本上,JIT 在适当的时候将一大块字节码转换为机器代码。当 JVM 遇到它时,它会认为“哦嘿,这已经是机器代码了!太好了,现在我不必仔细检查它的每一个字节,因为 CPU 自己可以理解它!我只需把它泵过去,一切都会神奇地自行发挥作用!”。

3: Yes, 有可能的以这种方式预编译代码以避免解释和 JITting 的早期开销。然而,这样做,你会失去一些非常有价值的东西。您会看到,当 JVM 解释代码时,它还会保留所有内容的统计信息。然后,当它对代码进行 JIT 时,它知道不同部分的使用频率,从而可以在重要的地方对其进行优化,以牺牲罕见的内容为代价使常见的内容更快,从而获得整体性能增益。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于传统解释器、编译器和 JIT 编译器/解释器的澄清 的相关文章

随机推荐

  • 如何在java中将Wav文件分割成多个通道?

    我想编写一个Java程序来将wav文件分割成多个通道 输入将是一个 wav 文件 输出将是与通道数量一样多的 wav 文件 我可以用 Java 读取 wav 文件 但是如何将其拆分为多个通道 Wave 标头包含每个样本的样本大小 以位为单位
  • IIS 5 上的 ASP.NET 2.0 应用程序导致错误(aspnet_wp.exe (PID: XXXX) 意外停止。)

    在 Windows 2000 服务器 IIS 5 上托管 ASP NET 2 0 Web 应用程序后 我无法浏览该网站 浏览器上显示以下错误消息 并添加了三个事件日志条目 浏览器上的错误消息 服务器应用程序不可用 您尝试访问此 Web 服务
  • 如何高效创建数据透视表?

    我确实有一个像这样的数据框 import pandas as pd df pd DataFrame c0 list ABC c1 join list ab join list def join list s c2 list DEF c0 c
  • 使用 Img.at 获取无符号短值

    我目前正在为我的一个班级研究高动态范围算法 我在使用 OpenCV 时遇到问题 我有一个 16 位原始图像 我正在尝试使用显示该图像中的值 image at
  • Python 日期转换。如何将阿拉伯日期字符串转换为日期或日期时间对象python

    我必须将此日期转换为正常的日期字符串 对象 至 1994 年 4 月 11 日 我已经解决了这个问题 可能不是最好的 但它有效 coding utf8 import unicodedata s u def date conv unicode
  • HIVE 枢轴和总和

    我有一个表格 我试图弄清楚如何根据第二列中的值进行透视和求和 输入示例 own pet qty bob dog 2 bob dog 3 bob dog 1 bob cat 1 jon dog 1 jon cat 1 jon cat 1 jo
  • JPA 和 Bean 验证的唯一约束

    我想要一个 UniqueBean Validation 的约束 但这不是标准提供的 如果我使用 JPA UniqueConstraint我不会有独特的验证和错误报告机制 有没有办法定义 Unique作为 Bean Validation 约束
  • 如何使用AJAX上传大型CSV文件? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我们有一些包含大量记录的 CSV 文件 需要使用 Web 界面将此文件上传到 MySQL 数据库 这些文件是从不同的现场工作中收集的 并通过网络应用程序上传到服务器 Web 应用
  • Android原生webrtc:已连接后添加视频

    我已经使用 Google 代码库中的 libjingle so 和 PeerConnectionClient java 等在我的 Android 应用程序中成功运行 WebRTC 一段时间了 但是 我现在遇到一个问题 用户仅以音频方式启动连
  • 在 Python 2.7 中,如何覆盖单个函数的字符串表示形式?

    如何覆盖 Python 中单个函数的字符串表示形式 我尝试过的 gt gt gt def f pass gt gt gt f
  • 异步 ReadDirectoryChangesW 调用会阻止线程退出

    介绍 我正在编写一个小应用程序 用于监视某个目录中是否有新添加的文件 我想将监控代码放在一个单独的线程中 这样我就可以让主线程自由用于其他事情 并在需要时取消监控线程 相关信息 我在用读取目录更改W进行监控 我正在使用原始 WIN32 AP
  • pandas DataFrame 的反向地理编码

    我们有经度和纬度数据 需要将它们转换为纽约市的邮政编码 有什么方法可以处理 20 000 行的 python 包吗 uszipcode 包可以满足您的需求 from uszipcode import SearchEngine search
  • 动态显示资源/可绘制图像

    我正在尝试将不同的图像 jpg png 动态地放入ListView from res drawable 我从数据库中获取的图像的名称 图像本身位于res drawable folder 这是我已经拥有的 错误为 D 字符串图像名称 gt 数
  • Java 和 C# 中的 getBytes() 等效项

    我想将 Java 中的类转换为 C 大部分更改已经完成 但我对此部分不太确定 我想转换这行代码 byte arrayOfByte1 paramString getBytes 我已经尝试过这个 byte arrayOfByte1 BitCon
  • Angular ui-router 嵌套视图不会刷新 Angular 服务检索到的数据

    我有一个不平凡的 Angular SPA 它使用 ui router 来管理多个视图 其中许多视图同时可见 我需要模型在控制器之间可见 因此我编写了服务 允许控制器拉取已更新的模型数据的新副本 我提前为问题的长度表示歉意 但我会先说明问题
  • 在 Google Maps API v3 中仅打开一个 InfoWindow

    我只需在 Google 地图上打开一个 InfoWindow 在打开新的 InfoWindows 之前 我需要关闭所有其他 InfoWindows 有人可以告诉我该怎么做吗 您只需创建一个InfoWindow对象 保留对其的引用 并为所有标
  • 使用 MVC 和实体框架实施审核日志/更改历史记录

    我正在使用实体框架在我的 MVC 应用程序中构建更改历史记录 审核日志 所以具体在编辑方法中public ActionResult Edit ViewModel vm 我们找到我们正在尝试更新的对象 然后使用TryUpdateModel o
  • 如何让 Homebrew 恢复到之前的状态?

    我删除了一些 rb 文件 cassandra rb 电子邮件受保护 and 电子邮件受保护 从文件夹 usr local Homebrew Library Taps homebrew homebrew core Formula 来自 mac
  • Win32 中的 Sleep() 使程序无响应

    基本上就是标题所说的 我想当用户按下特定按钮时每 1 秒更新一次按钮包含的文本 我注意到 当程序没有焦点时 它可以正常工作并且文本刷新正确 但是当我将鼠标悬停在程序上或尝试单击它的菜单时 Windows 通知我该程序没有响应 并询问我是否我
  • 关于传统解释器、编译器和 JIT 编译器/解释器的澄清

    我正在学习 Java 以下事情对我来说有点困惑 我的理解是 Java编译器 Java 编译器只是转换 java程序进入 class文件 这意味着将我们的源代码转换为字节码 它是虚拟机 JVM 的操作码列表 这使得 Java 平台无关 Jav