# Xtend

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 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 im Juni 2011 veröffentlicht. Seit dem Eclipse-Release Juno (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.
Die hier beschriebene Sprache Xtend ist nicht zu verwechseln mit der älteren Sprache gleichen Namens aus dem Xpand-Projekt. 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.

## Semantik

Xtend gleicht Java in vielerlei Hinsicht, wie das nachstehende Xtend-Beispiel zeigt:
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:
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:
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.