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

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

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

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

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

C对象代码的forms只有编译它的OS才能解释。

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

C编译器输出为其编写的OS的目标代码。 如果您希望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(Just In Time)编译。 JVM是JRE(Java运行时环境)的一部分,而Java程序几乎与平台无关(任何运行JVM的系统也可以运行Java程序),JRE的JVM部分依赖于平台。

简短版本:

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

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