Java 使用不同的JDK编译相同的代码会导致相同的字节码吗?
如果相同的java文件由不同的java编译器编译,字节码是否相同?没有对源Java文件进行任何更改。是的,但是:如果使用诸如Java 使用不同的JDK编译相同的代码会导致相同的字节码吗?,java,Java,如果相同的java文件由不同的java编译器编译,字节码是否相同?没有对源Java文件进行任何更改。是的,但是:如果使用诸如com.sun等软件包,您可能会遇到问题,因为它们是专有的。 此外,不久前,我在Sun JDK和IBM JDK中遇到了对象(In | Out)putStream工作方式不同的问题,然而,可能我在这方面做了一些错误的事情,所以我不确定。 证据:-Java虚拟机规范,Java SE 7版 更新:对不起。事实上,字节码并不完全相同,但所有经过认证的JVM都会理解它并给出相同的结果
com.sun
等软件包,您可能会遇到问题,因为它们是专有的。此外,不久前,我在Sun JDK和IBM JDK中遇到了对象(In | Out)putStream工作方式不同的问题,然而,可能我在这方面做了一些错误的事情,所以我不确定。
证据:-Java虚拟机规范,Java SE 7版
更新:对不起。事实上,字节码并不完全相同,但所有经过认证的JVM都会理解它并给出相同的结果。不。字节码在哪个编译器上使用会有所不同。我可能错了,但据我所知,这些变化主要与不同JDK中javac的优化方式有关。字节码无论如何都是可互操作的。一点也不。
注:您可能指的是“JDK”,而不是“JVM”它是特定于JVM的,以及JVM驻留在哪个平台(操作系统)上。每种情况都有所不同。我不知道在同一个jvm上使用同一个javac两次编译同一个源代码。有人知道吗
如果在不同JVM上编译相同的java文件,字节码是否相同?未对源Java文件进行任何更改 你的意思并不完全清楚,但答案很可能是“不”
- 不同的JDK将有不同的Java编译器,这些编译器可能会为同一源代码发出不同的字节码。javac编译器随着时间的推移而不断发展
- Java的不同主要版本通常会发出符合不同版本的类文件规范的类文件
- 即使只安装一个JDK,在同一源文件上运行两次编译器也会生成不相同的.class文件。(类文件包括编译时间戳…)
答案可能是“是”的唯一方法是,如果您在比较中忽略编译时间戳和(可能)其他元数据,您为相同的目标版本发出字节码,并且JDK版本非常接近,Java编译器字节码的生成在版本之间没有变化。否,每一个新的JDK。一般来说,Java编译器在编译时也会进行更新以进行一些优化。使用不同的Java版本编译时,字节码会有所不同 字节码由Java编译器生成,该编译器不是特定JVM实现的一部分。字节码是JVM执行引擎执行的中间语言的名称,因此JVM不生成而是运行此代码。JVM可以做的是将字节码编译成不同的机器码。此编译器称为即时(JIT)编译器
然而,导致字节码不同的是不同的Java编译器——主要的编译器在这里列出:字节码是否相同?否。Java编译器将生成字节码而不是JVM Java编译器将Java源代码转换为机器码或Java字节码。他们通常把它转换成字节码。JVM将Java字节码作为输入。字节码告诉JVM该做什么。也许打开一个新问题比完全改变问题的含义并使大多数答案过时更好?你说的是源代码的可移植性,这不是重点。例如,IBM的javac和Sun/Oracle的javac计算
serialVersionUID
的方法不同。如果使用两个不同的编译器编译相同的代码,则可能会导致序列化问题。字节码并不总是JVM互操作的。考虑类文件版本号的问题。较旧的JVM不会执行具有较新版本号的字节码。这不是像1.5 JVM尝试执行1.6 JDK代码那样的场景吗?