【问题标题】:Do different JDK Updates produce different Java byte code?不同的 JDK 更新会产生不同的 Java 字节码吗?
【发布时间】:2011-03-02 01:49:56
【问题描述】:

假设场景:

我有一个项目,其源代码合规级别指定为 1.5。 现在我使用两个不同的 JDK 编译这个项目:首先使用 JDK 6 Update 7,然后使用 JDK 6 Update 20。

这两个不同的 JDK 是否会产生不同的 Java 字节码,尽管它们只是更新版本不同?

【问题讨论】:

  • 我在热部署到我的 JBoss 时遇到问题时想到了它(请参阅 stackoverflow.com/questions/3005919/…)。
  • @polygenelubricants:二进制兼容性是关于允许的源代码更改,同时保持类文件与其他未重新编译的类文件兼容。这是一个有用的话题,但不认为它适用于这个问题。

标签: compiler-construction compilation java


【解决方案1】:

生成的代码通常只在编译器错误修复的情况下有所不同。

但是 JLS没有指定从源代码到生成的字节码的 1:1 映射,因此您不应依赖于生成完全相同的字节码。

【讨论】:

    【解决方案2】:

    如果至少在某些情况下不会导致字节码发生变化,为什么会有人不厌其烦地发布开发工具包的更新?我强烈怀疑有人会仅仅为了文档更新而这样做。

    【讨论】:

    • 回答你的反问:因为字节码的解释/执行以及库可能已经改变。在更新之间对 JDK 的大部分更改是对运行时和库的更改,而不是对编译器的更改。
    【解决方案3】:

    没有什么可以阻止不同版本生成不同的字节码,只要它符合 JLS 中指定的行为。 JLS 留下了许多实现细节,以便在不同的实现中有所不同。

    【讨论】:

      【解决方案4】:

      让我们从另一面回答:不能保证任何两个版本的 jdk 产生相同的字节码。因此,您可以预料到总体上的差异。

      【讨论】:

        【解决方案5】:

        字节码可能略有不同,但这没什么好担心的,因为它仍然兼容。

        真正会执行什么取决于 JIT。

        【讨论】:

          【解决方案6】:

          对于不同的编译器通常是这样,在 Java 的情况下也是如此:结果必须相同,但到达的方式(从字节码的角度来看)可能不同。例如由于优化或类似的原因。 JVM是基于栈的V机;下面是一个虚构的例子(我不知道指令操作码的jvm助记符)

          推 10
          推20
          添加
          推 19
          推1
          添加
          推10
          添加

          这些产生相同的结果,但生成的字节码不同(第一个略微优化,第二个“完全”未优化;第三个选项可能是push 30,因为我们正在添加已知(可能在编译时)常量)。这是一个简单的案例,但可以轻松构建更复杂的案例。

          【讨论】:

            【解决方案7】:

            例如 JDK 6 Update 7 的编译器输出的字节码可能与 JDK 6 Update 20 的编译器略有不同,但由于它都是 Java 6,类文件将完全兼容 - 您将能够运行使用编译的代码在更新 7 上更新 20 没有任何问题。

            在主要的 Java 版本(例如 Java 5 与 Java 6)之间可能会有一些变化,因此在较新版本上编译的代码将不会在较旧版本上运行。例如,对于 Java 7,很可能会有一条新指令 invokedynamic。包含该指令的类文件将无法在较旧的 Java 版本上运行。

            然而,更新版本之间永远不会进行如此大的更改。

            【讨论】:

              【解决方案8】:

              如果您使用不同的 JDK 版本进行编译,我建议您使用 javac 的 target 选项。 否则你可能无法使用旧 JDK 运行 jar。

              您可能还想对 javac 使用 source 选项,以确保开发人员不使用更新的 JDK 中添加的类/方法。

              【讨论】:

                猜你喜欢
                • 2011-10-19
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多