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?


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.


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:


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


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.


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é

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.