202

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

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

4

10 回答 10

254

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

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

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

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

  • 提前编译并作为本机代码执行(类似于大多数 C++ 编译器)
  • 即时编译并执行
  • 解释的
  • 由支持的处理器直接执行(字节码是某些 CPU 的本机指令集)
于 2009-08-25T04:41:14.470 回答
120

在此处输入图像描述

用Java编写的代码是:

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

java什么时候解释字节码,什么时候编译它?应用程序代码最初被解释,但 JVM 监视哪些字节码序列经常被执行,并将它们转换为机器代码以便在硬件上直接执行。对于只执行几次的字节码,这样可以节省编译时间,减少初始延迟;对于频繁执行的字节码,JIT 编译用于高速运行,经过一个缓慢解释的初始阶段。此外,由于程序花费大部分时间执行其少数代码,因此减少的编译时间是显着的。最后,在最初的代码解释过程中,可以在编译前收集执行统计信息,这有助于进行更好的优化。

于 2016-04-04T03:25:59.033 回答
71

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

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

如今,部分即时编译用于许多曾经被认为是“解释”的语言,例如 JavaScript。

于 2009-08-25T06:46:56.570 回答
54

Java 被编译成字节码,然后进入 Java VM 进行解释。

于 2009-08-25T04:39:45.657 回答
16

Java 是一种编译型编程语言,但它不是直接编译成可执行的机器代码,而是编译成一种称为 JVM 字节码的中间二进制形式。然后编译和/或解释字节码以运行程序。

于 2009-08-25T04:40:22.753 回答
14

两者兼而有之。首先将 java 编译(有些人更愿意说“翻译”)为字节码,然后根据 JIT 的情绪对其进行编译或解释。

于 2009-08-25T04:40:33.597 回答
8

Java 既做编译又做解释,

在 Java 中,程序不会被编译成可执行文件;它们被编译成字节码(如前所述),然后 JVM(Java 虚拟机)在运行时解释/执行。当我们使用 javac 编译器时,Java 源代码被编译成字节码。字节码以文件扩展名 .class 保存在磁盘上

当程序要运行时,字节码被转换,字节码可以被转换,使用即时(JIT)编译器。结果是机器代码,然后将其馈送到内存并执行。

Javac是将Java 代码编译成字节码的Java 编译器。JVM是Java虚拟机,它运行/解释/将字节码翻译成本机机器码。在 Java 中,虽然它被认为是一种解释型语言,但当字节码在 JVM 中时,它可能会使用 JIT(即时)编译。JIT 编译器读取许多部分(或完整,很少)的字节码,并将它们动态编译成机器代码,以便程序可以更快地运行,然后缓存并在以后重复使用,而无需重新编译。所以 JIT 编译结合了编译代码的速度和解释的灵活性。

解释语言是一种编程语言,它的大多数实现直接和自由地执行指令,而无需事先将程序编译成机器语言指令。解释器直接执行程序,将每个语句翻译成一个或多个已经编译成机器代码的子程序序列。

编译语言是一种编程语言,其实现通常是编译器(从源代码生成机器代码的翻译器),而不是解释器(源代码的逐步执行器,其中不发生预运行时翻译)

在像 Java 这样的现代编程语言实现中,平台越来越流行同时提供这两种选项。

于 2018-04-04T20:24:48.943 回答
-1

1-Java是一种编译语言。2- 编译器是 Java 开发工具包 JDK 的一部分。3- Java 中的编译器首先检查源代码中的任何语法错误,然后如果您的源代码没有错误,则编译器开始将其转换为字节码。4- Java 虚拟机 JVM 获取字节码并将其转换为在硬件上运行的可执行机器码,并将程序输出提供给用户。5-有关更多说明,请查看此Java 程序的工作原理

请注意:大多数解释语言都是脚本语言,如 Javascript

于 2021-11-13T22:19:42.433 回答
-3

Java 是一种针对称为Java 虚拟机的平台的字节编译语言,它是基于堆栈的,并且在许多平台上都有一些非常快速的实现。

于 2009-08-25T04:40:32.693 回答
-3

引用自:https ://blogs.oracle.com/ask-arun/entry/run_your_java_applications_faster

应用程序开发人员可以在当今市场上可用的任何各种操作系统上开发应用程序代码。Java 语言在这个阶段与操作系统无关。Java 应用程序开发人员编写的出色源代码现在被编译为 Java 字节码,在 Java 术语中称为客户端编译。这种对 Java 字节码的编译使 Java 开发人员能够“编写一次”。Java Byte 代码可以在任何兼容的操作系统和服务器上运行,因此使源代码与操作系统/服务器无关。发布 Java Byte 代码创建后,Java 应用程序与底层 OS/Server 之间的交互更加亲密。旅程继续——企业应用程序框架在称为 Java 虚拟机 (JVM) 或 Java 运行时环境 (JRE) 的运行时环境中执行这些 Java 字节代码。JVM 与底层操作系统和硬件有着密切的联系,因为它利用了操作系统和服务器提供的资源。Java 字节代码现在被编译为特定于平台的机器语言可执行代码。这称为服务器端编译。

所以我会说Java绝对是一种编译语言。

于 2016-04-03T12:56:03.053 回答