向后二进制兼容性(或向下兼容性)- 使用旧版本库 API 构建的客户端能够在新版本(wiki)上运行的能力。
向上二进制兼容性(或向前兼容性)- 一种使用新版本库 API 构建的客户端在旧版本(wiki)上运行的能力。
Sun关于JDK Incompatibility in J2SE 5.0 since 1.4.2(以及Java SE 6与J2SE 5.0的兼容性)的一般文档描述了JDK的兼容性如下:
JDK 5.0是向上与Java 2 SDK,除了下面列出的不兼容性。5.0二进制兼容。这意味着,除了提到的不兼容性之外,使用 1.4.2 版编译器构建的类文件将在 JDK 5.0 中正确运行。
我想文档作者在这句话中混淆了术语“向上”和“向后”兼容性。他们描述了“向后”兼容性,但将此功能称为“向上”兼容性。
这是打字错误、错误还是有意使用的术语?JDK 是“向上”还是“向后”兼容?
请注意,对于向后兼容的东西,必须有一个向前兼容的对应物(有意或无意)。例如:DVD 阅读器是向后兼容 CD 还是 CD 向前兼容 DVD 阅读器?
在这种情况下,这取决于您是查看编译器(或其生成的字节码)还是虚拟机。
编译器不向后兼容,因为使用 Java5 JDK 生成的字节码不会在 Java 1.4 jvm 中运行(除非使用该
-target 1.4
标志编译)。但是 JVM 向后兼容,因为它可以运行旧的字节码。所以我猜他们选择从javac的角度考虑兼容性(因为它是JDK特有的部分),意味着生成的字节码可以在jvm的未来版本中运行(与JRE更相关) ,但也捆绑在 JDK 中)。
简而言之,我们可以说:
(这也是一个早就应该吸取的教训:编写编译器的人通常是对的,而我们使用它们的人却错了 xD)
顺便说一句,向后/向前和向下/向上配对而不是将它们混合在一起不是更有意义吗?