Совместим ли JDK "вверх" или "назад"?

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

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

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

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

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

это опечатка, ошибка или предполагаемый срок здесь? Совместим ли JDK "вверх" или "назад"?

8 ответов


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

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

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

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

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

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

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

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


расширяя ответы на включать в себя самые последние на 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

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


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

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

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

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


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


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


JDK совместим вниз в соответствии с определением из wiki.


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


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