© F. J. CARNEROS/Shutterstock.com
Eine ausführliche Einführung in die GraalVM – Teil 5

Polyglotte Entwicklung mit GraalVM


Polyglotte Entwicklung wird seit vielen Jahren propagiert und sie ist in vielen Projekten angekommen. Ihre Vorteile kann sie aber meist noch nicht ausspielen. Im Gegenteil, sie geht uns in vielen Projekten gehörig auf die Nerven. Jede Programmiersprache braucht ihr eigenes Ökosystem, das installiert, gepflegt und gehegt werden muss. GraalVM verspricht Abhilfe – und macht uns zugleich neugierig, wie gut GraalVM mit einer Vielzahl von Programmiersprachen zurechtkommt.

Wir haben in die Tasten gegriffen und ein paar Beispiele auf GitHub [1] für euch vorbereitet. Nur gibt es davon wenig zu erzählen. Wir haben ein paar Programme in Ruby und in JavaScript geschrieben, und sie liefen mit der GraalVM genauso gut wie gewohnt. Na ja, nicht ganz: Als wir GraalVM an seine Grenzen bringen wollten und das Angular CLI ausprobiert haben, gab es tatsächlich einen Fehler. Nachdem wir das im Slack-Channel erwähnt haben, wurde der Fehler sehr schnell und unbürokratisch behoben. Das empfinden wir als starkes Signal: GraalVM versteht sich als vollwertige Laufzeitumgebung für JavaScript und Node.js.

Im Internet liest man manchmal kritische Kommentare, dass GraalVM noch nicht ausgereift sei – nur: konkrete Beispiele dafür haben wir nicht gefunden. Das begeistert uns, weckt aber natürlich auch unsere Neugier und unsere Skepsis. GraalVM hat sich so unglaublich viel vorgenommen – und das soll alles auf Anhieb funktionieren? In der Autorenbiografie haben wir eine E-Mail-Adresse für euch hinterlegt und laden euch ein, eure Erfahrungen mit uns zu teilen.

Da fast alles, was wir ausprobiert haben, auf Anhieb funktioniert hat, haben wir uns auf Performancemessungen konzentriert. Da gab es einige Überraschungen: Manche Programmiersprachen laufen auf GraalVM sogar schneller als die Originalimplementationen.

GraalVM als Schweizer Taschenmesser

Es wäre zu kurz gesprungen, GraalVM nur als neue Implementierung altbekannter Programmiersprachen zu betrachten. Das allein wäre schon ein guter Grund, GraalVM zu verwenden. Im letzten Jahr habe ich (Stephan) unzählige Stunden damit verbracht, alle Programmiersprachen zu installieren, die unser polyglottes Projekt verwendet. Jetzt laufen auf meinem Rechner Ruby, Python, Groovy, Kotlin, Scala und TypeScript. Trotzdem kommt es immer wieder vor, dass ich eine weitere Sprache installiere, wenn ich wieder einen anderen Microservice betreuen muss.

Zugegeben: Es gibt nur wenige Projekte, die eine solche Vielfalt entwickeln. Die meisten Projekte kommen mit weniger Sprachen aus. Was aber nichts daran ändert, dass ein Schweizer Taschenmesser wie GraalVM sehr praktisch wäre: eine gemeinsame Laufzeitumgebung für alle Programmiersprachen. Meistens ist das Ärgernis nicht in erster Linie, dass ich mich schon wieder mit einer neuen unbekannten Programmiersprache beschäftigen muss. Viel ärgerlicher ist es, dass jede Programmiersprache ihr ganz eigenes Ökosystem mitbringt. Es dauert eine Weile, die Sprache zu installieren und zu verstehen, wie sie verwendet wird.

GraalVM verspricht die Einstiegshürde deutlich zu senken und euch viel schneller produktiv werden zu lassen. Das öffnet Freiraum für Experimente: Ihr könnt viel leichter ausprobieren, ob eine andere Sprache für euren Einsatzzweck geeigneter ist.

