5

如果同一个java文件被不同的Java编译器编译,字节码会不会一样?没有对源 Java 文件进行任何更改。

4

7 回答 7

5

如果同一个java文件在不同的JVM上编译,字节码会不会一样?没有对源 Java 文件进行任何更改。

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

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

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

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

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

于 2012-05-04T06:39:12.330 回答
2

一点也不。

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

于 2012-05-04T06:36:01.393 回答
2

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

然而,可能导致不同字节码的是不同的 Java 编译器 - 主要的编译器在此处列出:http ://en.wikipedia.org/wiki/Java_compiler

于 2012-05-04T06:44:23.537 回答
1

没有。字节码会因您在哪个编译器中使用而有所不同。但仅在规范范围内略有不同。我可能错了,但据我所知,这些变化主要与不同 JDK 中的 javac 优化方式有关。无论如何,字节码是 JVM 可互操作的。

于 2012-05-04T06:34:50.503 回答
0

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

于 2012-05-04T06:37:02.097 回答
0

不,每个新的 JDK。一般Java编译器在编译的时候也会更新做一些优化,不同的Java版本编译时字节码会有所不同。

于 2012-05-04T06:42:03.147 回答
-1

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

于 2012-05-04T06:32:39.937 回答