Разные обновления JDK производят другой байт-код Java? - PullRequest
11 голосов
/ 10 июня 2010

Гипотетический сценарий:

У меня есть проект, чей уровень соответствия источника установлен на 1,5.Теперь я компилирую этот проект с двумя разными JDK: сначала с JDK 6, обновление 7, а затем с JDK 6, обновление 20.

Создают ли эти два разных JDK разные байт-коды Java, хотя они отличаются только версией обновления

Ответы [ 8 ]

10 голосов
/ 10 июня 2010

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

9 голосов
/ 10 июня 2010

Сгенерированный код обычно отличается только в случае исправления ошибок компилятора.

Однако JLS не задает отображение 1: 1 из исходного кода в сгенерированный байт-код, поэтому не следует полагаться на тот же байт-код, который будет сгенерирован.

2 голосов
/ 10 июня 2010

Давайте ответим с другой стороны: нет никакой гарантии, что любые две версии jdk выдают одинаковый байт-код. Таким образом, вы можете ожидать различия в целом.

1 голос
/ 10 июня 2010

Компилятор, например, JDK 6 Update 7, может выводить немного иной байт-код, чем компилятор JDK 6 Update 20, но, поскольку это обе Java 6, файлы классов будут полностью совместимы - вы сможете запускать код, скомпилированный Обновление 20 на Обновление 7 без проблем.

Между основными версиями Java (например, Java 5 против Java 6) могут быть изменения, так что код, скомпилированный в более новой версии, не будет работать в более старой версии. Например, для Java 7, скорее всего, будет новая инструкция invokedynamic . Файлы классов, содержащие эту инструкцию, не будут работать в более старых версиях Java.

Такие большие изменения, однако, никогда не делаются между версиями обновления.

1 голос
/ 10 июня 2010

Байт-код может немного отличаться, но об этом не стоит беспокоиться, поскольку он все еще будет совместим.

То, что действительно будет выполнено, зависит от JIT.

1 голос
/ 10 июня 2010

С какой стати кто-то пошёл бы на проблему выпуска Обновления комплекта разработки, если это не привело к изменению байт-кода по крайней мере в некоторых случаях?Я сильно сомневаюсь, что кто-нибудь сделает это только для обновления документации.

0 голосов
/ 10 июня 2010

Если вы компилируете с различными версиями JDK, я бы посоветовал использовать опцию target для javac.В противном случае вы не сможете запустить jar со старым JDK.

Вы также можете использовать опцию source для javac, чтобы убедиться, что разработчик не использует классы/ методы добавлены в более свежий JDK.

0 голосов
/ 10 июня 2010

Как обычно для разных компиляторов, это также в случае Java: результат должен быть одинаковым, но способ, которым он достигается, может быть (с точки зрения байтовых кодов) разным, например, из-за оптимизации или подобным образом.JVM - это стековая V-машина;Ниже приведен воображаемый пример (я не знаю мнемонику jvm для кодов операций инструкций)

push 10
push 20
add
push 19
push 1
add
push 10
add

Они дают тот же результат, но сгенерированные байт-коды отличаются (первый немного оптимизирован, второй«полностью» не оптимизирован; третий вариант может быть push 30, так как мы добавляем известные (вероятно, во время компиляции) константы).Это простой случай, но более сложный случай может быть легко построен.

...