Можно ли скомпилировать Java в машинный код? (Не байт-код)


32

Можете ли вы скомпилировать Java прямо в машинный код?

Я хочу сделать это, чтобы иметь возможность контролировать, на каких платформах он используется, и не знаю C, C ++ и т. Д.

Ответы:


36

Похоже, что GNU Compiler for Java может конвертировать исходный код Java в байт-код Java или в машинный код. Он также может конвертировать существующий байт-код Java в машинный код. Тем не менее, последние новости за 2009 год, поэтому я не уверен, насколько они актуальны и могут ли они справиться с последними функциями языка Java.


1
Если байт-код Java не изменился с 2009 года, это все равно должно работать без разработчиков, размахивающих флажками «Привет! Я все еще здесь» над программным обеспечением.
Роберт Харви

@RobertHarvey Я полагаю, что в Java 7 были введены некоторые новые концепции языка, поэтому может не получиться преобразовать исходные файлы в машинный код. Если байт - код также изменился с этими новыми функциями, то это будет не в состоянии, а также
Томас Оуэнс

1
Excelsior JET, кажется, все еще активен (коммерческий). Была Fujitsu TowerJ, но она, кажется, умерла десять лет назад и тогда была довольно бессмысленной.
Том Хотин -

Я использую Java 6, так что Java 7 не проблема в моем случае
Рассел

1
На сайте GCJ написано, что он не полностью поддерживал даже Java 1.5. Смотрите эту
ветку

13

Не совсем прямой ответ на ФП, но, возможно, интересный в стороне. Java может работать в трех режимах:

  1. Смешанный (по умолчанию) - комбинация интерпретированного и машинно скомпилированного кода (машина скомпилирована == скомпилирована JIT во время выполнения)
  2. С -Xintфлагом - Интерпретировано - Только байт-код
  3. С -Xcompфлагом - Скомпилировано - Машина скомпилирована

1
@Martjin Это для HotSpot? Случайно у вас есть ссылка на это, -Xcompпотому что я не смог найти ее в документации JDK 7 или документации по параметрам HotSpot и не уверен, что у вас есть какие-то скрытые секреты списка рассылки, о которых мы, простые смертные, не знаем :-)
Edalorzo

2
Это намеренно скрытый вариант да :-). Существуют различные списки рассылки openjdk (openjdk.java.net), из которых вы можете получить такую ​​информацию - или прочитать исходный код :-)
Martijn Verburg

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

Ну, да. Вовремя оптимизировать сложно, когда JIT даже не работает. Может иметь! = Будет иметь.
candied_orange

ммм так это варианты javac? при использовании -Xcomp выводит ли он по умолчанию один двоичный файл?
Александр Миллс

7

Возможно, лучше определить операционную систему с помощью System.getProperty («os.name») . Это позволило бы вам поддерживать более одной ОС, но исключать другие.


Есть ли способ, которым это может быть одурачено / одурачено?
FrustratedWithFormsDesigner

@ Разочарованный, возможно, но я предполагал, что его намерение состояло в том, чтобы не допустить официальной поддержки операционных систем, которые он не тестировал. В противном случае не имеет смысла намеренно отключать переносимость, которую вы получаете по существу бесплатно.
Карл Билефельдт

Возможно также, что он хочет привязать программу к конкретному оборудованию независимым от ОС способом.
FrustratedWithFormsDesigner

Вы можете заставить «os.name» свойство системы, используя специальные аргументы для виртуальной машины Java: java -Dos.name=MacOS.
SkyDan

2

Это сейчас: GraalVM позволяет вам заранее скомпилировать ваши программы в собственный исполняемый файл. Взгляните на функцию родного изображения :

Смежный вопрос: «Могу ли я скомпилировать Java в нативный код?» https://stackoverflow.com/questions/2991799/can-i-compile-java-to-native-code/50555050#50555050


PS GCJ больше не поддерживается.
Источник: «Удаление gcj» http://tromey.com/blog/?p=911

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.