Ist es möglich, Java in Maschinencode zu kompilieren? (Nicht Bytecode)


32

Können Sie Java direkt in Maschinencode kompilieren lassen?

Ich möchte dies tun, damit ich die Kontrolle über die verwendeten Plattformen habe und C, C ++ usw. nicht kenne.

Antworten:


36

Es scheint , dass die GNU Compiler für Java können Java - Quellcode in jeder Java - Bytecode oder Maschinencode konvertieren. Es kann auch vorhandenen Java-Bytecode in Maschinencode konvertieren. Die letzten Nachrichten stammen jedoch aus dem Jahr 2009, daher bin ich mir nicht sicher, wie aktuell sie sind und ob sie die neuesten Funktionen der Java-Sprache unterstützen.


1
Wenn sich der Java-Bytecode seit 2009 nicht geändert hat, sollte dies immer noch funktionieren, ohne dass Entwickler "Hey! Ich bin immer noch hier" -Flaggen über der Software schwenken.
Robert Harvey

@RobertHarvey Ich glaube, dass Java 7 einige neue Sprachkonzepte eingeführt hat, so dass es möglicherweise fehlschlägt, Quelldateien in Maschinencode zu konvertieren. Wenn sich auch der Bytecode mit diesen neuen Funktionen geändert hat, schlägt dies ebenfalls fehl
Thomas Owens

1
Excelsior JET scheint noch aktiv zu sein (kommerziell). Es gab Fujitsu TowerJ, aber das scheint vor einem Jahrzehnt gestorben zu sein und war damals ziemlich sinnlos.
Tom Hawtin - Tackline

Ich verwende Java 6, damit Java 7 in meinem Fall kein Problem ist
Russell

1
Die Website von GCJ sagt, dass sie selbst Java 1.5 nicht vollständig unterstützt. Siehe diesen Thread: stackoverflow.com/a/4040404/1257384
GregT

13

Nicht ganz direkt auf das OP antwortend, aber vielleicht eine interessante Seite. Java kann in drei Modi ausgeführt werden:

  1. Mixed (Standard) - Eine Kombination aus interpretiertem und maschinell kompiliertem Code (maschinell kompiliert == zur Laufzeit von JIT kompiliert)
  2. Mit -XintFlag - Interpreted - Nur Byte-Code
  3. Mit -XcompFlag - kompiliert - Maschine kompiliert

1
@Martjin Sind das für den HotSpot? Haben Sie zufällig einen Hinweis auf die, -Xcompweil ich diesen nicht in der Dokumentation zu JDK 7 oder den HotSpot-Optionen gefunden habe und nicht sicher bin, ob Sie einige Geheimnisse der Mailingliste haben, die wir, die Sterblichen, nicht kennen :-)
Edalorzo

2
Es ist eine bewusst versteckte Option, ja :-). Es gibt verschiedene Mailinglisten für openjdk (openjdk.java.net), bei denen Sie diese Art von Informationen abrufen oder den Quellcode lesen können :-)
Martijn Verburg

Bitte beachten Sie, dass -Xcomp nach meinen Tests in einigen Fällen eine um den Faktor 2 schlechtere Leistung aufweisen kann.
Daniel Lemire

Gut ja. Just-in-Time-Optimierungen sind schwierig, wenn die JIT nicht einmal ausgeführt wird. Kann haben! = Wird haben.
candied_orange

ähm das sind also optionen dazu javac? Gibt es bei Verwendung von -Xcomp standardmäßig eine einzelne Binärdatei aus?
Alexander Mills

7

Es ist möglicherweise besser, das Betriebssystem mit System.getProperty ("os.name") zu erkennen . Damit können Sie mehr als ein Betriebssystem unterstützen, andere jedoch ausschließen.


Gibt es eine Möglichkeit, dies zu täuschen / zu spielen?
FrustratedWithFormsDesigner

@ Wahrscheinlich frustriert, aber ich ging davon aus, dass er nicht offiziell Betriebssysteme unterstützen wollte, die er nicht getestet hat. Andernfalls ist es nicht sinnvoll, absichtlich die Portabilität zu deaktivieren, die Sie im Wesentlichen kostenlos erhalten.
Karl Bielefeldt

Es kann auch sein, dass er das Programm betriebssystemunabhängig an bestimmte Hardware binden möchte.
FrustratedWithFormsDesigner

Sie können „os.name“ Systemeigenschaft erzwingen , indem spezielles Argument für JVM verwendet: java -Dos.name=MacOS.
SkyDan

2

Es ist jetzt so: Mit GraalVM können Sie Ihre Programme vorab in eine native ausführbare Datei kompilieren. Schauen Sie sich die native-image- Funktion an:

Verwandte Frage: 'Kann ich Java in nativen Code kompilieren?' https://stackoverflow.com/questions/2991799/can-i-compile-java-to-native-code/50555050#50555050


PS GCJ wird nicht mehr gepflegt.
Quelle: 'Die Löschung von gcj' http://tromey.com/blog/?p=911

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.