Java生成目标代码还是字节码?

8

据我所知,Java编译器生成的是“字节码”,而不是“目标代码”。首先,这个说法正确吗?

此外,我的书上也是这么说的,我想知道为什么这是正确的。字节码和目标代码有什么区别呢?


5
Java 编译器将源代码编译为字节码。我还没有听说过“目标代码”。 - Martijn Courteaux
5个回答

19

字节码只是Java虚拟机的“目标代码”。它不是本地代码(例如x86)。老实说,我很少听到“目标代码”这个术语 - 用更具体的术语交流通常更清楚明了。


5
@Bhaxy:不,我没说那个。维基百科把它描述为“编译器生成的内容”。这是一个有些模糊的术语,但我认为它通常指“程序的非文本表示形式,针对的是机器而不是人类”。这里的“机器”指的是JVM而不是您运行程序的计算机的本地架构。 - Jon Skeet
@Bhaxy 是的,你懂了 :) - Gayan Weerakutti

2
当您编译Java程序时,它将转换为字节码。当您运行生成的构件时,平台的JVM将运行(解释)字节码,将其转换为机器级指令。

1

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

C代码 -> C编译器(例如gcc) -> 目标代码 -> 操作系统

C编译器会为其编写的操作系统输出目标代码。如果想要在其他机器上运行C代码,就必须重新编译它。
在Windows上编译的C代码在Linux上运行时需要重新编译。

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

Java编译器输出的字节码可以在其JVM上运行。操作系统的所有特殊性都被推入JVM中,从Java代码中隐藏。因此,只要操作系统有JVM,就可以在其上运行Java字节码而无需重新编译。在Windows上编译的Java代码可以在任何安装了相同版本JVM的其他操作系统上运行。

还可参考目标代码和字节码的区别


0
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%准确的。但这是我对这个概念的理解。希望这有所帮助。


0

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


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