JVM 生成字节码还是 运行 字节码?

Does JVM generate bytecode or run bytecode?

我在这里有点困惑,JVM 代表字节码(生成它)还是它只是将编译的 .class 文件(字节码)加载到内存中?!或者 JVM 只是 运行 以平台无关的方式对字节码的规范?!非常感谢。

JVM 运行字节码,Java compiler 生成它。

但是,应用程序可以generate the bytecode,同时它们运行,但是生成的字节码再次由JVM 执行。

Java 编译器 (javac) 将您的人类可读代码转换为字节码,然后 运行 在 JVM 中。

来自oracle docs

A program has to be converted to a form the Java VM can understand so any computer with a Java VM can interpret and run the program. Compiling a Java program means taking the programmer-readable text in your program file (also called source code) and converting it to bytecodes, which are platform-independent instructions for the Java VM.

JVM,根据平台,将字节码转换成m/c码。 更准确地说,JVM 内部的 JIT(即时)编译器 执行此操作。 字节码由javac.exe生成。 并且 java.exe 借助 jvm.dll(在 windows 中)将此字节码转换为 m/c 代码。

JDK(javac) 生成字节码(.class 文件)。现在这个字节码可以在任何平台上由该平台的 JVM 运行

当您说 javac file 时,Java 编译器(称为 javac)会将您的代码转换为中间形式(字节码)。它不会直接将其转换为特定于平台的机器语言,因此您可以将 class 文件(字节码)提供给任何平台上的任何人。这就是 "Write once, Run anywhere" 的工作原理。它不是编译为平台特定的机器语言,而是编译为通用字节码。

当你说 java file 时,JVM 将获取字节码并将其转换为块 "on the fly" 中的本地机器语言(在运行时)并执行它们。它使用 JIT 编译器(这可能会引起混淆,因为这与 javac 不同)来执行此操作。顺便说一下,JDK 与 javac 不同。 JDK 是一个 SDK(软件开发工具包),包含 Java 中的所有内容,包括 JVM 和 javac。

简而言之Java 虚拟机运行/解释/翻译字节码为本机机器码。它不生成字节码。 我们可以将 JVM 视为解释器。

下面将有助于理解上面的内容,

字节码,也称为可移植代码或p-code,是一种指令集形式,旨在让软件解释器高效执行。它介于人类可读的源代码和机器可读的机器代码之间。字节码程序可以通过一次一个地解析和直接执行指令来执行。这种字节码解释器非常便携。一些称为动态翻译器或 just-in-time (JIT) 编译器的系统在运行时根据需要将字节码翻译成机器码。这使得虚拟机hardware-specific,但不失去字节码的可移植性。参考 this.

编译器是一种计算机软件,可将以一种编程语言(源语言)编写的计算机代码转换为另一种编程语言(目标语言)。 Java 编译器是编程语言 Java 的编译器。 Java 编译器的 输出的最常见形式是 Java class 包含 platform-neutral Java 字节码的文件

对于Java,它有一个名为Javac 的专用编译器。 Javac 将您的 Java 代码编译成字节码 。然后我们有 JVM,它使用该字节码

  1. JVM = JIT 编译器 + Java 解释器 + 垃圾收集器
  2. JRE = JVM + 库 类
  3. JDK = JRE + 开发工具

Sun JVM 是用 C 编写的,Oracle JVM 是用 C++ 编写的

Java 编译器javac 将源代码转换成字节码。 JVM 内部的 JIT 编译器和 Java 解释器将字节码转换为相应的机器码。

在java中,只有源代码(.java 文件)和字节码(.class 文件)可用。而且我们不能保存机器代码(.exe 文件),因为 .exe 文件只能在 运行 时间形成,并在程序完全执行后立即从 RAM 中消失。

在我们的系统中,javac.exe(用于编译 java 源代码,例如:javac HelloWorld.java)和 java.exe(用于执行 java bytecode by JVM, eg: java HelloWorld) 被调用,仅在 .exe 格式中可用(javac.exe 和 java.exe)。 所以 Java 编译器 javac 和 JVM 不是用 Java.If 编写的,它们是用 Java 编写的,那么它们可能在 javac.class 和 [=37] 中可用=]格式。

javac 属于 JDK 而不是 JVM.Remember,JVM 仅在 运行 期间工作意味着在将源代码编译为字节代码之后..但是在此之前 javac 将源代码编译成字节码。 JVM 通过 JIT Compiler 和 Java Interpreter.

将字节码转换成相应的机器码

对于不同的操作系统,Oracle Corporation 提供了不同的 JDK 和 JRE 软件;所以JVM(在JRE下)和javac编译器(在JDK下)都是平台Dependent.So确认javac编译器和JVM没有写在Java.Because Java 语言始终与平台无关。

enter image description here现在有一个名为 Java Visual VM 的内置工具(在 JDK 版本 6 之后,更新 7),您可以在 bin 中找到它,javac.exe 存在。只需打开此工具即可监视使用 JVM(分析器)的进程。如果您在 Visual VM 打开时执行它,它将在 JVM 上将 javac、eclipse 等显示为 Java 进程 运行。

Jdk 为扩展名为 .java 的给定文件生成字节码。 JVM将字节码转换成机器语言然后执行