Чи можливо компілювати Java в машинний код? (Не байт-код)


32

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

Я хочу це зробити, щоб я мав контроль над тим, на яких платформах використовується, і не знаю C, C ++ тощо.

Відповіді:


36

Виявляється, компілятор GNU для 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. Дивіться цю тему: stackoverflow.com/a/4040404/1257384
GregT

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", використовуючи спеціальні аргументи для JVM : 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.