Interview mit Sven Efftinge

Im Fokus: Xtend – Java 10, today?

Hartmut Schlosser

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 EfftingeSven 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.

Geschrieben von
Hartmut Schlosser
Hartmut Schlosser
Content-Stratege, IT-Redakteur, Storyteller – als Online-Teamlead bei S&S Media ist Hartmut Schlosser immer auf der Suche nach der Geschichte hinter der News. SEO und KPIs isst er zum Frühstück. Satt machen ihn kreative Aktionen, die den Leser bewegen. @hschlosser
Kommentare

Hinterlasse einen Kommentar

4 Kommentare auf "Im Fokus: Xtend – Java 10, today?"

avatar
400
  Subscribe  
Benachrichtige mich zu:
verlass
Gast

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

info
Gast

Weil Xtend einfach genial ist. Probier es doch erst einmal aus, bevor Du auf FUD zurückgreifst.

TestP
Gast

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

schichten
Gast

code-generierung ist so was von 90s

und der marktanteil von xtend ist verschwindend gering