java - Java 中 .class 文件的用途

标签 java compiler-construction jvm interpreter

我正在尝试了解 .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/

相关文章:

java - Spring MVC request mapping not found 404页面未找到

c++ - 使用模板函数和普通函数生成的代码之间的区别

Eclipse 垫 : remote jvm monitoring

c - 默认情况下是否优化了 gcc 编译的程序?

java - Hadoop jvm 进程挂起,没有任何错误消息,

Android 单元测试不适用于 Android 库项目

java - 如何使用 Java 获取 Ram 大小和硬盘大小?

java - 如何杀死所有 glassfish 实例

java - if-else 石头剪刀布游戏

java - ASM Tree API 插入 InsnList 会出现 StackOverflowError?