Java 编译与解释之间的技术混乱

Java 编译与解释之间的技术混乱,java,compilation,interpretation,Java,Compilation,Interpretation,我读过很多关于“解释”和“编译”的定义和陈述。但我还是很困惑 从技术上讲,解释和暗箱操作的区别到底是什么?让我详细说明一下(请纠正我可能有的任何错误概念): 在java中,源代码被“编译”成字节码,然后字节码被“解释”和/或“及时编译”成机器代码。但是,即时编译和解释之间有什么区别呢?我的意思是,最终,据我猜测,主机的CPU将只运行机器代码。因此,在解释过程中,指令也被转换为CPU可以理解的机器代码。那么,我们在即时编译和解释之间的界限在哪里呢 这是我的构想。这可能是完全错误的。那样的话,请原谅

我读过很多关于“解释”和“编译”的定义和陈述。但我还是很困惑

从技术上讲,解释和暗箱操作的区别到底是什么?让我详细说明一下(请纠正我可能有的任何错误概念):

在java中,源代码被“编译”成字节码,然后字节码被“解释”和/或“及时编译”成机器代码。但是,即时编译和解释之间有什么区别呢?我的意思是,最终,据我猜测,主机的CPU将只运行机器代码。因此,在解释过程中,指令也被转换为CPU可以理解的机器代码。那么,我们在即时编译和解释之间的界限在哪里呢

这是我的构想。这可能是完全错误的。那样的话,请原谅我的愚蠢并纠正我


谢谢。

你说得对,最终所有东西都必须转换成机器代码。基本的区别在于,对于解释器,每次代码运行时都会发生这种转换,而编译器会提前进行这种转换,之后不需要编译器来运行程序

即时编译是两者的结合,其中运行程序仍然需要JIT编译器,代码在运行时编译


编译需要时间,但当同一段代码运行多次(例如在循环中)时,编译是有利的。Java HotSpot VM进一步采用了这种方法,首先直接解释字节码,然后在运行一定次数后JIT编译一段代码。

解释器逐行解释代码,并在运行时决定机器代码

编译器按块使用代码,并在编译时决定机器代码


JIT编译器是一种混合方法,在这种方法中,代码在运行时生成(但可以缓存以提高性能),但在块中使用。

解释环境包含解析后立即执行的指令,其中解析和执行都由解释器完成。这意味着运行代码的机器必须有解释器才能运行程序

编译器将把指令解析成机器代码并存储起来,以备以后执行。然而,Java是字节编译的,这意味着这个过程将指令转换成字节码,然后由解释器使用

编译代码时,硬件可以直接理解生成的工件。基本上,它是一个直接发送到CPU的机器代码。这也意味着根据给定CPU架构编译的工件不会在另一个CPU架构上运行。其优点是立即启动,性能优异

在解释环境中,要么根本没有编译,要么这一步骤的结果是一个中间代码。此代码是两个直接发送到处理单元的摘要。相反,需要一个单独的层(虚拟机、解释器)来读取这个工件并在一些沙箱环境中执行它。这种方法的优点是可移植性——中间代码可以在任何本机解释器可用的平台上运行。不幸的是,性能几乎总是更差


Java中的JIT是一种混合技术。首先解释字节码,每个字节码指令由解释器执行。然而,在某些时间点(在某些条件下),字节码被转换成机器码并直接发送到CPU以提高性能。这种方法带来了两个方面的好处——中间代码的可移植性和本机代码的速度。此外,JIT更了解代码的运行时行为(给定循环平均被调用多少次?这个方法真的是虚拟的吗?),因此机器代码可以比普通编译器生成的更快(!)

1.坦率地说,java同时拥有编译器和解释器的想法是一个神话,它的行为被标记为编译和解释器

2。Java编译器将人类可读的代码编译成字节码。然后,JIT(即时编译器)在运行时将其转换为机器级可执行代码

3.在运行时,JIT识别代码中运行时密集的部分,然后将其转换为机器级可执行代码,这部分代码被称为
热点
,这就是为什么JIT被称为热点编译器的原因

4.JIT使用虚拟内存表(V-Table),,它是指向类中方法的指针然后,热点代码被转换为其机器级别的可执行代码,其地址存储在此处,当再次调用此部件时,其地址将直接由该存储地址获取
在运行时继续编译少量代码的JIT行为被假定为
解释行为
存储此代码以供以后使用的JIT行为被假定为
编译


5。虚拟内存表还有一个存储字节码地址的表,如果需要可以使用。

编译只需提供字节码即可。使用字节码,您可以将编译后的项目从具有不同操作系统的不同PC机上移动,Java代码将在所有这些机器中进行类似的解释。这就是为什么你可以说Java代码是可移植的。@NominSim:谢谢,我稍微编辑了一下我的答案。我知道JIT不会编译调用不够频繁的代码。还有其他情况吗?我对确切的情况没有把握,