Im Fokus: Xtend – Java 10, today?

Xtend, die Programmiersprache für die JVM, wirbt auf der Projektseite mit dem Slogan „Java 10, today!“ – und ist gerade in Version 2.7 erschienen. Grund genug, uns mit Projekt-Leiter Sven Efftinge über den Fokus von Xtend und die Neuerungen in der Version 2.7 zu unterhalten. Sven gibt eine Einführung in die Sprache und erklärt, warum Xtend von manchen als „Swift-Äquivalent für Android“ bezeichnet wird.
JAXenter: Kannst du den Lesern zu Beginn kurz die Eckdaten von Xtend in Erinnerung rufen? Was macht die Sprache aus?
Sven Efftinge: Gerne. Xtend ist gewissermaßen ein entschlacktes Java mit einigen zusätzlichen modernen Sprachkonzepten. Die Sprache wird in lesbaren Java-Quelltext übersetzt und ist ab Java 5 kompatibel (für höhere Versionen natürlich auch). Die zusätzlichen Sprachkonzepte wie Typinferenz, Operator-Overloading und Makros erlauben es, wesentlich ausdrucksstärker zu programmieren, was nicht nur beim Schreiben sondern vor allem beim Lesen hilft. Weiterhin haben wir beim Entwurf darauf geachtet, dass es nicht nur keinerlei Interoperabilitätsprobleme mit bestehenden Java-Bibliotheken gibt, sondern die Integration tatsächlich besser ist als mit Java. Xtend unterstützt gängige Java-Idiome von Haus aus.
JAXenter: Xtend bietet ja auch Lambda-Ausdrücke. Gibt es einen Unterschied zu denen aus Java 8?
Sven Efftinge: Genau wie in Java 8 kann man in Xtend Lambdas nutzen, wo immer ein sogenanntes functional interface, also ein interface mit einer abstrakten Methode, erwartet werden. D.h. die Interoperabilität für die Zukunft ist hier sichergestellt. Das haben wir übrigens schon vor Java 8 so gemacht. Gegenüber Java 8 erlaubt Xtend allerdings eine wesentlich kompaktere Syntax und ist durch die sogenannten Extension Methods auch nicht auf die etwas umständliche Stream API angewiesen.
Im Folgenden ein kleiner Vergleich. Angenommen, wir haben eine Liste mit Alben und wollen eine gefilterte Liste aller Alben, die mindestens einen Track mit einem rating >= 4 erhalten. In Java 8 kann man das mit der Stream API so schreiben:
List<Album> sortedFavs = albums.stream() .filter(a -> a.getTracks().anyMatch(t -> (t.getRating() >= 4))) .sorted(comparing(a -> a.getName())) .into(new ArrayList<>());
Genau das gleiche in Xtend:
val sortedFavs = albums.stream .filter[tracks.anyMatch[rating >= 4]] .sorted(comparing[name]) .into(new ArrayList)
Hier sieht man, dass Xtend-Code selbst mit der Stream API schon wesentlich besser lesbar ist. Wenn man statt der Java 8 Stream API nun einfach die Extension-Methoden benutzt, die Xtend auf java.util.List bereitstellt, kann man es sogar wie folgt schreiben:
val sortedFavs = albums.filter[tracks.anyMatch[rating >= 4]].sortBy[name]
Das funktioniert dann sogar ab Java 5.
JAXenter: Ihr habt Xtend als „Äquivalent zu Apples Swift für Android“ ins Spiel gebracht. Wie ist das gemeint?
Sven Efftinge: Das waren gar nicht wir (Committer), sondern ein User, der den Blog-Post geschrieben hat.
Aber Swift hat tatsächlich einige Ähnlichkeiten zu Xtend, was sicher daran liegt, dass die Entwickler bei Apple ähnliche Sprachen als Vorbild hatten wie wir. Natürlich gibt es aber auch Unterschiede, vor allem weil Swift mit existierenden Objective-C-Projekten harmonieren muss und Xtend eben mit Java-Projekten.
Die wichtige Message ist jedoch, dass Xtend sich hervorragend für die Android-Entwicklung eignet, weil es keinerlei zusätzliche Laufzeit-Kosten für komplizierte Konvertierungen oder dynamisches Linken verursacht und die Standard-Bibliothek extrem klein ist. Weiterhin können mittels Active Annotations sehr interessante Makros entwickelt werden, die dafür sorgen, dass die zahlreichen Android-spezifischen Ressourcen automatisch mit dem Quellcode synchronisiert sind. Das Gitub-Projekt Xtendroid [1] beinhaltet solche Annotationen.
JAXenter: Gerade ist Xtend 2.7 erschienen. Worauf habt Ihr den Fokus gelegt?
Sven Efftinge: Nachdem wir in Version 2.6 mit anonymen Klassen und nested types die beiden am meisten vermissten Java-Sprachfeatures nachgereicht haben, wurde in 2.7 einiges an der IDE und der Bibliothek gemacht. Es gibt nun ein paar neue Active Annotations. Beispielsweise kann man mit der Annotation @Delegate automatisch abstrakte Methoden aus Interfaces implementieren.
Recht nützlich ist auch die Annotation @Data, die dafür sorgt, dass folgender Xtend-Code:
@Data class Person { String name int age Gender gender }
in folgenden Java-Code übersetzt wird (die Methodenrümpfe hab ich zu Gunsten der Lesbarkeit rausgenommen):
@Data @SuppressWarnings("all") public class Person { private final String name; private final int age; private final Gender gender; public Person(final String name, final int age, final Gender gender) { //... } @Override @Pure public int hashCode() { //... } @Override @Pure public boolean equals(final Object obj) { //... } @Override @Pure public String toString() { //... } @Pure public String getName() { return this.name; } @Pure public int getAge() { return this.age; } @Pure public Gender getGender() { return this.gender; } }
Diese Annotation sind wirklich nur Bibliotheken. Das darunter liegende Konzept ist ähnlich zu den AST-Transformationen in Groovy oder zu dem, was Lombok macht. Im Gegensatz zu diesen Lösungen ist die Implementierung einer eigenen Annotation in Xtend super einfach, und alles bleibt statisch getypt. Auch weiß die IDE immer, was vorgeht.
JAXenter: Welche Pläne habt Ihr jetzt für Xtend? Wie soll es weiter gehen?
Sven Efftinge: Wir haben noch viele spannende Ideen, wie wir die Sprache, die Bibliothek und auch die IDE verbessern können. Zu allererst wollen wir uns auf das IntelliJ-Plug-in konzentrieren, mit dem wir Ende Juli begonnen haben. Es gibt leider einige Entwickler, die sich einfach nicht mit Eclipse anfreunden können. 🙁
Abgesehen davon werden wir weiterhin die Qualität und Performanz der bestehenden Implementierung verbessern.
JAXenter: Sven, vielen Dank für dieses Interview!
Sven is a passionate software developer who loves kite surfing, music and good food. He’s the project lead of Xtext, a framework for developing programming languages and domain-specific languages and Eclipse Xtend, a statically-typed programming language for the JVM. Sven leads a research department for itemis in Kiel.
wieso sollte ich mein projekt auf eine opensource-projekt-sprache aufbauen? das risiko geht doch keiner ein, die auswahl ist ja inzwischen auch wirklich mehr als gross genug für jvm-sprachen
Weil Xtend einfach genial ist. Probier es doch erst einmal aus, bevor Du auf FUD zurückgreifst.
Xtend generiert stinknormalen Java-Sourcecode. Das Ding macht sowas Ähnliches wie ein GUI-Builder oder andere Code-Generatoren. Sprich, ein Risiko besteht eigentlich nicht da man den Java-Code ja auf jeden Fall hat als ob man in Java entwickelt hätte.
Grüße
code-generierung ist so was von 90s
und der marktanteil von xtend ist verschwindend gering