当使用same JDK(即相同的javac
可执行文件),生成的类文件总是相同的吗?是否会有差异,具体取决于操作系统 or hardware?除了JDK版本之外,是否还有其他因素导致差异?是否有任何编译器选项可以避免差异?差异仅可能存在于理论上还是 Oracle 的javac
实际上为相同的输入和编译器选项生成不同的类文件?
Update 1我感兴趣的是一代,即编译器输出,而不是类文件是否可以run在各种平台上。
Update 2我所说的“相同 JDK”也是相同的意思javac
可执行的。
Update 3Oracle 编译器中理论差异和实际差异的区别。
[编辑,添加释义问题]
“在什么情况下,相同的 javac 可执行文件在不同平台上运行时会产生不同的字节码?”
让我们这样说:
我可以轻松地生成一个完全一致的 Java 编译器,而永远不会生成相同的结果.class
文件两次,给出相同的.java
file.
我可以通过调整各种字节码构造或简单地向我的方法添加多余的属性(这是允许的)来做到这一点。
鉴于规格才不是require编译器生成逐字节相同的类文件,我会避免依赖这样的结果。
However,我检查过几次,使用相同的编译器和相同的开关(以及相同的库!)编译相同的源文件did结果相同.class
files.
Update:我最近偶然发现这篇关于实施的有趣博客文章switch on String在Java 7中 https://blogs.oracle.com/darcy/entry/project_coin_string_switch_anatomy。在这篇博文中,有一些相关的部分,我将在这里引用(强调我的):
为了使编译器的输出可预测和可重复,这些数据结构中使用的映射和集合是LinkedHashMap
s and LinkedHashSet
而不仅仅是HashMaps
and HashSets
. 就生成的代码的功能正确性而言在给定的编译期间,using HashMap
and HashSet
就可以了;迭代顺序并不重要。然而,我们发现有利于javac
的输出不会根据系统类的实现细节而变化 .
这非常清楚地说明了问题:编译器是不需要只要符合规范,就以确定性的方式行事。然而,编译器开发人员意识到它是一般来说一个好主意try(如果不是太贵的话,可能)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)