Kann ich Java zu nativem Code kompilieren?


81

Gibt es eine Möglichkeit, von Java zu eigenständigem (oder Bibliotheks-) Maschinencode zu kompilieren, ohne dass eine JVM erforderlich ist?


3
"kompilieren" ist das Wort, nach dem Sie suchen (anstatt "kompilieren").
TJ Crowder

6
Wenn Ihr Interesse an Geschwindigkeit liegt, stören Sie sich nur, wenn Sie sich eine Plattform ansehen, die HotSpot (Suns JVM) nicht unterstützt. HotSpot kompiliert Bytecode im laufenden Betrieb zu nativem Code, wo immer ein "Hotspot" des Ausführungspfads (etwas, das häufig ausgeführt wird) angezeigt wird, und es ist sehr gut darin. Aber wenn Sie vermeiden möchten, eine JVM zu benötigen, schauen Sie sich den GCJ an, auf den James Sie hingewiesen hat.
TJ Crowder

3
Ein weiterer Grund ist der Schutz vor Java-Dekompilierern. Die Leistung von HotSpot gegen nativen Compiler (gegen JRockit gegen IBM gegen GCC gegen Visual C ++ gegen Handschrift-CPU-Anweisungen-in-Hex) hängt von der Anwendung ab, also YMMV.
Dmitry Leskov

1
Ich fand eine interessante Entwicklung von Oracle für die Oracle-Datenbank JServer Accelerator. Es wurde auch so konzipiert, dass es in gewisser Weise plattformabhängig ist, indem es nicht zu Bytecodes, sondern zu C-Code kompiliert wird. docs.oracle.com/cd/A87860_01/doc/java.817/a83727/jtools5.htm
Supernova

6
Ich verstehe nicht, warum diese Frage von den Moderatoren geschlossen wurde. Es scheint mir vollkommen klar zu sein. Wenn sie es nicht verstehen, liegt das Problem vielleicht bei ihnen.
Isapir

Antworten:


40

Früher gab es ein Tool namens GCJ, das Teil von GCC war, aber es wurde entfernt . Jetzt verweisen alle Links auf der GCC-Site auf ihre Nicht-GCJ-Entsprechungen.

NB: Die Kommentare bezogen sich alle auf meine ursprüngliche Antwort, wonach Sie Java mit GCJ zu nativem Code kompilieren können.


2
Ja, gcj ist das bekannteste. @ isola009: Beachten Sie, dass Sie beim Kompilieren in nativen Code wahrscheinlich mit einer Teilmenge (möglicherweise einer dramatisch kleinen Teilmenge) der Bibliotheken arbeiten , über die Java normalerweise standardmäßig verfügt. Gnus ist in jeder Hinsicht ziemlich gut, aber weit hinter dem aktuellen JDK.
TJ Crowder

Es liegt weit hinter allen JDKS ab 1.2. Ich habe viele Support-Probleme mit Leuten festgestellt, die versehentlich GNU-Klassenpfad anstelle von Java ausgeführt haben, und sie wurden alle ausnahmslos durch Deinstallation und Verwendung eines Sun JDK behoben.
Marquis von Lorne

Excelsior JET enthält eine lizenzierte Implementierung der Java SE 6-Standardbibliothek und hat die offiziellen Konformitätstests (JCK) bestanden. Es ist jetzt auf dem 6u18-Level, die nächste Version wird voraussichtlich 6u20 unterstützen.
Dmitry Leskov

27

Ja!

Oracle hat an GraalVm gearbeitet, das native Images unterstützt. Überprüfen Sie hier: https://www.graalvm.org/

Natives Image Die native Image-Funktion mit dem GraalVM SDK verbessert die Startzeit von Java-Anwendungen und verringert den Platzbedarf. Tatsächlich wird Bytecode, der auf der JVM (auf jeder Plattform) ausgeführt wird, in nativen Code für ein bestimmtes Betriebssystem / eine bestimmte Plattform konvertiert - daher kommt die Leistung. Es werden aggressive AOT-Optimierungen verwendet, um eine gute Leistung zu erzielen.

Mehr sehen:


Leider ist auch dieses Projekt für die Produktion nicht stabil und die Verwendung der Swing-API wird immer noch nicht unterstützt /
fehlerhaft

"GraalVM 19.0 Release:" GraalVM ist endlich ausgereift und bereit für den produktiven Einsatz. "Natürlich wird es Fehler und einige noch nicht vollständige Funktionen geben. Aber Twitter verwendet es für seine Produktionssysteme, daher stimme ich Ihrem ersten nicht zu Anspruch.
RobAu

Meine persönliche Erfahrung ist, dass Windowsnur Spielzeugprogramme funktionieren, aber alles, was fortgeschrittener ist und / oder wenn man ein verwendet, GUInoch nicht ganz da ist. Twitterverwendet wahrscheinlich Linuxohne, GUIaber sie verwenden wahrscheinlich auch die kommerzielle Version, während ich nur die Community ausprobiert habe. Es kann für einige Anwendungsfälle aber Java funktionierenWindows Desktopanwendungen gehören nicht dazu, was das Projekt dennoch etwas enttäuschend macht. Excelsior JETkönnte dies zuverlässig tun, aber es wird jetzt eingestellt.
BullyWiiPlaza


11

Ja, die JIT in der JVM erledigt genau das für Sie.

Tatsächlich kann es schnelleren Code erzeugen als das vorherige Kompilieren des Codes, da es Code generieren kann, der für die spezifische Plattform optimiert ist, basierend darauf, wie der Code zur Laufzeit verwendet wird.

Die JVM ist immer beteiligt, auch wenn ein sehr hoher Prozentsatz zu nativem Code kompiliert wird, da Sie Bytecode dynamisch laden und ausführen können.


18
Ja, Sie haben Recht, dass die JIT es tut und es sehr gut macht. Es macht keine eigenständige ausführbare Datei, aber dann hat das OP nicht danach gefragt ...
Bill K

2
Sie scheinen zu vermuten, dass nur JITs plattformspezifische Optimierungen durchführen können. Ich denke, es ist möglich, wann immer Sie Bytecode versenden. Der ART kompiliert den Bytecode bei der Installation zu nativem Code und ist keine JIT. Peter, hast du irgendwelche Kommentare dazu?
Janus Troelsen

2
OP erwähnt, Standalone, was jede Art von JIT ausschließt: Während JIT nativen Code im laufenden Betrieb erzeugt, ist er niemals eigenständig.
StormByte

1
@KurtFitzner Ich denke, Sie haben eine ganz andere Vorstellung davon, was der JIT-Compiler macht. Er kompiliert zu nativem Code, bei dem die Interpretation nicht beteiligt ist.
Peter Lawrey

2
Ich glaube nicht, dass sich ein JIT-Compiler so viele tiefgreifende Optimierungen leisten kann wie native AOT-Compiler / Linker: Das Kompilieren und Verknüpfen mit vollständiger Optimierung sollte jeden Computer in die Knie zwingen. Wenn nicht, unternimmt der Compiler nicht die besten Anstrengungen, um zu optimieren.
Johan Boulé

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.