- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我找不到 JIT 和解释器之间的区别。
Jit 是解释器和编译器的中介。在运行时,它将字节码转换为机器码(JVM 或实际机器?)下一次,它从缓存中取出并运行我说的对吗?
解释器将直接执行字节码而不将其转换为机器码。对吗?
我们电脑中的真正处理器如何理解指令?
请消除我的疑虑。
最佳答案
第一件事:
对于 JVM,解释器和编译器都是(JVM 编译器,而不是像 javac 这样的源代码编译器)生成 native 代码(又名机器语言代码,用于底层物理 CPU,如 x86 ) 来自字节码。
那有什么区别:
不同之处在于它们如何生成 native 代码、优化程度以及优化成本。非正式地,解释器通过查找预定义的 JVM 指令到机器指令映射(见下图),几乎将每个字节码指令转换为相应的 native 指令。有趣的是,如果我们将一段字节码转换为机器码,则可以进一步加快执行速度 - 因为考虑整个逻辑部分通常会提供优化空间而不是转换(解释) 隔离的每一行(到机器指令)。将一段字节码转换为(可能是优化的)机器指令的这种行为称为编译(在当前上下文中)。当编译在运行时完成时,编译器称为 JIT 编译器。
关联与协调:
由于 Java 设计者追求(硬件和操作系统)可移植性,他们选择了解释器架构(而不是 c 风格的编译、组装和链接)。但是,为了获得更高的速度,还可以选择将编译器添加到 JVM。尽管如此,随着程序继续被解释(并在物理 CPU 中执行),JVM 会检测到“热点”并生成统计信息。因此,使用来自解释器的统计信息,这些部分成为编译的候选(优化的 native 代码)。它实际上是即时完成的(因此是 JIT 编译器),并且编译的机器指令随后会被使用(而不是被解释)。自然地,JVM 也会缓存这些编译后的代码。
注意事项:
这些几乎是基本概念。如果是 JVM 的实际实现者,它的方式有点不同,请不要感到惊讶。其他语言的虚拟机也是如此。
注意事项:
诸如“解释器在虚拟处理器中执行字节码”、“解释器直接执行字节码”等语句都是正确的,只要您了解最终必须在物理硬件中运行一组机器指令即可。
一些很好的引用资料: [虽然我没有进行广泛的搜索]
PS:我交替使用了以下术语 - “ native 代码”、“机器语言代码”、“机器指令”等。
关于java - JIT 与口译员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3718024/
在动态语言中,动态类型代码 JIT 是如何编译成机器码的?更具体地说:编译器是否会在某个时候推断类型?还是在这些情况下严格解释? 例如,如果我有类似下面的伪代码 def func(arg) i
X86 和 AMD64 是许多计算环境(桌面、服务器和 super 计算机)最重要的架构。显然,JIT 编译器应该同时支持它们才能获得认可。 直到最近,SPARC 架构才是编译器合乎逻辑的下一步,特别
既然有如此多的 JIT 实现,每个 JIT 都会发出 native 代码。那么为什么没有人制作像 JIT2EXE 这样的工具来将 native 代码保存为 native 可执行文件呢? 最佳答案 这个
JIT 编译器将字节码编译成机器码的概念我还是不太清楚。我想知道为什么它比非 JIT 解释器产生更快的代码。有人可以给我一个很好的例子来说明这个过程是如何完成的吗? 最佳答案 假设您有一个需要执行一百
Torchscript 提供了 torch.jit.trace 和 torch.jit.script 将 pytorch 代码从 Eager 模式转换为脚本模型。从文档中,我可以理解 torch.ji
好的,我已经阅读了一些关于 JIT 和非 JIT 启用解释器之间差异的讨论,以及为什么 JIT 通常会提高性能。 但是,我的问题是: 最终,不支持 JIT 的解释器是否必须像 JIT 编译器那样将字节
有没有办法在消除 JIT 开销的同时实现 JIT 性能?最好通过将类文件编译为 native 镜像。 我研究过GCJ,但即使对于简单的程序,GCJ输出的性能也比Java JIT差很多。 最佳答案 您可
我试图更好地理解 JIT 编译器在 volatile 变量值缓存方面如何为 java 工作。考虑这个问题中提出的例子: Infinite loop problem with while loop an
我的代码是这样的: @jit(nopython=True) def sum_fn(arg1, arg2, ...argn): ..... for i in xrange(len(arg
以下代码无效: def get_unique(arr): return jnp.unique(arr) get_unique = jit(get_unique) get_unique(jnp.
我需要能够调用一个 GPU 函数,该函数本身间接调用另一个 GPU 函数: from numba import cuda, jit import numpy as np # GPU function
我有一个关于使用 Continuum 的 Accelerate 和 numba 包中的 Python CUDA 库的问题。正在使用装饰器@jit与 target = gpu同 @cuda.jit ?
有人可以指出我的方向,这可能会让我明白为什么 JIT 会取消优化我的循环? (OSR)。看起来它被 C1 编译一次,然后多次取消优化(我可以看到数十或数百个以 开头的日志) 这是包含该重要循环的类:
我引用了Oracle的以下文档: http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/underst_jit
我需要在 C++ 中运行预训练的 pytorch 神经网络模型(在 python 中训练)来进行预测。 为此,我按照此处给出的有关如何在 C++ 中加载 pytorch 模型的说明进行操作:https
我正在使用 numbas @jit 装饰器在 python 中添加两个 numpy 数组。如果我使用 @jit 与 python 相比,性能是如此之高。 然而,即使我传入 @numba.jit(nop
我是Python新手。 我编写了一些代码尝试将图片混合为新图片。 我完成了,但是浪费了太多时间。 所以我尝试使用 Numba 让代码在我的 GPU 上运行。但遇到一些警告和错误 os Ubuntu 1
我正在将我的网站从安装在共享网络托管帐户(在 DreamHost)上的 PHP v.5 转换为在 PHP 7.3.11 上运行。转换后,我开始注意到偶尔会收到以下警告: Warning: preg_m
在 Stack Overflow 上向所有编译器设计者致以问候。 我目前正在从事一个项目,该项目的重点是开发一种用于高性能计算的新脚本语言。源代码首先被编译成字节码表示。字节码然后由运行时加载,它对其
我相信 Apple 已禁止在 ARM64 架构上同时写入和执行内存,请参阅: 参见 mmap() RWX page on MacOS (ARM64 architecture)? 这使得像 jonesf
我是一名优秀的程序员,十分优秀!