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


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

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

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

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

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

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

8 55

8 ответов:

обратите внимание, что для того, чтобы что-то было обратно совместимым, должен быть аналог, совместимый вперед (намеренно или непреднамеренно). Например: есть DVD-проигрыватели совместимы с компакт-диска или компакт-диска вперед, совместимый с 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. Binary: бинарная совместимость определяется в спецификации языка 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 загружает класс, он проверяет версию байт-кода, и если это > чем последняя понятная версия JVMs, вы получите ошибку. (ClassVersionError или что-то в этом роде).

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

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

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

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

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