Java中的.class文件有什么用途?

8
我想了解在Java中.class文件的工作原理和目的。我在网上找到了一些信息,但是得到的解释不够满意。
当我们运行编译器时,会生成.bytecode的.class文件。这个文件是可读的吗?如果不能读取,那么我们需要用解释器来成功运行程序吗?
另外,既然.class文件相当于我们的.java程序,为什么不能直接通过使用VM运行.class文件来运行Java程序而需要同时拥有.java文件呢?
5个回答

7

JVM的定义是虚拟机,即模拟真实机器的软件机器。像真实机器一样,它有一个指令集字节码),虚拟计算机架构和执行模型。它能够运行使用此虚拟指令集编写的代码,就像真实机器可以运行机器代码一样。

因此,类文件包含虚拟指令集中的指令,并且JVM能够运行它们。为此,虚拟机器可以解释代码本身,也可以将其编译为当前正在运行的硬件架构。有些虚拟机同时做两者,而有些只做其中之一(例如,.net运行库在第一次调用方法时编译一次)。

例如,Java HotSpot最初解释字节码,并逐渐将代码编译为机器码。这称为自适应优化。有些虚拟机始终直接编译为机器码。

因此,您可以看到有两种不同的“编译概念”。其中一种是将Java代码转换为JVM字节码(从.java到.class)。当程序运行时,会发生第二个编译阶段,字节码可以被解释或编译为实际的机器码。这是由JVM中的即时编译器完成的。
因此,正如您所看到的,计算机无法直接运行Java程序,因为该程序不是用计算机能理解的语言编写的。它是用所有JVM实现都能理解的通用语言编写的。并且有许多操作系统和硬件架构的JVM实现。这些JVM将程序翻译成这种通用语言(字节码)以适应任何特定的硬件(机器码)。这就是虚拟机的美妙之处。

4
  1. .class文件是机器可读的。读取它的机器是Java虚拟机,它会解释并将其编译为本地代码(可由您的计算机执行)。

  2. 运行Java代码并不需要.java文件,只需要.class文件即可。


0

编译器与解释器:

  1. 编译器将整个程序作为输入
    解释器将单个指令作为输入。

  2. 生成中间目标代码
    不生成中间目标代码

  3. 条件控制语句执行速度更快
    条件控制语句执行速度较慢

  4. 内存需求:更多(因为生成了目标代码)
    内存需求:较少

  5. 程序无需每次编译
    每次高级程序转换为低级程序

  6. 检查完整个程序后显示错误
    对每个指令进行解释时显示错误(如果有)

  7. 例如:C编译器
    例如:BASIC


0

它是机器可读的,但不能在裸机上执行。它通过Java虚拟机运行,这是一个具有非常高性能的解释器和即时编译器。只使用类文件的字节码让解释器仅使用字节码有很好的理由。简要来说,它们是:

  1. 更容易构建解释器,因为字节码更接近可以通过JIT转换为本机机器代码的指令。
  2. 更容易解决依赖关系,因为Java编译器通过import命令对它们进行了一些语法糖处理。

0

Java字节码(.class文件)不能直接执行。它是一种中间语言,由底层的Java虚拟机解释。当然,一些优化可以发生(例如即时编译)。


要运行Java程序,您只需要字节码文件,.java文件包含源代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接