Mit anderen Worten: Die besondere Stärke von GraalVM ist seine Integrationskraft. Viele Programmiersprachen können (mehr oder weniger) gleichberechtigt laufen – und das sogar in einem einzigen Programm.

grCUDA

Die Integrationskraft geht noch weiter. Wir haben ein ungewöhnliches Beispiel für euch herausgesucht: Mit grCUDA könnt ihr eure Graphikkarte für euch arbeiten lassen. Es geht dabei nicht um Graphikprogrammierung, sondern darum, Berechnungen auf die Graphikkarte auszulagern. Je nachdem, welche Graphikkarte ihr verwendet, stehen euch tausende von Prozessorkernen zur Verfügung.

CUDA wird in der Programmiersprache CUDA C++ programmiert. grCUDA verwendet das gleiche API, mit dem euer Java-Programm Ruby oder JavaScript aufrufen kann. Dieses API ähnelt ein wenig den APIs von Rhino und Nashorn. Wir werden sie im nächsten Artikel zeigen.

Dieses API steht nicht nur Java-Programmen, sondern allen Sprachen, die auf GraalVM laufen, zur Verfügung. Egal, ob ihr Java, JavaScript oder Ruby verwendet, ihr könnt grCUDA verwenden. Das macht das Projekt aus unserer Sicht interessant. Es reduziert das Risiko, dass das Projekt einschläft, weil die Zahl der potenziellen Anwender viel größer ist als bei einem Projekt, das sich auf eine einzelne Programmiersprache beschränkt.

Im Falle von grCUDA ist diese Theorie allerdings nicht aufgegangen: CUDA wird vor allem in den Bereichen Machine Learning, Deep Learning und High Performance Computing verwendet und dort ist GraalVM (noch?) nicht populär. Dementsprechend ist das Projekt aktuell wieder eingeschlafen und ist damit nicht viel mehr als ein rudimentärer Prototyp. Wir finden das Projekt trotzdem spannend: Es zeigt die Möglichkeiten von GraalVM.

Ein netter Nebeneffekt des polyglotten API – das wir euch erst im nächsten Artikel detailliert zeigen werden – ist, dass grCUDA für jede GraalVM-Sprache verfügbar ist. Das gilt sogar für eure eigene Truffle-Sprache, die ihr vielleicht im Rahmen eines Forschungsprojekts schreibt.

Welche Programmiersprachen bietet GraalVM an?

Zurück zu Truffle und den alternativen Programmiersprachen. Ihr erinnert euch vielleicht aus den vorherigen Artikeln unserer Serie: Truffle ist das Framework, mit dem die alternativen Programmiersprachen für GraalVM implementiert sind. Der Clou an Truffle ist, dass es ein Framework für Interpreter ist. Die alternativen Sprachen werden also nicht kompiliert, sondern durch einen Interpreter ausgeführt. Der JIT-Compiler der GraalVM sorgt dafür, dass eure Programme doch noch kompiliert werden – nur eben zusammen mit dem Interpreter. Im Idealfall ist das Ergebnis genauso gut, als hätte man gleich einen Compiler geschrieben. Diese Idee nennt sich Futamura-Projektion und hat den Vorteil, dass es viel einfacher ist, einen guten Interpreter zu schreiben als einen guten Compiler. Sie erklärt auch viele Besonderheiten der Truffle-Sprachen, die euch gleich begegnen werden.

Wenn wir uns anschauen, welche Programmiersprachen von GraalVM unterstützt werden (Abb. 1), erwartet uns die eine oder andere Überraschung. Hättet ihr C++, Fortran oder Lua erwartet?

vardanyan_rauh_graalvm5_1.tif_fmt1.jpgAbb. 1: GraalVM bietet eine Vielzahl von Programmiersprachen an

Auf der linken Seite des Schaubilds finden wir alte Bekannte: Scala, Kotlin, Groovy, JRuby, die ganze Palette der Sprachen, die nativ auf der JVM laufen. Sie kompilieren alle nach Java-Bytecode, es ist also keine Überraschung, dass GraalVM diese Programmiersprachen unterstützt. Aufregend ist es dennoch: Es bedeutet, dass auch diese...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang