如果不同机器的JVM实现不同,字节码生成如何使Java平台独立?
C++不是独立于平台的,因为它需要编译成本机代码,并且需要为不同的CPU架构实现不同的编译器如果不同机器的JVM实现不同,字节码生成如何使Java平台独立?,java,jvm,interpreter,java-bytecode-asm,Java,Jvm,Interpreter,Java Bytecode Asm,C++不是独立于平台的,因为它需要编译成本机代码,并且需要为不同的CPU架构实现不同的编译器 C++编译器只将代码转换为机器语言或本机代码。本机代码由处理器执行 从我在网上读到的内容来看,Java程序最初是由Java编译器“javac”编译成字节码的。然后,Java虚拟机逐行解释(和执行)该字节码 我没有什么疑问 < P > 1)如果C++不是平台无关的,因为不同的编译器需要为不同的CPU架构设计,那么JVM也不是从一个硬件到另一个硬件不同吗? < P > 2)如果我编写了C++代码,并在机器
C++编译器只将代码转换为机器语言或本机代码。本机代码由处理器执行
从我在网上读到的内容来看,Java程序最初是由Java编译器“javac”编译成字节码的。然后,Java虚拟机逐行解释(和执行)该字节码 我没有什么疑问 < P > 1)如果C++不是平台无关的,因为不同的编译器需要为不同的CPU架构设计,那么JVM也不是从一个硬件到另一个硬件不同吗? < P > 2)如果我编写了C++代码,并在机器1和机器2上编译并执行,输出的输出将是相同的。类似地,如果我编写一个Java程序并在两台不同的机器上执行它,输出仍然是相同的。为什么需要额外的字节码生成步骤 3) 我在某处读到,与编译器不同,解释器实际上是通过模拟虚拟机来执行程序的。这是否意味着JVM实际上执行字节码,而不仅仅是将其解释为本机代码在某种意义上说,你是对的,因为你可以把C++编译器和java编译器加上java虚拟机的本质等同起来。这两者本身都不是独立于平台的:为Linux机器编写的Java编译器通常不会在Windows机器上运行,JVM也不会 然而,实际上,Java字节码的中间语言,即Java编译器生成和虚拟机执行的语言,产生了巨大的差异,因为编译后的代码是在这个级别上发布的。所以如果你得到一个Java二进制,它就是字节码。如果您的机器有一个JVM,您就可以运行它而无需进一步的ado。相比之下,C++二进制是特定机器的机器代码;您不能在编译它的机器之外的任何其他机器上运行它 现在,来回答您的实际问题:
在某种意义上说,你是对的,因为你可以把C++编译器和java编译器加上java虚拟机的本质等同起来。这两者本身都不是独立于平台的:为Linux机器编写的Java编译器通常不会在Windows机器上运行,JVM也不会 然而,实际上,Java字节码的中间语言,即Java编译器生成和虚拟机执行的语言,产生了巨大的差异,因为编译后的代码是在这个级别上发布的。所以如果你得到一个Java二进制,它就是字节码。如果您的机器有一个JVM,您就可以运行它而无需进一步的ado。相比之下,C++二进制是特定机器的机器代码;您不能在编译它的机器之外的任何其他机器上运行它 现在,来回答您的实际问题:
C++只需编写一次,就可以在任何地方编译(至少在理论上,说起来容易做起来难,但它已经完成了) Java只需编译一次,就可以在任何地方运行(如果安装了JVM,那么系统之间的差异也不能完全隐藏) < >如果C++不是平台无关的,因为不同的编译器需要为不同的CPU架构设计,那么JVM也不是从一个硬件到另一个硬件不同吗? JVM不同,但字节码不必如此。C++可以写一次,但通常有特定于平台的代码。这不一定是个问题,但您可以预期代码必须经过测试,这是一个为其编写的每种系统风格编写的自定义代码 < >如果我编写了一个C++代码,并在机器1和机器2上编译并执行,输出的输出将是相同的。类似地,如果我编写一个Java程序并在两台不同的机器上执行它,输出仍然是相同的。为什么需要额外的字节码生成步骤 您只需要为Java编译一次。您可以在20年前运行windows 95的32位windows平台上使用Java 1.0编译一个JAR,在运行Linux的64位ARM处理器上,在不知道源代码或编译方式的情况下立即使用它,它将使用该处理器的最新优化和指令集 对于C++,如果你在Windows 95上写了一个程序二十