Xtend

Xtend
Paradigmen: objektorientiert, imperativ, funktional
Erscheinungsjahr: 2011
Designer: Sven Efftinge, Sebastian Zarnekow
Entwickler: itemis
Aktuelle Version 2.19.0[1]
Typisierung: stark, statisch
Beeinflusst von: Java, Scala, Groovy, Smalltalk, Xpand
Betriebssystem: plattformunabhängig
Lizenz: Eclipse Public License
www.xtend-lang.org

Xtend ist eine Programmiersprache für die Java Virtual Machine. Syntaktisch und semantisch hat Xtend seine Wurzeln in der Programmiersprache Java. Im Vordergrund stehen allerdings eine kompaktere Syntax und zusätzliche Funktionalität wie Typinferenz, Extension-Methoden und Operatorüberladung. Xtend ist primär objektorientiert, ermöglicht aber auch funktionale Programmierung, z. B. durch Lambda-Ausdrücke. Xtend ist statisch getypt und benutzt das Typsystem von Java ohne Änderungen. Es wird auf Java-Quellcode kompiliert und integriert sich daher nahtlos mit existierenden Java-Bibliotheken.

Die Sprache Xtend und ihre Entwicklungsumgebung werden im Eclipse-Projekt entwickelt[2] und nehmen am jährlichen Simultanrelease teil. Der Code ist Open Source unter der Eclipse Public License erhältlich. Dennoch kann die Sprache unabhängig vom Eclipse-Projekt kompiliert und ausgeführt werden.

Geschichte

Xtend stammt ursprünglich aus dem Xtext-Projekt, mit dem die Sprache und der Editor entwickelt werden. Xtend wurde daher zunächst als Teil von Xtext im Eclipse-Release Indigo[3] im Juni 2011 veröffentlicht. Seit dem Eclipse-Release Juno[4] (Juni 2012, Xtend-Version 2.3) ist Xtend ein eigenständiges Projekt. Am 20. März 2013 wurde Xtend in Version 2.4.0 mit erweiterten Features wie "Active Annotations" releast.[5][6]

Die hier beschriebene Sprache Xtend ist nicht zu verwechseln mit der älteren Sprache gleichen Namens aus dem Xpand-Projekt.[7] Um Missverständnissen vorzubeugen, wurde Xtend daher zunächst Xtend2 genannt. Die '2' wurde allerdings der Einfachheit halber bald weggelassen. Dank seiner Template-Ausdrücke ersetzt Xtend die Xpand-Technologie komplett.

Philosophie

Java ist eine der populärsten Programmiersprachen und es existiert ein umfangreiches Ökosystem von Bibliotheken und Werkzeugen. Dennoch wird die Syntax oft als sperrig empfunden, und neue Eigenschaften werden langsam hinzugefügt. Xtend versucht, das Beste von Java zu erhalten, aber die Syntax zu verbessern und Features zu ergänzen, um besser lesbaren, ausdrucksstärkeren Code zu ermöglichen.

Xtends Syntax ist eng an Java angelegt und kompatibel zu Java, da Xtend-Code zu Java-Quellcode kompiliert wird und Javas Typsystem unverändert verwendet wird. Java-Code und Xtend-Code können daher nebeneinander benutzt werden. Durch eine Kombination von Lambda-Ausdrücken und Extension-Methoden kann Java mit Bibliotheken erweitert werden, ohne dass die Sprachdefinition angepasst werden muss.

Die Eclipse-basierte Xtend-IDE bietet unter anderem syntaktische Hervorhebung, Code-Vervollständigung, Refactoring, Navigation und Debugging. Sie integriert sich außerdem in Eclipses Java Development Toolkit.[8]

Semantik

Xtend gleicht Java in vielerlei Hinsicht, wie das nachstehende Xtend-Beispiel zeigt:

package sample

import java.util.List

class Greeter {
  def greetThem(List<String> names) {
    for(name: names) {
      println(name.sayHello)
    }
  }

  def sayHello(String name) {
    'Hello ' + name + '!'
  }
}

Xtend bietet Typinferenz, das heißt, die Typen von name und die Rückgabetypen der Methoden können aus dem Kontext inferiert werden. Klassen und Methoden sind standardmäßig public, Member-Variablen private. Semikolons sind optional.

In dem Beispiel wird die Methode sayHello als Extension-Methode aufgerufen, also wie eine Methode des ersten Arguments name. Extension-Methoden können auch von anderen Klassen oder Instanzen beigesteuert werden.

Statt der imperativen for-Schleife, kann man auch im funktionalen Stil einen Lambda-Ausdruck in eckigen Klammern verwenden, und die Funktion höherer Ordnung forEach in Extension-Syntax auf der Liste aufrufen:

def greetThem(List<String> names) {
  names.forEach [ println(sayHello) ]
}

Wird der Parameter eines Lambda-Ausdrucks nicht spezifiziert, wird sein Name implizit als it angenommen, was wie this in Java ausgelassen werden kann. Sein Typ wird inferiert. Lambda-Ausdrücke werden außerdem automatisch in Interfaces einer Methode konvertiert, sodass man sie beispielsweise als java.lang.Comparable benutzen kann.

Template-Ausdrücke sind mehrzeilige Strings in dreifachen Apostrophen mit interpolierten Ausdrücken in französischen Anführungszeichen. Das obige Beispiel sähe mit einem Template-Ausdruck so aus:

def sayHello(String name) '''
    Hello «name» !
'''

Template-Ausdrücke haben eine intelligente Leerzeichenverwaltung – der Text im Beispiel wird nicht eingerückt – und eignen sich daher sehr gut für Code-Generierung.

Weitere bemerkenswerte Sprachfeatures sind Multimethoden, eine erweiterte Switch-Anweisung und Operatorenüberladung mit Bibliotheksmethoden.

Weblinks

  • Sven Efftinge, Sebastian Zarnekow: Extending Java. In: Pragmatic Programmer Magazine, Dezember 2011.
  • Alex Blewitt: Xtend Extends Java. In: InfoQ, Juni 2012; Interview with Sven Efftinge.

Literatur

  • Lorenzo Bettini, Implementing Domain-Specific Languages with Xtext and Xtend - Second Edition, Packt Publishing, 2016

Einzelnachweise

  1. Xtend - Release Notes. 2. September 2019 (abgerufen am 7. November 2019).
  2. Official Xtend-Homepage auf Eclipse.org
  3. Eclipse Indigo release
  4. Eclipse Juno release
  5. Xtend 2.4 Release Notes (Memento vom 8. April 2013 im Internet Archive)
  6. Xtend 2.4 Release Notes
  7. Xpand
  8. JDT