Neben Java bzw JVM-Bytecode unterstützt GraalVM auch die Ausführung von LLVM-Bitcode.
$ cat > test.c
#include <stdio.h>
int main(void) {
printf("Hello World!\n");
return 0;
}
$ clang -c -emit-llvm test.c
$ $GRAALVM/bin/lli test.bc
Hello World!
Schon mal interessant, lustig wird es aber erst, wenn man dies mit Java kombiniert. Mit der Polyglot-API kann die Bitcode-Datei geladen, und einzelne Funktionen daraus ausgeführt werden.
import org.graalvm.polyglot.*;
import java.io.*;
public class HelloPolyglot {
public static void main(String[] args) {
try {
// create a polyglot context that can access the native interface
Context ctx = Context.newBuilder().allowAllAccess(true).build();
// load an llvm bitcode file
File file = new File("test.bc");
Source source = Source.newBuilder("llvm", file).build();
Value c = ctx.eval(source);
// get the main function and execute it
c.getMember("main").execute();
} catch (IOException e) {
System.err.println(e);
}
}
}
Ich hab auch ein etwas größeres Beispielprogramm.
Links:
Sprachen die innerhalb einer virtuellen Maschine laufen gibt es viele, wie beispielsweise Java, Python oder JavaScript. Dabei hat jede Sprache meistens ihre eigene VM, die speziell für ihre Sprache entworfen wurde. Andere Sprachen laufen dann entweder gar nicht in dieser VM, oder mit geringer Performance.
Nach jahrelanger Entwicklungsarbeit hat Oracle nun GraalVM vorgestellt, eine universale VM, die nicht speziell für eine Zielsprache designed ist, sondern unterschiedliche Programmiersprachen gleich gut mit ähnlicher Performance unterstützt. Dabei sind zur Laufzeit die Datenstrukturen der Sprachen auch kompatibel, wodurch es ohne Overhead möglich ist, Funktionen einer anderen Sprache aufzurufen.
Aktuell unterstützt werden JVM basierte Sprachen sowie JavaScript und LLVM-Bitcode. Bisher nur experimentell werden außerdem Ruby, R und Python unterstützt. Damit ist es also problemlos möglich, Rust oder C++-Code, der zu LLVM-Bitcode kompiliert wurde, mit Java oder JavaScript zu mischen. Die völlige Wahlfreiheit der Programmiersprache, ohne dabei durch Performance oder Verfügbarkeit von Bibliotheken beschränkt zu sein, ist tatsächlich ein interessantes Versprechen.
Auch interessant ist die Möglichkeit, Java-Anwendungen zu einem nativen Image zu kompilieren, was die Startzeit drastisch verkürzt und den Speicherverbrauch senkt.
Technisch gesehen setzt GraalVM auf einer normalen JVM auf, mit einem komplett neuen JIT-Compiler und APIs, über die neue Sprachen wie JavaScript in GraalVM eingebunden werden können. Oracle hat dabei die Hoffnung, dass Third-Party-Entwickler ihre Programmiersprachen für GraalVM adaptieren. Ich kann mir jedoch vorstellen, dass viele beim Thema Java bzw JVM erstmal skeptisch sind, ganz unabhängig von Oracle und irgendwelchen juristischen Fragen. Die JVM gilt nicht als besonders schlank, die Startzeiten von Java-Anwendungen sind zu lang und der Speicherverbrauch ist hoch. Auf dem Desktop gibt es kaum noch Java-Anwendungen, bis auf die paar Entwicklungsumgebungen.
GraalVM Webseite
Download
Beispiele