Die GraalVM: Javas Sprung in die Gegenwart?

Seite 4: Oder vielleicht doch nicht Java? Oder nur ein bisschen?

Inhaltsverzeichnis

Dank der GraalVM ist es nun möglich, eine Reihe weiterer Sprachen auf der JVM zu verwenden, die bisher nicht direkt dort verfügbar waren, zum Beispiel JavaScript, Ruby oder R, aber auch C oder C++. Und nicht nur das: Die Sprachen können gemischt und in unterschiedlichen Umgebungen ausgeführt werden. Die GraalVM hebt die polyglotte Programmierung damit auf ein neues Level.

Das erlaubt beispielsweise das Verwenden von Funktionen, die in einer anderen Sprache bereits implementiert sind (z. B. den Einsatz von npm-Modulen in Java-Code) oder die Wahl der besten Sprache für das jeweilige Problem, ohne direkt die gesamte Applikation in einer Sprache implementieren beziehungsweise die Ausführungsumgebung ändern zu müssen (z. B. die Verwendung von R für die Darstellung von Graphen innerhalb einer Node-Anwendung). All das ist denkbar, weil das GraalVM-Team Sprachen basierend auf dem Sprach-Framework Truffle neu implementieren konnte. Truffle erlaubt es auf effiziente Weise, neue Sprachen für das Ausführen auf der GraalVM fit zu machen – dazu muss man lediglich mit Truffle einen Parse Tree (AST) bereitstellen. Die Übersetzung in Maschinencode mit zahlreichen Optimierungen übernimmt der Graal-Compiler. Zudem bietet die GraalVM ein Protokoll für die Interoperabilität zwischen Sprachen, das den effizienten Austausch von Werten zwischen Sprachen ermöglicht. Die Verwendung von JavaScript-Code innerhalb von Java-Code sieht mit GraalVM wie folgt aus:

try (Context context = Context.create()) {
String name = "world";
Value result = context.eval("js", "'Hello " + name + "'");
System.out.println(result.asString());
}

Das Listing übergibt den Wert einer Java-Variable an den Kontext für die Ausführung von JavaScript und verwendet das Resultat wiederum in Java. Die Interoperabilität geht jedoch deutlich über das einfache Beispiel hinaus. Es wäre genauso möglich, innerhalb von JavaScript-Code Java-Objekte zu instanziieren, oder in Java-Code Methoden auf einem in JavaScript definierten Objekt oder umgekehrt aufzurufen.

Für das Ausführen von Code in unterschiedlichen Sprachen ohne die oben gezeigte Einbettung in Java liefert die GraalVM eine Reihe von Binaries wie js, node oder ruby, die als Ersatz für die existierenden Binaries dienen, unter der Haube die GraalVM verwenden und dadurch ebenfalls Polyglot-Support bieten. Es ist sogar möglich, die GraalVM innerhalb einer Oracle- oder MySQL-Datenbank zu verwenden und so JavaScript-Code direkt in der Datenbank auszuführen.

Als weiteren Leckerbissen liefert die GraalVM einen Debugger, der für jede auf Truffle implementierte Sprache Einsicht in das laufende Programm bietet. Entwickler können den Debugger über die Option --inspect aktivieren, danach ist er über die Chrome Dev Tools verfügbar. Das Ausführen eines JavaScript-Programms kann man folglich über js --inspect test.js debuggen.