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.

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.


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

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.


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

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.