Was sich jedoch dem Einfluss entzieht, ist die zugrunde liegende Java- beziehungsweise JDK-Plattform mit der dort verfügbaren JVM. Achtet diese nicht auf Ausführungseffizienz, so begrenzt sie die Möglichkeiten signifikant, was sich auch in Bezug auf „fremde“ Komponenten auswirkt. Die liegen oft nicht im Quellcode vor. Selbst wenn sie als Open-Source-Software (OSS) zur Verfügung stehen, weisen sie eine nicht zu unterschätzende Komplexität auf, was Änderungen zur Optimierung betrifft. Und selbst wenn Änderungen sich als nicht komplex erweisen, müssten Entwickler diese Änderungen in die OSS-Komponenten einbringen, um nicht den Versionierungstod durch ständiges Nachziehen des Codes zu sterben.
Ausführbarer nativer Code ist oft effizienter als die Ausführung in der JVM
Bekanntermaßen ist ausführbarer nativer Code oft effizienter als die Ausführung in der JVM. Daher liegt der Wunsch nahe, Java-Anwendungen in nativen Code zu übersetzen. Genau das bietet die GraalVM von Oracle. Die GraalVM ist im Grunde genommen eine komplette Plattform mit Werkzeugen und Bibliotheken. Sie besitzt unter anderem eine reine JVM-Implementierung und ein JDK-Framework.
Sie bietet zusätzlich den Native Image Builder beziehungsweise native-image, ein Werkzeug, das die Metainformation aus bestehendem Java-Code dafür nutzt, um daraus nativen, optimierten Code für die vorliegende Hardwareplattform zu erzeugen. Dieses Vorgehen firmiert unter dem Namen AOT-Compiling (AOT = Ahead of Time). Vor dem Aufruf von native-image ist die Übersetzung mit dem Java-Compiler javac erforderlich, weil das Werkzeug auf Java-Bytecode aufsetzt.
Dies setzt natürlich voraus, dass die Ausführung der Java-Anwendung tatsächlich alle Ablaufpfade durchläuft, weil native-image nur statische Metainformation erfassen kann, die es vom initialen Startpunkt der Anwendung erreicht. Kommen nicht alle Codepfade im dynamischen Ablauf vor, können Programmierer die benötigte Information auch manuell in einer Konfigurationsdatei spezifizieren. Als Eingabe für native-image funktionieren neben Java-Class-Dateien auch JAR-Dateien oder Java-Module.
Das funktioniert bei der GraalVM selbst für das Nutzen von Java Reflection, besitzt aber dort auch Grenzen. Beispielsweise existieren in Log4j im Gegensatz zu Logback einige Funktionalitäten, die wegen des Gebrauchs von Reflection die Anwendung von native-image verhindern. Als Faustregel lässt sich grob sagen, dass alle Log4j-Funktionalität, die sich auch in Logback findet, für native-image geeignet ist.
In diesem Zusammenhang bietet sich der Einsatz von SLF4J (Simple Logging Facade for Java) an, das erlaubt, das Logging-Framework über eine Wrapper-Schicht zu verbergen. Dadurch ist es sogar möglich, in Projekten das Logging-Framework gegen ein anderes auszutauschen. Viele Frameworks sind kompatibel mit native-image, so zum Beispiel Spring Boot. Selbstverständlich stellt GraalVM diverse GC-Implementierungen bereit, von denen der Entwickler die jeweils geeignetste herauspickt.
Doch was bringt das Ganze? In einem meiner letzten Projekte ergaben sich durch GraalVM-erzeugten nativen Code erhebliche Vorteile gegenüber einer JVM, sowohl in Bezug Initialisierungszeit als auch Laufzeit, obwohl auch die JVM-Implementierung effizient ist.
GraalVM bietet den Native Image Builder
Das in der GraalVM-Plattform integrierte Truffle Language Implementation Framework hilft bei der Implementierung eigener Werkzeuge oder Programmiersprachen. Es erzeugt Interpreter für sich selbst modifizierende abstrakte Syntaxbäume. Wer sich an die Vorgaben des Polyglot TCK (Polyglot API-based Test Compatibility Kit) hält, stellt sicher, dass die eigene Truffle-Sprachimplementierung auch mit anderen kompatiblen Truffle-Implementierungen zusammenarbeiten kann. Die Dokumentation stellt mit simpletool ein einfaches Beispiel zur Verfügung, das Entwickler auch als Basis für eigene Truffle-Implementierungen verwenden können.
Einige Teile von GraalVM wie native-image existieren nicht in der Community-Edition. Dafür ist die frühere Enterprise-Version jetzt drei Jahre lang ohne Lizenzkosten nutzbar.
Sie finden in dieser Ausgabe Schwerpunktartikel zum obigen Thema. In diesem Sinne wünsche ich Ihnen viel Vergnügen beim Lesen und dem Gewinnen neuer Erkenntnisse.
Ihr Prof. Dr. Michael Stal