Будет ли код Java, скомпилированный с использованием OpenJDK, всегда работать в точке доступа Oracle или наоборот?

Я просмотрел этот документ, где тот же Java-код компилируется в Oracle JDK, но не в OpenJDK. Присутствуют некоторые ссылки для тех же проблем здесь тоже на SO. Означает ли это, что "javac" зависит от поставщика?

А если ответ да? тогда есть вероятность, что они могут создавать другой байт-код. См. здесь.

Итак, если байт-код отличается, как JVM Oracle будет обрабатывать байт-код, сгенерированный javac OpenJDK?

Можно ли с уверенностью сказать: «Java — это« Напиши один раз и работай где угодно, при условии, что компилятор javac и JVM принадлежат одному и тому же поставщику? "


person Aman Arora    schedule 28.11.2013    source источник


Ответы (4)


javac не зависит от поставщика, однако разные компиляторы могут иметь разные ошибки, и это может привести к различиям.

Что имеет гораздо большее значение, так это наличие встроенных библиотек, классов esp, которые не предназначены для использования разработчиками. например sun.misc.Unsafe.copyMemory(5 args) не существовало до обновления Java 6 18 в Oracle JDK и доступно только в последнем обновлении OpenJDK. Насколько я знаю, он недоступен в IBM JVM.

«Написать один раз, запустить где угодно» означает «компилировать один раз и запускать где угодно». Например, C++ можно написать один раз и запустить где угодно, если вы перекомпилируете его для каждой системы.

После того, как вы скомпилировали свой код Java, он будет работать в любой системе, в которой есть библиотеки, которые вы использовали.

person Peter Lawrey    schedule 28.11.2013
comment
Спасибо за ответ. Как упоминалось здесь, сам байтовый код отличается. Тогда как он будет работать на разных JVM? - person Aman Arora; 28.11.2013
comment
@AmanArora Скорее всего, разница не важна для работы программы. например вы можете включить отладку или нет, использовать обфускацию, изменить порядок методов, и класс будет работать одинаково. - person Peter Lawrey; 28.11.2013
comment
@AmanArora Не забывайте, что JVM на самом деле не запускает байт-код. Он транслируется в структуру данных и, возможно, компилируется в собственный код. Все, что у вас есть, это двоичный формат с проверкой синтаксиса. Компилятор javac даже не оптимизирует 99% случаев. - person Peter Lawrey; 28.11.2013
comment
@AmanArora OpenJDK теперь объявлен эталонной реализацией. Все, что отличается от него, является ошибкой (в любом случае, согласно OpenJDK;) - person Peter Lawrey; 28.11.2013
comment
Поправьте меня, если я ошибаюсь, пожалуйста. Я понял следующее: «javac» является стандартным для всех JDK, и создаваемый им байтовый код должен работать на любой JVM, следующей за спецификация JVM, разработанная ORACLE - person Aman Arora; 28.11.2013
comment
@AmanArora Да, но разные версии Java могут создавать немного разные байтовые коды, однако они должны делать одно и то же. Примечание. Scala, groovy, JRuby, Jython и т. д. — все они создают байтовый код, и они должны работать на основных JVM. Java — не единственный язык, работающий на JVM. - person Peter Lawrey; 29.11.2013

Лучшим ответом на ваш вопрос будет «это зависит». Создание другого байт-кода не обязательно означает создание плохого байт-кода. Имейте в виду, что первый документ, на который вы ссылаетесь, обсуждает OpenJDK 6 и Oracle JDK 6. В то время OpenJDK и Oracle JDK на самом деле часто были слегка несовместимы, потому что Oracle не объединила два проекта JDK так, как они это сделали с JDK 7. Теперь это почти идентичные кодовые базы, но до 7 это было не так.

person Mike Thomsen    schedule 28.11.2013
comment
Создание другого байт-кода не обязательно означает создание плохого байт-кода. Истинный ! Но JVM должен перевести этот код в собственный код, и он не может перевести какой-либо байт-код, верно? - person Aman Arora; 28.11.2013

Будет ли код Java, скомпилированный с использованием OpenJDK, всегда работать в точке доступа Oracle или наоборот?

Если они одной версии, то да.

Но если вы скомпилируете на Java 7 и попытаетесь запустить на Java 6 или более ранней версии, у вас возникнут проблемы (если только вы не используете ключ -target соответствующим образом).

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


На самом деле OpenJDK и Oracle JDK довольно близки. Фактически, для соответствующих версий я ожидаю, что байт-коды, созданные соответствующими компиляторами javac, будут практически идентичными. Исправления ошибок компилятора, внесенные в одну кодовую базу, переносятся в другую, как само собой разумеющееся, а ошибки генерации кода в компиляторе байт-кода довольно необычны. Другие различия в сгенерированных байт-кодах (т. е. не из-за ошибок) вряд ли повлияют на поведение правильно написанной программы.


Можно ли с уверенностью сказать: «Java — это« Напиши один раз и работай где угодно, при условии, что компилятор javac и JVM от одного и того же поставщика? "

Эм... нет. Существуют различия в поведении Java для разных платформ; то есть Java в Windows и Java в Linux в некоторых отношениях ведут себя по-разному. Некоторые из этих различий напрямую связаны с самими платформами; например Синтаксис пути и блокировка файлов различаются в Windows и Linux. Другие возникают из-за проблем с сопоставлением Java с другой собственной оконной системой платформ.

Эти различия не имеют ничего общего с компиляторами или генерацией кода.

person Stephen C    schedule 28.11.2013
comment
Я поделился ссылкой, где код Java даже не компилируется с теми же версиями OpenJDK и Oracle JDK. Вот ссылка - person Aman Arora; 28.11.2013
comment
Да... но это не ошибка генерации кода. Это ошибка в проверке ошибок, из-за которой один компилятор принимает то, что другой (справедливо) называет ошибкой компиляции. Также сравнивается поведение компилятора в разных версиях Java! - person Stephen C; 28.11.2013
comment
Итак, у OpenJDK есть собственная реализация javac, у Oracle — своя. Могут ли быть случаи, когда сгенерированные байт-коды могут быть несовместимы? не так ли? - person Aman Arora; 28.11.2013
comment
Это возможно, но крайне маловероятно. На самом деле OpenJDK и Oracle JDK производятся одной и той же командой людей. Это одна и та же кодовая база! - person Stephen C; 28.11.2013

Сидеть с файлом jar, скомпилированным с помощью OracleJDK, который работает в этой системе. Когда я попытался запустить его на своем, когда у меня установлен OpenJDK, он отказывается запускаться. И продолжает давать мне отсутствующую ошибку класса.

person anon    schedule 19.07.2019