Java 是JDK吗;“向上”;或;“向后”;兼容的?

Java 是JDK吗;“向上”;或;“向后”;兼容的?,java,backwards-compatibility,binary-compatibility,forward-compatibility,Java,Backwards Compatibility,Binary Compatibility,Forward Compatibility,向后二进制兼容性(或向下兼容性)-使用旧版本库API构建的客户端在新版本上运行的能力() 向上二进制兼容性(或向前兼容性)-使用新版本库API构建的客户端能够在旧版本上运行() Sun关于JDK(和太)的通用文档描述了JDK的兼容性,如下所示: JDK 5.0与Java 2 SDK v1.4.2兼容,但以下列出的不兼容除外。这意味着,除了注意到的不兼容之外,使用1.4.2版编译器构建的类文件将在JDK 5.0中正确运行 我认为文档作者在这句话中混淆了术语“向上”和“向后”的兼容性。他们描述了“向

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

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

Sun关于JDK(和太)的通用文档描述了JDK的兼容性,如下所示:

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

我认为文档作者在这句话中混淆了术语“向上”和“向后”的兼容性。他们描述了“向后”兼容性,但称此功能为“向上”兼容性

这是一个打字错误、错误还是有意使用的术语?
JDK是“向上”还是“向后”兼容?

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

它应该是向后兼容的。

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

JDK是向后兼容的,即符合1.4.2规范的字节码将在Java 5 JVM上运行是向后兼容的。由Java1.4.2构建的代码将在1.5和6虚拟机上运行。JDK编译器不向后兼容。因此,java 1.5无法编译代码以在1.4.2上运行。

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

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

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

所以我猜他们从Javac的角度考虑兼容性(因为它是JDK特有的部分),这意味着生成的字节码可以在JVM的未来版本中运行(这与JRE更相关,但也绑定在JDK中)。 简言之,我们可以说:

  • JDK(通常)是向前兼容的
  • JRE(通常)向后兼容
(这也是一个很久以前就应该吸取的教训:编写编译器的人通常是对的,而我们这些使用它们的人是错的xD)


顺便说一句,将向后/向前和向下/向上配对,而不是将它们混合在一起,不是更有意义吗?

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

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

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


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

扩展答案以包括最新的Java

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

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

  • Source:源代码兼容性涉及将Java源代码转换为类文件,包括代码是否仍在编译 全部
  • 二进制:二进制兼容性在Java语言规范中定义为保持链接无误的能力
  • 行为的:行为兼容性包括在运行时执行的代码的语义
  • …和

    Java SE 7和Java SE 6之间的不兼容性Java SE 7与Java平台的早期版本高度兼容。 几乎所有现有的程序都应该在JavaSE7上运行,而不需要 修改。然而,存在一些次要的潜在来源和风险 JRE和JDK中的二进制不兼容,涉及罕见的 此处记录的情况和“角落案例”供参考 完整性

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

    …和

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


    (没有序言,只是一个不兼容列表。)

    BTW:您应该真正关注Java 6,因为Java 5.0已经下线一段时间了。文档中也将Java 6描述为“向上二进制兼容”。仅对于向后不兼容:源代码和字节码兼容性是不同的。