Чи можливо компілювати 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.