我正在尝试了解 .class 文件在 Java 中的工作方式以及它们的用途。我在网上找到了一些信息,但得到的解释并不令人满意。
一旦我们运行编译器,我们就会得到 .class 文件,它是字节码。这个机器可读吗?如果不是,这就是为什么我们需要程序成功运行的解释器?
此外,由于 .class 文件等同于我们的 .java 程序,为什么有人不能通过使用 VM 运行 .class 文件来直接运行 java 程序,他们需要将 .java 文件作为出色地?
最佳答案
根据定义,JVM 是一个 virtual machine ,那是模拟真实机器功能的软件机器。像真正的机器一样,它有一个 instruction set (bytecodes),一个虚拟计算机架构和一个执行模型。它能够运行使用此虚拟指令集编写的代码,就像真机可以运行机器代码一样。
因此,类文件包含虚拟指令集中的指令,并且能够运行它们。就此而言,虚拟机可以自行解释代码或针对当前运行的硬件架构编译代码。有些两者都做,有些只做其中一个(例如,.net 运行时在第一次调用该方法时编译一次)。
例如,Java HotSpot 最初解释字节码,然后逐步将代码编译成机器码。这叫做 adaptive optimization .一些虚拟机总是直接编译为机器代码。
因此,您可以看到有两种不同的“编译概念”。一种是将 Java 代码转换为 JVM 字节码(从 .java 到 .class)。第二个编译阶段发生在程序运行时,字节码可能被解释或编译为实际的机器代码。这是由 just-in-time compiler 完成的,在 JVM 中。
因此,如您所见,计算机无法直接运行 Java 程序,因为该程序不是用计算机能够理解的语言编写的。它是用所有 JVM 实现都能理解的通用语言编写的。许多操作系统和硬件架构都有该 JVM 的实现。这些 JVM 将这种通用语言(字节码)中的程序翻译成任何特定的硬件(机器代码)。这就是虚拟机的美妙之处。
关于java - Java 中 .class 文件的用途,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22733132/