问题

在过去,我使用C作为编程语言。我知道用C编写的代码经过编译过程,直到它成为目标代码"机器代码"。

我想知道Java在这方面是如何工作的。用户如何编写由计算机运行的Java代码?


#1 热门回答(156 赞)

Java实现通常使用两步编译过程。 Java源代码由Java编译器编译为tobytecode。字节码由Java虚拟机(JVM)执行。现代JVM使用称为Just-in-Time (JIT) compilation的技术将字节码编译为硬件CPU在运行时即时理解的本机指令。

JVM的某些实现可能会选择解释字节码而不是JIT将其编译为机器代码,并直接运行它。虽然这仍然被认为是"解释器",但它与读取和执行高级源代码的解释器完全不同(即在这种情况下,Java源代码不直接解释,字节码,Java编译器的输出,是。)

从技术上讲,可以提前将Java编译为本机代码并运行生成的二进制文件。也可以直接解释Java代码。

总而言之,根据执行环境,字节码可以是:

  • 提前编译并作为本机代码执行(类似于大多数C编译器)
  • 及时编译并执行
  • 解释
  • 由支持的处理器直接执行(字节码是某些CPU的本机指令集)

#2 热门回答(47 赞)

术语"解释语言"或"编译语言"没有意义,因为任何编程语言都可以被解释和/或编译。

至于Java的现有实现,大多数涉及到字节码的编译步骤,因此它们涉及编译。运行时也可以动态加载字节码,因此总是需要某种形式的字节码解释器。该解释器可能会或可能不会在内部使用编译到本机代码。

目前,部分即时编译用于许多曾被认为是"解释"的语言,例如Javascript。


#3 热门回答(41 赞)

[1]下面的图片解释了一切......

enter image description here

用Java编写的代码是:

  • 首先通过名为javac的程序编译为字节码,如上图左侧所示;
  • 然后,如上图的右侧部分所示,[2]另一个名为java的程序启动Java运行时环境,它可以使用Java Interpreter / JIT编译器编译和/或解释字节码。

java何时解释字节码以及何时编译它?[3]应用程序代码最初被解释,但JVM监视频繁执行的字节码序列,并将它们转换为机器代码,以便在硬件上直接执行。对于仅执行几次的字节码,这节省了编译时间并减少了初始延迟;对于频繁执行的字节码,在慢速解释的初始阶段之后,JIT编译用于高速运行。此外,由于程序花费大部分时间执行其少量代码,因此缩短的编译时间非常重要。最后,在初始代码解释期间,可以在编译之前收集执行统计信息,这有助于执行更好的优化。
单击答案中的上标数字以供参考。


原文链接