JDK 是“向上”还是“向后”兼容?

向后 二进制兼容性(或 向下兼容性)——用旧版库 API 构建的客户机在新版库 API (维基百科)上运行的能力。

向上 二进制兼容性(或 前进兼容性)-客户端使用新版本的库 API 构建的能力,可以在旧版本(维基百科)上运行。

Sun 关于 JDK 自1.4.2以来 J2SE 5.0中的不兼容性(以及 Java SE 6与 J2SE 5.0的兼容性)的文档描述了 JDK 的兼容性如下:

JDK 5.0与 Java2SDK v1.4.2兼容 向上二进制文件,除了下面列出的不兼容性。这意味着,除了注明的不兼容性之外,用版本1.4.2编译器构建的类文件将在 JDK 5.0中正确运行

我认为文档编写者在这个句子中使用了 搞混了术语“向上”和“向后”兼容性。他们描述了一种“向后”兼容性,但将这种特性称为“向上”兼容性。

这是一个打印错误,错误或有意的术语在这里? JDK 是“向上”还是“向后”兼容?

67652 次浏览

根据 wiki 的定义,JDK 是向下兼容的。

它应该是向后兼容的。

Jdk 是向上兼容的-新版本可以在旧版本上运行

JDK 是向后兼容的,即遵循1.4.2规范的字节码将在 Java5JVM 上运行

Java (VM)是向后兼容的。由 java 1.4.2构建的代码将在1.5和6 VM 上运行。JDK 编译器不向后兼容。所以代码不能被 java 1.5编译来运行在1.4.2上,例如。

注意,对于向后兼容的东西,必须有一个向前兼容的对应物(有意或无意)。例如: DVD 阅读器是向后兼容 CD,还是向前兼容 DVD 阅读器?

在这种情况下,这取决于您是查看编译器(或它生成的字节码)还是查看虚拟机。

编译器不向后兼容,因为用 Java5 JDK 生成的字节码不能在 Java 1.4 jvm 中运行(除非使用 -target 1.4标志编译)。但是 JVM 是向后兼容的,因为它可以运行较旧的字节码。

所以我猜他们选择从 javac 的角度考虑兼容性(因为它是特定于 JDK 的部分) ,这意味着生成的字节码可以在 jvm 的未来版本中运行(这与 JRE 更相关,但也捆绑在 JDK 中)。

简而言之,我们可以说:

  • JDK (通常)是向前兼容的。
  • JRE 的(通常)向后兼容。

(这也是我们很久以前就应该吸取的教训: 编写编译器的人通常是正确的,而我们用错了 xD)

顺便说一下,是不是应该向后/向前/向下/向上配对,而不是把它们混在一起?

只能向后。转发 compat (“优雅地接受用于其后续版本的输入”)需要1.5 JVM 能够运行1.6编译代码,而这是不可能的。

向后需要“如果它可以使用旧设备生成的输入”,这是真的,因为1.6 JVM 可以运行1.5编译代码。

JDK/JRE 的每个版本都与 Java 字节码的一个版本相一致。每个编译器生成特定字节码版本的代码。每个 JVM 都理解特定字节码版本的一个版本和所有早期版本。

当 JVM 加载一个类时,它会检查字节码版本,如果它大于 JVM 的最新理解版本,就会得到一个 Error。(ClassVersionError 什么的)。

将答案扩展到包括最新的 Java..。

JavaSE7和 JDK7兼容性

引自甲骨文未注明日期的页面:

兼容性是一个复杂的问题 与 Java 版本有关的潜在不兼容性 平台:

  1. Source : 源代码兼容性涉及到将 Java 源代码转换为类文件,包括代码是否仍然在 所有。
  2. 二进制 : 二进制兼容性在 Java 语言规范中定义为保留无错链接的能力。
  3. 行为 : 行为兼容性包括在运行时执行的代码的语义。

还有

JavaSE7与 JavaSE6之间的不兼容性 JavaSE7与 Java 平台的以前版本强烈兼容。 几乎所有现有的程序都应该在 JavaSE7上运行 然而,有一些次要的潜在来源和 JRE 和 JDK 中涉及罕见的二进制不兼容性 的情况及「困境个案」 完整性。

JavaSE7在语言、 JVM 或 JavaSEAPI 中的不兼容性

还有

JDK 7和 JDK 6之间的不兼容性

JDK7在 javac、 HotSpot 或 JavaSEAPI 中的不兼容性

(这里没有前言,只是列出了一些不兼容的地方。)