Чи можу я скомпілювати Java до власного коду?


82

Чи є спосіб скомпілювати з Java в автономний (або бібліотечний) машинний код, не вимагаючи JVM?


3
"скласти" - це слово, яке ви шукаєте (а не "скласти").
TJ Crowder,

7
Якщо ваш інтерес полягає в швидкості, не турбуйтеся, якщо ви не шукаєте платформу, яку HotSpot (Sun's JVM) не підтримує. HotSpot на ходу компілює байт-код до власного коду всюди, де з’являється "гаряча точка" шляху виконання (щось, що багато запускається), і це дуже добре в цьому виходить. Але якщо ви хочете уникати JVM, так, подивіться на gcj, на який вам вказав Джеймс.
TJ Crowder,

3
Ще однією причиною є захист від декомпіляторів Java. Що стосується продуктивності HotSpot проти власного компілятора (проти JRockit проти IBM проти GCC проти Visual C ++ проти рукописного введення інструкцій процесора в шістнадцятковій системі), це залежить від програми, отже, YMMV.
Дмитро Лесков

1
Я знайшов одну цікаву розробку Oracle для бази даних Oracle під назвою JServer Accelerator. Він також був розроблений, щоб якимось чином залежати від платформи, компілюючи не байт-коди, а код С. docs.oracle.com/cd/A87860_01/doc/java.817/a83727/jtools5.htm
наднова

6
Я не розумію, чому це питання закрили модератори. Мені це здається абсолютно зрозумілим. Якщо вони цього не розуміють, можливо, проблема в них.
isapir

Відповіді:


40

Раніше існував інструмент під назвою GCJ, який був частиною GCC, але його було видалено . Тепер усі посилання на сайті GCC переспрямовують на їх еквіваленти, що не належать до GCJ.

Примітка: усі коментарі посилалися на мою оригінальну відповідь, де ви можете скомпілювати Java до власного коду за допомогою GCJ.


2
Так, gcj - найвідоміший. @ isola009: Майте на увазі, що під час компіляції до власного коду ви, ймовірно, будете працювати з підмножиною (можливо, різко невеликою підмножиною) бібліотек, які Java зазвичай має за замовчуванням. Gnu's досить хороший, за всіма оцінками, але значно відстає від поточного JDK.
TJ Crowder,

Це значно відстає від усіх JDKS, починаючи з 1.2. Я зіткнувся з багатьма проблемами з підтримкою людей, які випадково запустили шлях до класу GNU замість Java, і їх усіх без винятку вилікували, видаливши його та використовуючи Sun JDK.
user207421

Excelsior JET включає ліцензійну реалізацію стандартної бібліотеки Java SE 6 і пройшов офіційні тести на відповідність (JCK). Зараз він знаходиться на рівні 6u18, очікується, що наступна версія буде підтримувати 6u20.
Дмитро Лесков

27

Так!

Oracle працює над GraalVm, який підтримує власні образи. Перевірте тут: https://www.graalvm.org/

Власне зображення Власне зображення із SDK GraalVM допомагає скоротити час запуску програм Java та надає їм менший розмір. Фактично, це перетворення байт-коду, який працює на JVM (на будь-якій платформі), у власний код для певної ОС / платформи - звідки і походить продуктивність. Він використовує агресивну оптимізацію, що випереджає час (AOT), щоб досягти гарної продуктивності.

Побачити більше:


На жаль, навіть цей проект не є стабільним для виробництва, і використання Swing API все ще не підтримується / глючить: github.com/oracle/graal/issues/1327
BullyWiiPlaza

"Випуск GraalVM 19.0:" GraalVM нарешті зрілий і готовий до виробничого використання ". Звичайно, будуть помилки та деякі ще не повні функції. Але Twitter використовує їх для своїх виробничих систем, тому я не згоден з вашим першим позов.
RobAu

Мій особистий досвід полягає в тому, що працюють Windowsлише програми для іграшок, але все, що є більш досконалим та / або при використанні, GUIще не зовсім. Twitterймовірно, використовує Linuxбез будь-якого, GUIале вони, ймовірно, використовують і комерційну версію, тоді як я лише пробував спільну. Це може працювати в деяких випадках використання, але Windowsнастільні програми Java не є одними з них, що все ще змушує проект трохи розчаровувати. Excelsior JETміг зробити це надійно, але зараз це припинено.
BullyWiiPlaza

19

Excelsior JET - комерційний компілятор Java для власного коду. Однак його було припинено в травні 2019 року.


3
Про всяк випадок існують безкоштовні ліцензії на некомерційні проекти.
Дмитро Лесков

1
як це порівняно з RoboVM?
Янус Трольсен

15 травня 2019 року компанія Excelsior JET була припинена. Див .: en.wikipedia.org/wiki/Excelsior_JET
Стефан

10

Так, JIT у JVM робить саме це для вас.

Насправді він може виробляти швидший код, ніж заздалегідь компілювати його, оскільки може генерувати код, оптимізований для конкретної платформи на основі використання коду під час виконання.

JVM завжди задіяний, навіть якщо дуже великий відсоток компілюється до власного коду, оскільки ви можете динамічно завантажувати та запускати байт-код.


18
Так, ви праві, що JIT робить це і робить це дуже добре. Це не робить автономного виконуваного файлу, але тоді ОП про це не запитував ....
Білл К

2
Ви, мабуть, припускаєте, що лише JIT можуть оптимізувати певну платформу. Я думаю, це можливо, коли ви відправляєте байт-код. ART компілює байт-код до власного коду під час встановлення, і це не JIT. Пітере, чи маєш ти коментарі з цього приводу?
Янус Троельсен,

2
OP згадує, автономний, що просто вражає будь-який тип JIT: Хоча JIT створює власний код на льоту, він ніколи не є автономним.
StormByte

1
@KurtFitzner Я думаю, у вас є зовсім інше уявлення про те, що робить компілятор JIT, він компілюється до власного коду, де інтерпретація не задіяна.
Пітер Лорі

2
Я не вірю, що компілятор JIT може дозволити собі настільки глибоку оптимізацію, як власний компілятор / компонувальник AOT: компіляція та зв'язування з повною оптимізацією повинні поставити будь-який комп'ютер на коліна; якщо ні, то компілятор докладає максимум зусиль для оптимізації.
Йохан Буле,

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.