web-dev-qa-db-ja.com

JDKは「上位」または「下位」に対応していますか?

後方バイナリ互換性(または下方互換性)-構築されたクライアントの能力古いバージョンのライブラリAPIを使用して、新しいバージョンで実行します( wiki )。

Upwardバイナリ互換性(またはforward互換性)-クライアント構築機能古いバージョンで実行するライブラリAPIの新しいバージョン( wiki ).

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

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

この文章では、ドキュメンテーションライターはmixed upという用語に「上位」と「下位」の互換性があると思います。それらは「後方」互換性について記述していますが、この機能を「上位」互換性と呼びます。

これはタイプミス、間違い、または意図した用語ですか? JDKは「上位」または「下位」に対応していますか?

59
linuxbuild

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

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

Java5 JDKで生成されたバイトコードはJava 1.4 jvm(-target 1.4フラグでコンパイルされていない場合)で実行されないため、コンパイラは下位互換性がありません。古いバイトコードを実行できます。

だから私は彼らがjavacの観点から互換性を考慮することを選んだと思います(JDKに固有の部分であるため)、生成されたバイトコードはjvmの将来のリリースで実行できることを意味します、JDKにもバンドルされています)。

簡単に言えば、次のように言えます。

  • JDKは(通常)前方互換性があります。
  • JREは(通常)後方互換性があります。

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

ところで、後方/前方と下方/上方を組み合わせることは、それらを混合するよりも意味がありますか?

76
fortran

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

Java SE 7とJDK 7の互換性

オラクルの日付なしページからの引用:

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

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

…そして

Java SE 7とJava SE 6Java SE 7は、以前のバージョンのJavaプラットフォームと強力な互換性があります。ほとんどすべての既存プログラムは、修正なしでJava SE 7で実行する必要があります。 、JREとJDKには、まれに発生する可能性のあるソースとバイナリの非互換性がいくつかあり、完全性のためにここに記載されている「コーナーケース」があります。

Java SE 7言語、JVM、またはJava SE APIの非互換性

…そして

JDK 7とJDK 6の非互換性

JDK 7 javac、HotSpot、またはJava SE APIの非互換性

(そこには前文はありません-単に非互換性のリストです。)

20
Graham Perrin

後方のみ。フォワードコンパット(「それ以降のバージョン用の入力を正常に受け入れる」)では、1.5 JVMが1.6コンパイル済みコードを実行できる必要がありますが、実行できません。

後方には「古いデバイスで生成された入力を処理できる場合」が必要です。これは、1.6 JVMが1.5コンパイル済みコードを実行できるためです。

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

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

12
Mike Q

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

6
tstevens

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

3
lweller

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

1
Faisal Feroz

後方互換性が必要です。

1
Navi