70

下位バイナリ互換性(または下位互換性)-古いバージョンのライブラリAPIで構築されたクライアントが、新しいバージョン(wiki)で実行できる機能。

上位バイナリ互換性(または上位互換性)-新しいバージョンのライブラリAPIで構築されたクライアントが、古いバージョン(wiki)で実行できる機能。

1.4.2以降のJ2SE5.0でのJDKの非互換性に関する一般的なSunのドキュメント(およびJava SE6とJ2SE5.0との互換性)では、JDKの互換性について次のように説明しています。

JDK 5.0は、以下にリストされている非互換性を除いて、Java 2 SDK、v1.4.2と上位バイナリ互換です。これは、上記の非互換性を除いて、バージョン1.4.2コンパイラでビルドされたクラスファイルがJDK5.0で正しく実行されることを意味します。

この文では、ドキュメント作成者が「上位」と「下位」の互換性という用語を混同していると思います。これらは「下位」互換性について説明していますが、この機能を「上位」互換性と呼んでいます。

これはタイプミス、間違い、または意図された用語ですか?JDKは「上向き」または「後方」互換性がありますか?

4

8 に答える 8

95

下位互換性があるものには、(意図的または意図せずに)上位互換性のある対応物が存在する必要があることに注意してください。例:DVDリーダーはCDと下位互換性がありますか、それともCDはDVDリーダーと上位互換性がありますか?

この場合、コンパイラ(またはコンパイラが生成するバイトコード)と仮想マシンのどちらを見るかによって異なります。

Java5JDKで生成されたバイトコードはJava1.4jvmで実行されないため、コンパイラには下位互換性がありません(-target 1.4フラグを使用してコンパイルされた場合を除く)。ただし、JVMは古いバイトコードを実行できるため、下位互換性があります。

したがって、javacの観点から互換性を検討することを選択したと思います(JDKに固有の部分であるため)。つまり、生成されたバイトコードは、jvmの将来のリリースで実行できます(これは、JREに関連しています)。 、JDKにもバンドルされています)。

簡単に言えば、次のように言うことができます。

  • JDKは(通常)上位互換性があります。
  • JREは(通常)下位互換性があります。

(そして、それはずっと前に学ぶべき教訓としても役立ちます:コンパイラーを書いている人々は通常正しいです、そして私たち人々はそれらを間違ったxDを使用しています)

ちなみに、後ろ向き/前向きと下向き/上向きを混同するよりも、ペアリングする方が理にかなっているのではないでしょうか。

于 2011-01-14T15:34:17.197 に答える
21

最新のJavaを含むように回答を拡張する…</p>

JavaSE7とJDK7の互換性

Oracleの日付のないページからの引用:

互換性は複雑な問題です。このドキュメントでは、Javaプラットフォームのリリースに関連する3種類の潜在的な非互換性について説明します。

  1. ソース:ソースの互換性は、Javaソースコードをクラスファイルに変換することに関するものです。これには、コードがまだコンパイルされているかどうかも含まれます。
  2. バイナリ:バイナリ互換性は、Java言語仕様で、エラーなしでリンクする機能を維持するものとして定義されています。
  3. 動作:動作の互換性には、実行時に実行されるコードのセマンティクスが含まれます。

… と

JavaSE7とJavaSE6の非互換性JavaSE7は、以前のバージョンのJavaプラットフォームと強力に互換性があります。ほとんどすべての既存のプログラムは、変更なしでJavaSE7で実行する必要があります。ただし、JREとJDKには、完全を期すためにここに記載されているまれな状況と「コーナーケース」を含む、いくつかのマイナーな潜在的なソースとバイナリの非互換性があります。

言語、JVM、またはJavaSEAPIにおけるJavaSE7の非互換性

… と

JDK7とJDK6の間の非互換性

javac、HotSpot、またはJavaSEAPIでのJDK7の非互換性

(前文はありません–非互換性のリストだけです。)

于 2012-08-22T08:11:04.267 に答える
16

後方のみ。Forward compat(「それ自体の新しいバージョンを対象とした入力を適切に受け入れる」)では、1.5 JVMが1.6コンパイル済みコードを実行できるようにする必要がありますが、これはできません。

1.6 JVMは1.5コンパイル済みコードを実行できるため、Backwardには「古いデバイスによって生成された入力で動作できるかどうか」が必要です。

JDK / JREの各リリースは、Javaバイトコードのバージョンと一致します。各コンパイラは、特定のバイトコードバージョンのコードを生成します。各JVMは、特定のバイトコードバージョンのバージョンとそれ以前のすべてのバージョンを理解します。

JVMがクラスをロードすると、バイトコードのバージョンがチェックされ、それがJVMの最新の理解されたバージョンよりも大きい場合は、エラーが発生します。(ClassVersionErrorなど)。

于 2011-01-14T15:38:48.270 に答える
7

Java(VM)は下位互換性があります。java 1.4.2でビルドされたコードは、1.5および6のVMで実行されます。JDKコンパイラには下位互換性がありません。したがって、コードをjava 1.5でコンパイルして、たとえば1.4.2で実行することはできません。

于 2011-01-14T15:32:53.560 に答える
3

JDKは下位互換性があります。つまり、1.4.2仕様に準拠するバイトコードはJava5JVMで実行されます。

于 2011-01-14T15:30:24.390 に答える
1

JDKは、wikiの定義に従って下位互換性があります。

于 2011-01-14T15:28:21.247 に答える
1

下位互換性が必要です。

于 2011-01-14T15:28:59.680 に答える
-2

jdkは上位互換性があります-新しいバージョンは古いバージョンで実行できます

于 2011-01-14T15:29:27.587 に答える