【发布时间】:2015-08-14 13:16:34
【问题描述】:
我在这里有点困惑,JVM 是代表字节码(生成它)还是只是将编译后的 .class 文件(字节码)加载到内存中?!还是 JVM 只是以独立于平台的方式运行字节码的规范?!非常感谢。
【问题讨论】:
-
JDK 使用编译器(javac)生成字节码,JVM 运行它。
标签: java compiler-construction jvm javac bytecode
我在这里有点困惑,JVM 是代表字节码(生成它)还是只是将编译后的 .class 文件(字节码)加载到内存中?!还是 JVM 只是以独立于平台的方式运行字节码的规范?!非常感谢。
【问题讨论】:
标签: java compiler-construction jvm javac bytecode
Java 编译器 (javac) 将人类可读的代码转换为字节码,然后在 JVM 中运行。
来自oracle docs:
必须将程序转换为 Java VM 可以理解的形式 任何具有 Java VM 的计算机都可以解释和运行该程序。 编译 Java 程序意味着将程序员可读的文本放入 您的程序文件(也称为源代码)并将其转换为 字节码,它们是 Java 平台无关的指令 虚拟机。
【讨论】:
Sun JVM 是用 C 编写的,Oracle JVM 是用 C++ 编写的
Java 编译器 javac 将源代码转换为字节码。 JVM 内部的 JIT Compiler 和 Java Interpreter 将字节码转换为相应的机器码。
在 java 中,只有源代码(.java 文件)和字节码(.class 文件)可用。而且我们无法保存机器代码(.exe 文件),因为 .exe 文件只能在运行时形成,并在程序完全执行后立即从 RAM 中消失。
在我们的系统中,javac.exe(用于编译java源代码,例如:javac HelloWorld.java)和java.exe(用于通过JVM执行java字节码,例如:java HelloWorld)都被调用,它们在.仅 exe 格式(javac.exe 和 java.exe)。 所以 Java 编译器 javac 和 JVM 不是用 Java 编写的。如果它们是用 Java 编写的,那么它们可能有 javac.class 和 java.class 格式。
javac 属于 JDK 而不是 JVM。请记住,JVM 仅在运行时工作,即在源代码编译为字节码之后..但在此之前 javac 将源代码编译为字节码。 JVM通过JIT Compiler和Java Interpreter将字节码转换成对应的机器码。
对于不同的操作系统,Oracle 公司提供不同的 JDK 和 JRE 软件;所以JVM(JRE下)和javac Compiler(JDK下)都是Platform Dependent的。所以确认javac Compiler和JVM不是用Java写的。因为Java语言总是平台无关的。
【讨论】:
当您说javac file 时,Java 编译器(称为 javac)会将您的代码转换为中间形式(字节码)。它不会直接将其转换为特定于平台的机器语言,因此您可以将类文件(字节码)提供给任何平台上的任何人。这就是“一次编写,随处运行”的工作原理。它不是编译为特定于平台的机器语言,而是编译为通用字节码。
当您说java file 时,JVM 将获取字节码并将其“动态”(在运行时)分块转换为本地机器语言并执行它们。它使用 JIT 编译器执行此操作(这可能会造成混淆,因为这与 javac 不同)。顺便说一下,JDK 和 javac 是不一样的。 JDK 是一个 SDK(软件开发工具包),包含 Java 中的所有内容,包括 JVM 和 javac。
【讨论】:
JVM 运行字节码,Java compiler 生成它。
但是,应用程序可以在运行时generate the bytecode,但生成的字节码会再次由 JVM 执行。
【讨论】:
JVM,根据平台,将字节码转换为 m/c 码。 更准确地说,JVM 内部的 JIT(即时)编译器 可以做到这一点。 字节码由 javac.exe 生成。 而 java.exe 在 jvm.dll(在 windows 中)的帮助下将此字节码转换为 m/c 码。
【讨论】:
JDK(javac) 生成字节码(.class 文件)。现在这个字节码可以通过该平台的JVM在任何平台上运行。
【讨论】:
简而言之Java 虚拟机运行/解释/翻译字节码为本地机器码。它不会生成字节码。我们可以将 JVM 视为解释器。
以下内容将有助于理解以上内容,
字节码,也称为可移植代码或 p 码,是一种指令集形式,旨在由软件解释器高效执行。它介于人类可读的源代码和机器可读的机器代码之间。字节码程序可以通过解析和直接执行指令来执行,一次一个。这种字节码解释器非常便携。一些称为动态翻译器或即时 (JIT) 编译器的系统在运行时根据需要将字节码翻译成机器码。这使得虚拟机特定于硬件,但不会失去字节码的可移植性。参考this。
编译器是将用一种编程语言(源语言)编写的计算机代码转换成另一种编程语言(目标语言)的计算机软件。 Java 编译器是编程语言 Java 的编译器。 Java 编译器输出的最常见形式是包含平台无关 Java 字节码的 Java 类文件。
对于 Java,它有一个名为 Javac 的专用编译器。 Javac 将您的 Java 代码编译成字节码。然后我们就有了使用该字节码的JVM。
【讨论】:
enter image description here现在有一个内置工具,称为 Java Visual VM(JDK 版本 6 之后,更新 7),您可以在 bin 中找到它,该目录是 javac.exe 所在的目录。只需打开这个监控使用 JVM(分析器)的进程的工具。如果您在 Visual VM 打开时执行它,它将显示 javac、eclipse 等作为在 JVM 上运行的 Java 进程。
【讨论】:
Jdk 为带有 .java 扩展名的给定文件生成字节码。 JVM将字节码转换成机器语言,然后执行。
【讨论】: