Czy mogę skompilować Javę do kodu natywnego?

82

Czy istnieje sposób na skompilowanie kodu maszynowego Java do samodzielnego (lub bibliotecznego) kodu maszynowego bez konieczności posiadania maszyny JVM?

barroco
źródło
3
„kompilować” to słowo, którego szukasz (zamiast „kompilować”).
TJ Crowder
7
Jeśli interesuje Cię szybkość, nie przejmuj się, chyba że patrzysz na platformę, której HotSpot (JVM firmy Sun) nie obsługuje. HotSpot kompiluje kod bajtowy do kodu natywnego w locie wszędzie tam, gdzie pojawia się „hotspot” ścieżki wykonania (coś, co jest często uruchamiane) i jest w tym bardzo dobry. Ale jeśli chcesz uniknąć wymagania JVM, tak, spójrz na gcj James, który ci wskazał.
TJ Crowder
3
Kolejnym powodem jest ochrona przed dekompilatorami Javy. Jeśli chodzi o wydajność HotSpot vs natywny kompilator (vs JRockit vs IBM vs GCC vs Visual C ++ vs hand-writing-CPU-instructions-in-hex), zależy to od aplikacji, więc YMMV.
Dmitry Leskov
1
Znalazłem interesujące rozwiązanie Oracle dla bazy danych Oracle o nazwie JServer Accelerator. Został również zaprojektowany tak, aby był w pewien sposób zależny od platformy, kompilując nie do kodu bajtowego, ale do kodu C. docs.oracle.com/cd/A87860_01/doc/java.817/a83727/jtools5.htm
supernova
6
Nie rozumiem, dlaczego moderatorzy zamknęli to pytanie. Wydaje mi się to zupełnie jasne. Jeśli tego nie rozumieją, może problem leży po ich stronie.
isapir

Odpowiedzi:

40

Kiedyś istniało narzędzie o nazwie GCJ, które było częścią GCC, ale zostało usunięte . Teraz wszystkie linki w witrynie GCC przekierowują do ich odpowiedników innych niż GCJ.

Uwaga: wszystkie komentarze odnosiły się do mojej oryginalnej odpowiedzi, mówiącej, że można skompilować Javę do kodu natywnego za pomocą GCJ.

James Kingsbery
źródło
2
Tak, najbardziej znany jest gcj. @ isola009: Pamiętaj, że podczas kompilacji do kodu natywnego prawdopodobnie będziesz pracować z podzbiorem (prawdopodobnie dramatycznie małym podzbiorem) bibliotek, które Java zwykle ma domyślnie. Gnu jest całkiem niezłe, pod każdym względem, ale daleko w tyle za obecnym JDK.
TJ Crowder
Jest daleko w tyle za wszystkimi JDKS zaczynającymi się od 1.2. Napotkałem wiele problemów z obsługą, gdy ludzie przypadkowo uruchomili ścieżkę klas GNU zamiast Javy i wszyscy bez wyjątku zostali wyleczeni przez odinstalowanie jej i użycie Sun JDK.
user207421
Excelsior JET zawiera licencjonowaną implementację standardowej biblioteki Java SE 6 i przeszedł oficjalne testy zgodności (JCK). Jest teraz na poziomie 6u18, oczekuje się, że następna wersja będzie obsługiwać 6u20.
Dmitry Leskov
27

Tak!

Oracle pracuje nad GraalVm, który obsługuje obrazy natywne. Sprawdź tutaj: https://www.graalvm.org/

Obraz natywny Funkcja obrazu natywnego w pakiecie SDK GraalVM pomaga skrócić czas uruchamiania aplikacji Java i zapewnia im mniejszy ślad. W efekcie konwertuje kod bajtowy działający w maszynie JVM (na dowolnej platformie) na kod natywny dla określonego systemu operacyjnego / platformy - stąd pochodzi wydajność. Korzysta z agresywnych optymalizacji z wyprzedzeniem (AOT), aby osiągnąć dobrą wydajność.

Zobacz więcej:

RobAu
źródło
Niestety, nawet ten projekt nie jest stabilny pod względem produkcyjnym, a używanie Swing API jest nadal nieobsługiwane / buggy: github.com/oracle/graal/issues/1327
BullyWiiPlaza
„Wersja GraalVM 19.0:„ GraalVM jest wreszcie dojrzała i gotowa do użytku produkcyjnego ”. Oczywiście będą błędy i pewna jeszcze niekompletna funkcjonalność. Jednak Twitter używa go w swoich systemach produkcyjnych, więc nie zgadzam się z Twoim pierwszym roszczenie
RobAu
Moje osobiste doświadczenie jest takie, że działają Windowstylko programy zabawkowe, ale nic bardziej zaawansowanego i / lub gdy używam, GUInie jest jeszcze dostępne. Twitterprawdopodobnie używa Linuxbez żadnego, GUIale prawdopodobnie używają również wersji komercyjnej, podczas gdy ja wypróbowałem tylko wersję społecznościową. Może to działać w niektórych przypadkach, ale aplikacje Windowskomputerowe Java nie są jedną z nich, co nadal sprawia, że ​​projekt jest nieco rozczarowujący. Excelsior JETmoże to zrobić niezawodnie, ale teraz zostało przerwane.
BullyWiiPlaza
19

Excelsior JET to komercyjny kompilator Java do natywnego kodu. Jednak w maju 2019 został przerwany.

znak
źródło
3
Na wszelki wypadek istnieją darmowe licencje na projekty niekomercyjne.
Dmitry Leskov
1
jak wypada to w porównaniu z RoboVM?
Janus Troelsen
15 maja 2019 roku Excelsior JET został wycofany. Zobacz: en.wikipedia.org/wiki/Excelsior_JET
Stephan,
10

Tak, JIT w JVM robi dokładnie to za Ciebie.

W rzeczywistości może generować kod szybszy niż kompilowanie kodu z wyprzedzeniem, ponieważ może generować kod zoptymalizowany dla określonej platformy w oparciu o sposób wykorzystania kodu w czasie wykonywania.

JVM jest zawsze zaangażowana, nawet jeśli bardzo wysoki procent jest kompilowany do kodu natywnego, ponieważ można dynamicznie ładować i uruchamiać kod bajtowy.

Peter Lawrey
źródło
18
Tak, masz rację, że JIT to robi i robi to bardzo dobrze. Nie tworzy samodzielnego pliku wykonywalnego, ale wtedy OP nie pytał o to ...
Bill K,
2
Wydaje się, że sugerujesz, że tylko JIT mogą wykonywać optymalizację dla konkretnej platformy. Myślę, że jest to możliwe, gdy wysyłasz kod bajtowy. ART kompiluje kod bajtowy do kodu natywnego podczas instalacji i nie jest to JIT. Peter, masz jakieś uwagi na ten temat?
Janus Troelsen
2
OP wspomina, autonomiczny, który po prostu wyklucza każdy rodzaj JIT: chociaż JIT tworzy natywny kod w locie, nigdy nie jest samodzielny.
StormByte
1
@KurtFitzner Myślę, że masz zupełnie inne wyobrażenie o tym, co robi kompilator JIT, kompiluje on do kodu natywnego, gdzie nie jest wymagana interpretacja.
Peter Lawrey
2
Nie wierzę, że kompilator JIT może pozwolić sobie na tak wiele głębokich optymalizacji, jak natywne kompilatory / linkery AOT: kompilowanie i linkowanie z pełną optymalizacją powinno postawić każdy komputer na kolanach; jeśli nie, to kompilator nie podejmuje wszelkich starań, aby zoptymalizować.
Johan Boulé
0

Inną możliwością byłoby RoboVM. Jednak wydaje się, tylko do pracy Linux, iOSaMac OS X .

Na dzień dzisiejszy projekt nadal wydaje się nieco żywy, w przeciwieństwie do niektórych postów internetowych twierdzących, że projekt jest martwy .

BullyWiiPlaza
źródło