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

时间:2011-01-14 15:24:47

标签: java backwards-compatibility binary-compatibility forward-compatibility

向后二进制兼容性(或向下兼容性) - 使用旧版本库API构建的客户端在新版本上运行的功能(wiki )。

向上二进制兼容性(或转发兼容性) - 使用新版本的库API构建的客户端在旧版本(wiki)上运行的功能

Sun的一般文档关于JDK Incompatibilities in J2SE 5.0 since 1.4.2(以及Java SE 6 compatibility with J2SE 5.0)描述了JDK的兼容性如下:

  

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

我认为文档编写者在这句话中具有混合术语“向上”和“向后”兼容性。它们描述了“向后”兼容性,但将此功能称为“向上”兼容性。

这是一个错字,错误或预期的术语吗? JDK是“向上”还是“向后”兼容?

8 个答案:

答案 0 :(得分:71)

请注意,对于向后兼容的内容,必须存在向前兼容的对应方(有意或无意)。例如:DVD读卡器向后兼容CD还是CD向前兼容DVD读卡器?

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

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

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

简而言之,我们可以说:

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

(它也可以作为一个应该在很久以前学到的教训:编写编译器的人通常是正确的,我们使用它们的人错了xD)

顺便说一下,配对后退/前进,下降/上升而不是将它们混合起来更有意义吗?

答案 1 :(得分:20)

扩展答案以包含最新的Java ...

Java SE 7 and JDK 7 Compatibility

Oracle未注明日期的页面引用:

  

兼容性是一个复杂的问题。本文档讨论了三种类型   与Java发布相关的潜在不兼容性   平台:

     
      
  1. 来源:源兼容性问题涉及将Java源代码转换为类文件,包括代码是否仍在编译   所有
  2.   
  3. 二进制:在Java语言规范中定义了二进制兼容性,因为它保留了无错误链接的能力。
  4.   
  5. 行为:行为兼容性包括在运行时执行的代码的语义。
  6.   

...和

  

Java SE 7与Java SE 6之间的不兼容性 Java SE 7与以前版本的Java平台强大兼容。   几乎所有现有程序都应该在没有Java SE 7的情况下运行   修改。但是,有一些小的潜在来源和   JRE和JDK中涉及稀有的二进制不兼容性   情况和这里记录的“角落案件”   完整性。

     

Java SE 7语言,JVM或Java SE API中的不兼容性

...和

Incompatibilities between JDK 7 and JDK 6

  

JDK 7在javac,HotSpot或Java SE API中的不兼容性

(没有序言 - 只是不兼容的列表。)

答案 2 :(得分:11)

仅落后。正向compat(“优雅地接受用于其自身的更高版本的输入”)将要求1.5 JVM能够运行1.6编译代码,但它不能。

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

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

当JVM加载一个类时,它会检查字节码版本,如果它是>比JVM最新理解的版本你会得到一个错误。 (ClassVersionError或其他)。

答案 3 :(得分:6)

Java(VM)向后兼容。由java 1.4.2构建的代码将在1.5& 6个VM。 JDK编译器不向后兼容。因此,java 1.5无法编译代码,例如在1.4.2上运行。

答案 4 :(得分:3)

JDK是向后兼容的,即符合1.4.2规范的字节代码将在Java 5 JVM上运行

答案 5 :(得分:1)

根据维基的定义,JDK向下兼容。

答案 6 :(得分:1)

它应向后兼容。

答案 7 :(得分:-2)

jdk向上兼容 - 新版本可以在旧版本上运行