Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果不同机器的JVM实现不同,字节码生成如何使Java平台独立?_Java_Jvm_Interpreter_Java Bytecode Asm - Fatal编程技术网

如果不同机器的JVM实现不同,字节码生成如何使Java平台独立?

如果不同机器的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++不是独立于平台的,因为它需要编译成本机代码,并且需要为不同的CPU架构实现不同的编译器

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++二进制是特定机器的机器代码;您不能在编译它的机器之外的任何其他机器上运行它

现在,来回答您的实际问题:

  • 事实上,JVM因硬件平台而异
  • 字节码的编译步骤需要相当多的处理和打包。如果您想在每次运行程序时都这样做,那么启动时间将受到影响。但是原则上是可能的,所以,如果你在一个C++编译器上写一个包装器,调用编译器,然后立即执行编译的程序,你就基本上有一个C++的虚拟机,它和java字节码的执行一样独立于平台。
  • 现代JVM非常聪明,在字节码执行期间(称为即时编译或JIT编译)会进行相当多的进一步编译。它绝不仅仅是字节码解释

  • 在某种意义上说,你是对的,因为你可以把C++编译器和java编译器加上java虚拟机的本质等同起来。这两者本身都不是独立于平台的:为Linux机器编写的Java编译器通常不会在Windows机器上运行,JVM也不会

    然而,实际上,Java字节码的中间语言,即Java编译器生成和虚拟机执行的语言,产生了巨大的差异,因为编译后的代码是在这个级别上发布的。所以如果你得到一个Java二进制,它就是字节码。如果您的机器有一个JVM,您就可以运行它而无需进一步的ado。相比之下,C++二进制是特定机器的机器代码;您不能在编译它的机器之外的任何其他机器上运行它

    现在,来回答您的实际问题:

  • 事实上,JVM因硬件平台而异
  • 字节码的编译步骤需要相当多的处理和打包。如果您想在每次运行程序时都这样做,那么启动时间将受到影响。但是原则上是可能的,所以,如果你在一个C++编译器上写一个包装器,调用编译器,然后立即执行编译的程序,你就基本上有一个C++的虚拟机,它和java字节码的执行一样独立于平台。
  • 现代JVM非常聪明,在字节码执行期间(称为即时编译或JIT编译)会进行相当多的进一步编译。它绝不仅仅是字节码解释

  • 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上写了一个程序二十