【问题标题】:Does Java produce object code or byte code?Java 生成目标代码还是字节代码?
【发布时间】:2012-01-19 22:25:35
【问题描述】:

据我了解,Java 编译器生成“字节码”,而不是“目标码”。首先,这是正确的吗?

另外,这正是我的书所说的,我想知道为什么这是正确的。字节码和目标码有什么区别?

【问题讨论】:

  • Java 编译器将源代码编译为字节码。我还没有听说过“目标代码”。

标签: java


【解决方案1】:

字节码只是 Java 虚拟机的“目标码”。它不是 本机 代码(例如 x86)。老实说,这些天我很少听到“目标代码”这个词——用更具体的术语来谈论通常会更清楚。

【讨论】:

  • @Bhaxy:不,我没有这么说。 Wikipedia 将其描述为“计算机编译器产生的东西”。这是一个有点模糊的术语,但我想说它通常是“程序的非文本表示,针对机器而不是人类”。 “机器”是 JVM,而不是您正在运行的计算机的本机架构。
  • @Bhaxy 是的,你明白了 :)
【解决方案2】:

当你编译一个 java 程序时,它会进入字节码。当您运行生成的工件时,平台的 JVM 会运行(解释)字节码,将其转换为机器级指令。

【讨论】:

    【解决方案3】:

    C 目标代码的形式只有编译它的操作系统才能解释。

    C 代码 -> C 编译器(例如 gcc) -> 目标代码 -> os

    C 编译器输出为其编写的操作系统的目标代码。如果您希望您的 C 代码在另一台机器上运行,您必须重新编译它。
    如果不重新编译,在 Windows 上编译的 C 代码将无法在 linux 上运行。

    Java代码->Java编译器(javac)->字节码->jvm

    Java 编译器生成在其 JVM 上运行的字节码。操作系统的所有特性都被推送到 JVM 中,对 Java 代码隐藏。因此,只要您的操作系统有 JVM,您就可以在其上运行 Java 字节码而无需重新编译。在 Windows 上编译的 Java 代码可以在任何其他具有相同版本 JVM 的操作系统上运行。

    另请参阅difference between object code and byte code

    【讨论】:

      【解决方案4】:

      Java 独立于平台。当您编译 Java 源代码时,它会转换为字节码,而当应用程序运行时,客户端机器上的 JRE 会执行字节码。

      【讨论】:

        【解决方案5】:

        Java 编译器 (javac.exe) 将 Java 源 (.java) 文件作为输入并输出 Java 字节码 (.class) 文件(如果您的代码编译成功)。然后执行 Java 启动器 (java.exe) 并将其指向您的字节码。然后由 Java 虚拟机 (JVM) 完成剩下的代码,并将您的字节码转换为机器(或本机)代码。

        您可以将其视为更接近机器代码的目标代码,而将字节码视为远离机器代码的代码。此外,字节码是可移植的(这是 Java 语言的一大优点),而机器码需要通过手动过程“移植”(即针对不同的目标平台或架构重新编译)。

        目标代码“几乎”是机器代码,它在中间。它就像生成的机器代码的一部分。由于 Java 语言的可移植性,您不能让编译器将您的源代码直接翻译成机器代码。因为对于不同的平台和架构,机器码需要不同。如果有人在 Windows 上运行你的字节码,JVM 会将你的字节码翻译成一种机器码。如果有人在 Mac OS X 上运行你的字节码,JVM 会将你的字节码翻译成另一种机器码。

        您可以将 JVM 视为字节码的解释器。虽然,从技术上讲,它被称为 JIT(及时)编译。 JVM 是 JRE(Java 运行时环境)的一部分,虽然 Java 程序在很大程度上独立于平台(任何运行 JVM 的系统也可以运行 Java 程序),但 JRE 的 JVM 部分是平台相关的。

        简短版:

        • Java 编译器生成字节码(编译到一半,独立于平台,还不能运行)。
        • Java 虚拟机产生机器码。
        • 目标代码是生成的机器代码的一部分。
        • 字节码在 JIT 时间成为目标代码。
        • 目标代码变成机器代码(编译剩下的路, 取决于平台,可以运行)。

        这可能不是 100% 准确的,因为我也刚刚开始学习这些东西。但这是我迄今为止对这个概念的理解。我希望这会有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-20
          • 1970-01-01
          • 1970-01-01
          • 2010-11-08
          • 1970-01-01
          • 1970-01-01
          • 2011-02-27
          • 1970-01-01
          相关资源
          最近更新 更多