使用不同的JDK编译相同的代码会导致相同的字节代码吗?

时间:2012-05-04 06:28:47

标签: java

如果不同的Java编译器编译相同的java文件,字节代码是否相同?未对源Java文件进行任何更改。

7 个答案:

答案 0 :(得分:5)

  

如果在不同的JVM上编译相同的java文件,字节代码是否相同?未对源Java文件进行任何更改。

你的意思并不完全清楚,但答案很可能是“不”。

  • 不同的JDK将有不同的Java编译器,它们可能为相同的源代码发出不同的字节码。 javac编译器随着时间的推移而发展。

  • Java的不同主要版本通常会发出符合类文件规范不同版本的类文件。

  • 即使您将自己局限于一个JDK安装,在同一源文件上运行两次编译器也会生成不同的.class文件。 (类文件包含编译时间戳...)

答案可能是“是”的唯一方法是,如果您忽略了比较中的编译时间戳和(可能)其他元数据,那么您发出了相同目标版本的字节码,并且JDK版本足够接近Java编译器字节码生成在版本之间没有变化。

答案 1 :(得分:2)

完全没有。

PS:可能你的意思是“JDK”,而不是“JVM”

答案 2 :(得分:2)

字节代码由 Java编译器生成,不是特定JVM实现的一部分。字节代码是JVM执行引擎执行的中间语言的名称,因此JVM不生成但运行此代码。 JVM可以做的是将字节代码编译成可以不同的机器代码。此编译器称为即时(JIT)编译器。

然而,导致不同字节代码的是不同的Java编译器 - 主要的编译器列在那里:http://en.wikipedia.org/wiki/Java_compiler

答案 3 :(得分:1)

不。字节代码将在您使用它的编译器上有所不同。但只是略微和规范内。我可能错了,但据我所知,这些变化主要与不同JDK中的javac如何优化有关。字节代码无论如何都是JVM可互操作的。

答案 4 :(得分:0)

它是JVM特定的以及JVM驻留在哪个平台(OS)上。在每种情况下,它都有些不同。我不知道在相同的jvm上使用相同的javac两次编译相同的源。有没有人有想法?

答案 5 :(得分:0)

不,每一个新的JDK。通常,Java编译器也会在编译时进行更新以进行一些优化。当使用不同的Java版本编译时,字节代码会有所不同。

答案 6 :(得分:-1)

是的,但是:如果您使用com.sun等软件包,可能会遇到麻烦,因为它们是专有的 而且,前段时间我偶然发现了Object(In | Out)putStream在Sun JDK和IBM JDK中的不同工作,但是,也许,我在那里做错了,所以我不确定这个。
证明:http://docs.oracle.com/javase/specs/ - Java虚拟机规范,Java SE 7 Edition
更新:抱歉。实际上,不完全相同的字节码,但所有经过认证的JVM都会理解它并给出相同的结果。