Community

Xtext und die Integration in Java-Anwendungen

: Softwareentwickler Daniel Ludwig zeigt in diesem JUGH-Talk die Funktionsweisen von Xtext sehr praxisnah anhand eines Arkanoid-Clones.

Softwareprodukte bilden Fachlichkeit zu großen Teilen in statischem Programmcode ab, Inhalte werden durch unterschiedliche Datenquellen wie Konfigurationsdateien und Datenbanken zur Verfügung gestellt. Änderungen und Anpassungen während des laufenden Betriebs sind dann meist nur in einem kleinen Rahmen und oft auch nur durch Entwickler möglich. Doch welches Vorgehen bietet sich an, wenn Inhalte sowie fachliche Funktionen zur Laufzeit von Anwendern konfigurierbar sein müssen? Dies ist ein klassisches Einsatzgebiet von Domain Specific Languages.

Features und Nutzen von Xtext

Mit Xtext existiert im Java-Ökosystem ein mächtiges Werkzeugset zur Erzeugung eigener DSLs und beinhaltet neben Parser, Linker und Compiler eine umfassende Integration in aktuelle Entwicklungsumgebungen – mit Syntax Highlighting, Code Completion, Validation und inkrementellem Parsen.

Wie man sich all das zu Nutze macht, zeige ich euch anhand eines Arkanoid Clones. Wir entwickeln eine DSL zum Erzeugen von Arkanoid-Leveln und modifizieren Inhalte mittels eigens generiertem Code auf Basis von Xbase. Mein JUGH-Vortrag „Xtext Integration in Java Anwendungen“ vermittelt durch Live-Coding den kompletten Prozess der Erstellung einer eigenen DSL mit Xtext und deren Verwendung in einem Arkanoid Clone.

Inhalte für Arkanoid

Beginnend mit dem Design der Sprache zeige ich, wie mit Hilfe so genannter Parser-Rules und Terminal-Rules Sprachelemente einer DSL entstehen, mit der Inhalte für Arkanoid textuell beschrieben werden können. So entstehen Sprachelemente zum Beschreiben von Leveln und deren Reihenfolge im Spiel sowie zum Beschreiben der Inhalte, der bekannten Reihen und deren Steine, die ein Spieler treffen muss.

Die Verwendung der so erstellten DSL wird zunächst in einer eigenständigen Eclipse-Instanz gezeigt. Dies verdeutlicht die Unterstützung der IDE beim Schreiben in der DSL-Sprache, durch Fehler- und Warnmeldungen und kontextsensitiver Codevervollständigung.

Um nicht immer eine Eclipse-Instanz zum Testen der DSL starten zu müssen, führe ich vor, wie sich der Parser mit Hilfe von Unit-Tests testen lässt. Wie zuvor in der IDE, wird in der eigenen Sprache im Unit-Test Code geschrieben, dieser dann dem Parser zum Auswerten überreicht und das Ergebnis anschließend mittels Auswertungsstatements auf syntaktische Fehler hin untersucht.

In einem Unit-Test ausgeführt zeige ich dann, wie der geschriebene Code durch den Parser in eine Java-Objekt-Struktur überführt werden kann. Die verwendeten Typen dieser Struktur wurden durch das Bauen der Sprache zuvor erzeugt und verwenden Klassen aus dem Eclipse Modelling Framework (EMF) als Basistypen.

Zum Abschluss des ersten Vortragsteils zeige ich dann, wie der Arkanoid Clone den Code in der DSL Sprache lädt und auswertet. Wie in der Eclipse IDE und im Unit-Test wurde dazu auch in der Java-Anwendung der Parser der Sprache geladen und der Code an den Parser überreicht. Bei fehlerfreiem Code kann die erzeugte EMF-Struktur dann von der Anwendung ausgewertet werden, die Inhalte für das Spiel entstehen zur Laufzeit, ohne dass ein Neustart notwendig ist.

Xtend Expressions mit Xbase

Im zweiten Vortragsteil erweitere ich zunächst die Sprache um Xbase. Mit Xbase stehen nämlich Parser-Rules zur Verfügung, mit denen man in der eigenen Sprache Xtend Expressions schreiben kann (bis hin zu vollständigen Typdefinitionen). Damit wird die Sprache um das Feature erweitert, mit solchen Expressions den Inhalt von Reihen zu erzeugen. Auch hier wird die Auswirkungen auf die Sprache zunächst wieder in der Eclipse IDE gezeigt.

Neben der Unterstützung der IDE für die eigenen Sprachelemente zeige sich auch, wie der Benutzer der Sprache volle IDE-Unterstützung beim Schreiben der Expressions erhält. Um die Expressions nun in der Anwendung vernünftig nutzbar zu machen, werden sie in einer Java-Klasse zusammengefasst. Ich zeige, wie dies mittels Xbase und dem Model-Inferrer-Mechanismus zu bewerkstelligen ist und welche Hilfsmittel zur Verfügung stehen, um selbst komplexe Klassen beschreiben zu können.

Den Abschluss des Vortrags bildet dann die Vorstellung der Mechanik, wie der Arkanoid Clone die mit Xbase erzeugte Klasse kompiliert und zur Laufzeit lädt. Selbst Änderungen an den Expressions können so zur Laufzeit in einer neuen Klasse manifestiert und diese ebenfalls nachgeladen werden.

Den Code zum Vortrag findet ihr hier.

Daniel Ludwig