Java是否生成目标代码或字节代码?

时间:2012-01-19 22:25:35

标签: java

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

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

5 个答案:

答案 0 :(得分:18)

字节代码只是Java虚拟机的“目标代码”。它不是原生代码(例如x86)。说实话,我现在很少听到“目标代码”一词 - 用更具体的术语说话通常更清楚。

答案 1 :(得分:2)

编译java程序时,它转到字节码。当您运行生成的工件时,平台的JVM然后运行(好吧,解释)字节码,将其转换为机器级指令。

答案 2 :(得分:1)

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

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

C编译器输出为其编写的OS的目标代码。如果您希望C代码在另一台机器上运行,则必须重新编译它  在没有重新编译的情况下,在Windows上编译的C代码将无法在Linux上运行。

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

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

另请参阅difference between object code and byte code

答案 3 :(得分:0)

Java与平台无关。编译Java源代码时,它将转换为字节代码,运行应用程序时,客户端计算机上的JRE将执行字节代码。

答案 4 :(得分:0)

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

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

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

您可以将JVM视为字节码的解释器。虽然,从技术上讲,它被称为JIT(Just In Time)编译。 JVM是JRE(Java运行时环境)的一部分,而Java程序几乎与平台无关(任何运行JVM的系统也可以运行Java程序),JRE的JVM部分依赖于平台。

简短版本:

  • Java编译器生成字节码(编译的一半,平台无关,无法运行)。
  • Java虚拟机生成机器代码。
  • 对象代码是生成的机器代码的一部分。
  • 字节码在JIT时成为目标代码。
  • 目标代码成为机器代码(编译其余部分, 平台依赖,可以运行)。

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