Czy można skompilować Javę w kodzie maszynowym? (Bez kodu bajtowego)

32

Czy potrafisz skompilować Javę bezpośrednio do kodu maszynowego?

Chcę to zrobić, więc mam kontrolę nad platformami, na których jest używany, i nie znam C, C ++ itp.

Russell
źródło

Odpowiedzi:

36

Wygląda na to, że kompilator GNU dla Java może konwertować kod źródłowy Java na kod bajtowy Java lub kod maszynowy. Może także konwertować istniejący kod bajtowy Java na kod maszynowy. Jednak ostatnie wiadomości pochodzą z 2009 roku, więc nie jestem pewien, czy jest aktualny i czy może obsłużyć najnowsze funkcje języka Java.

Thomas Owens
źródło
1
Jeśli kod bajtowy Java nie zmienił się od 2009 roku, powinno to nadal działać bez programistów machających flagami „Hej! Nadal tu jestem” nad oprogramowaniem.
Robert Harvey
@RobertHarvey Wierzę, że Java 7 wprowadziła nowe koncepcje językowe, więc może się nie powieść przy konwersji plików źródłowych na kod maszynowy. Jeśli kod bajtowy również zmienił się wraz z tymi nowymi funkcjami, to również by się nie udało
Thomas Owens
1
Wydaje się, że Excelsior JET jest nadal aktywny (komercyjny). Była Fujitsu TowerJ, ale wydaje się, że zmarła dziesięć lat temu i wtedy była całkiem bezcelowa.
Tom Hawtin - tackline
Używam java 6, więc java 7 nie stanowi problemu w moim przypadku
Russell
1
Witryna GCJ twierdzi, że nie w pełni obsługiwała nawet Javę 1.5. Zobacz ten wątek: stackoverflow.com/a/4040404/1257384
GregT
13

Nie całkiem bezpośrednio odpowiadając na PO, ale być może interesujący. Java może być uruchomiona w trzech trybach:

  1. Mieszane (domyślnie) - kombinacja kodu zinterpretowanego i skompilowanego maszynowo (maszyna skompilowana == skompilowana przez JIT w czasie wykonywania)
  2. Z -Xintflagą - Interpretowane - Tylko kod bajtowy
  3. Z -Xcompflagą - skompilowane - skompilowane maszynowo
Martijn Verburg
źródło
1
@Martjin Czy to dla HotSpot? Czy masz przypadek referencji, -Xcompponieważ nie mogłem znaleźć tego w dokumentacji JDK 7 lub dokumentacji opcji HotSpot i nie jestem pewien, czy masz jakieś ukryte tajemnice list mailowych, o których my, zwykli śmiertelnicy, nie jesteśmy świadomi :-)
edalorzo
2
Jest to celowo ukryta opcja tak :-). Istnieje wiele list mailingowych openjdk (openjdk.java.net), z których możesz zebrać takie informacje - lub przeczytać kod źródłowy :-)
Martijn Verburg
Należy pamiętać, że według moich testów -Xcomp może mieć gorszą wydajność (dwa razy) w niektórych przypadkach.
Daniel Lemire,
No tak W samą porę trudno jest przeprowadzić optymalizację, gdy JIT nawet nie działa. Może mieć! = Będzie miał.
candied_orange
ummm, więc są to opcje javac? czy przy użyciu -Xcomp domyślnie wyświetla pojedynczy plik binarny?
Alexander Mills
7

Lepszym rozwiązaniem może być wykrycie systemu operacyjnego za pomocą System.getProperty („nazwa os”) . Pozwoliłoby to wybrać więcej niż jeden system operacyjny, ale wykluczyć inne.

Karl Bielefeldt
źródło
Czy istnieje sposób, aby to oszukać / zagrać w grę?
FrustratedWithFormsDesigner
@ Prawdopodobnie sfrustrowany, ale zakładałem, że jego intencją było powstrzymanie się od oficjalnej obsługi systemów operacyjnych, których nie przetestował. W innym przypadku nie ma sensu celowo wyłączać przenośności, którą dostajesz zasadniczo za darmo.
Karl Bielefeldt
Możliwe też, że chce powiązać program z określonym sprzętem w sposób niezależny od systemu operacyjnego.
FrustratedWithFormsDesigner
Można wymusić „os.name” właściwości systemu przy użyciu specjalnych argumentów dla JVM: java -Dos.name=MacOS.
SkyDan
2

Teraz jest: GraalVM pozwala na wcześniejsze skompilowanie programów w natywny plik wykonywalny. Spójrz na funkcję obrazu natywnego :

Powiązane pytanie: „Czy mogę skompilować Javę do kodu natywnego?” https://stackoverflow.com/questions/2991799/can-i-compile-java-to-native-code/50555050#50555050


PS GCJ nie jest już obsługiwany.
Źródło: „The Deletion of gcj” http://tromey.com/blog/?p=911

Vlad Zamskoi
źródło