Совместим ли JDK «вверх» или «назад»? - PullRequest
58 голосов
/ 14 января 2011

Обратная бинарная совместимость (или нисходящая совместимость) - способность клиентов, созданных на основе старой версии API библиотеки, запускаться на новой ( wiki )).

двоичная совместимость Upward (или совместимость forward ) - способность клиентов, созданных с новой версией API библиотеки, работать на старой ()wiki ).

В общем документе Sun о JDK Несовместимости в J2SE 5.0 начиная с 1.4.2 совместимость Java SE 6 с J2SE 5.0 тоже) описываетсясовместимость JDK выглядит следующим образом:

JDK 5.0 является вверх двоично-совместимым с Java 2 SDK, v1.4.2, за исключением несовместимостей, перечисленных ниже.Это означает, что, за исключением отмеченных несовместимостей, файлы классов , созданные с помощью компиляторов версии 1.4.2, будут работать правильно в JDK 5.0 .

Я предполагаю, что авторы документации имеют В этом предложении смешаны термины «восходящая» и «обратная» совместимость.Они описывают «обратную» совместимость, но называют эту функцию «восходящей» совместимостью.

Это опечатка, ошибка или предполагаемый термин здесь?Является ли JDK «восходящим» или «обратным» совместимым?

Ответы [ 8 ]

73 голосов
/ 14 января 2011

Обратите внимание, что для чего-то, чтобы быть обратно совместимым, должен быть аналог, который является совместимым в прямом направлении (преднамеренно или непреднамеренно).Например: совместимы ли дисководы для чтения DVD с дисками или совместимы с дисководом для чтения компакт-дисков?

В этом случае все зависит от того, смотрите ли вы на компилятор (или генерируемый им байт-код) или на виртуальную машину..

Компилятор не имеет обратной совместимости, поскольку байт-код, созданный с помощью Java5 JDK, не будет работать в Java 1.4 jvm (если не скомпилирован с флагом -target 1.4).Но JVM обратно совместима, так как может запускать более старые байт-коды.

Так что я думаю, что они решили рассмотреть совместимость с точки зрения javac (так как это часть, специфичная для JDK), что означает, чтосгенерированный байт-код может быть запущен в будущих выпусках jvm (который больше связан с JRE, но также связан с JDK).

Вкратце, мы можем сказать:

  • JDK (обычно) совместимы в прямом направлении.
  • JRE (обычно) совместимы в обратном направлении.

(И это также служит уроком, который следует усвоить давно: люди, пишущиекомпиляторы, как правило, правы, а мы, люди, используем их неправильно xD)

Кстати, не имеет ли больше смысла объединять их в пару назад / вперед и вниз / вверх, а не смешивать их?

20 голосов
/ 22 августа 2012

Расширение ответов для включения самой последней версии Java…

Совместимость Java SE 7 и JDK 7

Цитаты из недатированной страницы Oracle:

Совместимость - сложная проблема. В этом документе рассматриваются три типа потенциальных несовместимостей, связанных с выпуском Java Платформа:

  1. Исходный код : Совместимость исходного кода касается перевода исходного кода Java в файлы классов, включая сведения о том, компилируется ли код в все.
  2. Двоичный : двоичная совместимость определена в Спецификации языка Java как сохранение возможности связывания без ошибок.
  3. Поведенческий : Поведенческая совместимость включает семантику кода, который выполняется во время выполнения.

… и

Несовместимость между Java SE 7 и Java SE 6 Java 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

(там нет преамбулы - просто список несовместимостей.)

12 голосов
/ 14 января 2011

только назад.Прямой компат («изящно принять ввод, предназначенный для более поздних версий») потребовал бы, чтобы 1.5 JVM могла запускать скомпилированный код 1.6, чего не может.

Backward требует, «если он может работать с вводом»генерируется старым устройством », что справедливо, поскольку 1.6 JVM может выполнять скомпилированный код 1.5.

Каждый выпуск JDK / JRE совпадает с версией байт-кода Java.Каждый компилятор создает код определенной версии байт-кода.Каждая JVM понимает версию и все более ранние версии конкретной версии байт-кода.

Когда JVM загружает класс, она проверяет версию байт-кода и, если она> последней версии, понятной для JVM, вы получите сообщение об ошибке.(ClassVersionError или что-то).

6 голосов
/ 14 января 2011

Java (VM) имеет обратную совместимость.Код, созданный в Java 1.4.2, будет работать на 1,5 и 6 виртуальных машинах.Компилятор JDK не имеет обратной совместимости.Так что код не может быть скомпилирован Java 1.5 для запуска на 1.4.2, например.

3 голосов
/ 14 января 2011

JDK обратно совместим, т.е. Байт-код, соответствующий спецификации 1.4.2, будет работать на Java 5 JVM

1 голос
/ 14 января 2011

Должно быть обратно совместимо.

1 голос
/ 14 января 2011

JDK совместим с предыдущими версиями согласно определению из вики.

0 голосов
/ 14 января 2011

jdk совместим с версией вверх - новая версия может работать на старой

...