Байт-код Java не поддерживает прямую совместимость, виртуальные машины JVM обратно совместимы. Разница между этими свойствами заключается в том, что любая будущая JVM может отказаться от обратной совместимости с определенной более старой версией байт-кода.
Байт-код Java был разработан таким образом, что такое сокращение требуется редко, но уже было преднамеренное ограничение обратной совместимости. Начиная с Java 8, поддержка другой семантики invokespecial
в Java 1.0 прекращена. Как JVM Спецификация §4.1 гласит:
Флаг ACC_SUPER
указывает, какая из двух альтернативных семантик должна быть выражена инструкцией invokespecial (§invokespecial), если он присутствует в этом классе или интерфейсе. Компиляторы набора инструкций виртуальной машины Java должны установить флаг ACC_SUPER
. В Java SE 8 и более поздних версиях виртуальная машина Java считает, что флаг ACC_SUPER
установлен в каждом файле class
, независимо от фактического значения флага в файле class
и версии файла class
.
Флаг ACC_SUPER
существует для обратной совместимости с кодом, скомпилированным более старыми компиляторами для языка программирования Java. В выпусках JDK до 1.0.2 компилятор генерировал access_flags
, в котором флаг, теперь представляющий ACC_SUPER
, не имел назначенного значения, а реализация виртуальной машины Java Oracle игнорировала флаг, если он был установлен.
Это не означает, что ранний код Java 1.0 вообще не работает. Сломается только код, основанный на устаревшей и теперь неподдерживаемой семантике invokespecial
той ранней версии.
Другое изменение заключается в том, что инструкции jsr
и ret
были удалены¹, однако это изменение связано с более новыми версиями файлов классов, поэтому эти инструкции по-прежнему поддерживаются для более старых версий файлов классов, поэтому они не нарушают существующий код. Но это может быть причиной того, что будущие JVM прекратят поддержку этих старых версий.
¹ спецификация JVM §4.9. 1а>:
Если номер версии файла class
равен 51.0 или выше, то ни код операции jsr, ни код операции jsr_w не могут отображаться в массиве code
.
Инструкция ret
не упоминалась, но без инструкций jsr
она не работает.
person
Holger
schedule
23.03.2018