【发布时间】:2012-01-19 22:25:35
【问题描述】:
据我了解,Java 编译器生成“字节码”,而不是“目标码”。首先,这是正确的吗?
另外,这正是我的书所说的,我想知道为什么这是正确的。字节码和目标码有什么区别?
【问题讨论】:
-
Java 编译器将源代码编译为字节码。我还没有听说过“目标代码”。
标签: java
据我了解,Java 编译器生成“字节码”,而不是“目标码”。首先,这是正确的吗?
另外,这正是我的书所说的,我想知道为什么这是正确的。字节码和目标码有什么区别?
【问题讨论】:
标签: java
字节码只是 Java 虚拟机的“目标码”。它不是 本机 代码(例如 x86)。老实说,这些天我很少听到“目标代码”这个词——用更具体的术语来谈论通常会更清楚。
【讨论】:
当你编译一个 java 程序时,它会进入字节码。当您运行生成的工件时,平台的 JVM 会运行(解释)字节码,将其转换为机器级指令。
【讨论】:
C 目标代码的形式只有编译它的操作系统才能解释。
C 代码 -> C 编译器(例如 gcc) -> 目标代码 -> os
C 编译器输出为其编写的操作系统的目标代码。如果您希望您的 C 代码在另一台机器上运行,您必须重新编译它。
如果不重新编译,在 Windows 上编译的 C 代码将无法在 linux 上运行。
Java代码->Java编译器(javac)->字节码->jvm
Java 编译器生成在其 JVM 上运行的字节码。操作系统的所有特性都被推送到 JVM 中,对 Java 代码隐藏。因此,只要您的操作系统有 JVM,您就可以在其上运行 Java 字节码而无需重新编译。在 Windows 上编译的 Java 代码可以在任何其他具有相同版本 JVM 的操作系统上运行。
【讨论】:
Java 独立于平台。当您编译 Java 源代码时,它会转换为字节码,而当应用程序运行时,客户端机器上的 JRE 会执行字节码。
【讨论】:
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 部分是平台相关的。
简短版:
这可能不是 100% 准确的,因为我也刚刚开始学习这些东西。但这是我迄今为止对这个概念的理解。我希望这会有所帮助。
【讨论】: