Zum Inhalt springen

Xtend

aus Wikipedia, der freien Enzyklopädie
{{#if: | {{#if: | {{#if:objektorientiert, imperativ, funktional| {{#if:| {{#if:Sven Efftinge, Sebastian Zarnekow| {{#if:itemis| {{#if:| {{#if:| {{#if:stark, statisch| {{#if:| {{#if:| {{#if:| {{#if:Java, Scala, Groovy, Smalltalk, Xpand| {{#if:| {{#if:plattformunabhängig| {{#if:| {{#if:|
{{#if: | | {{#invoke:WLink|getArticleBase}} }}
colspan="2" class="notheme" style="text-align:center; background-color:#Vorlage:Standardfarbe;" | |
 {{#if: {{#invoke:Wikidata|claim|P154}} |
[[Datei:{{#invoke:Wikidata|claim|P154}}|150px]]
 }}

}}

{{{Screenshot}}}{{#if: |
{{{Beschreibung}}} }}|

}}

Basisdaten
Paradigmen: objektorientiert, imperativ, funktional

}}

Erscheinungsjahr:
 {{#if: {{#invoke:Wikidata|claim|P571}} | 
Erscheinungsjahr: claim|P571|references=ja}}
 }}

}}

Designer:
 {{#if: {{#invoke:Wikidata|claim|P287}} | 
Designer: claim|P287|parameter=link|references=ja|list=, }}
 }}

}}

Entwickler:
 {{#if: {{#invoke:Wikidata|claim|P178}} | 
Entwickler: claim|P178|parameter=link|references=ja|list=, }}
 }}

}}

Aktuelle Version:  () |

{{#if: {{#invoke:Wikidata|claim|P348}} |

Aktuelle Version {{#invoke:Wikidata|claim|P348|references=ja}}{{#if: {{#invoke:Wikidata|claim|Version|qualifier=P577}} | ({{#invoke:Wikidata|claim|Version|qualifier=P577}})}}}}

}}

Aktuelle Vorabversion: {{{AktuelleVorabVersion}}}  ({{{AktuelleVorabVersionFreigabeDatum}}})

}}

Typisierung: stark, statisch

}}

Wichtige Implementierungen: {{{Implementierung}}}

}}

Dialekte: {{{Dialekte}}}

}}

Standardisierungen: {{{Standardisierungen}}}

}}

Beeinflusst von: Java, Scala, Groovy, Smalltalk, Xpand |
 {{#if: {{#invoke:Wikidata|claim|P737}} | 
Beeinflusst von: claim|P737|parameter=link|references=ja|list=, }}
 }}

}}

Beeinflusste:

}}

Betriebssystem: plattformunabhängig |
 {{#if: {{#invoke:Wikidata|claim|P306}} | 
Betriebssystem: claim|P306|parameter=link|references=ja|list=, }}
 }}

}}

Lizenz:
 {{#if: {{#invoke:Wikidata|claim|P275}} | 
Lizenz: claim|P275|parameter=link|references=ja|list=, }}
 }}

}}

|
 {{#if: {{#invoke:Wikidata|claim|P856}} | 
{{#invoke: WLink | formatURL | {{#invoke:Wikidata|claim|P856|parameter=link}}}}
 }}

}}

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<ref>Official Xtend-Homepage auf Eclipse.org</ref> 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<ref>Eclipse Indigo release</ref> im Juni 2011 veröffentlicht. Seit dem Eclipse-Release Juno<ref>Eclipse Juno release</ref> (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.<ref><templatestyles src="Webarchiv/styles.css" />{{#if:20130408173810

      | {{#ifeq: 20130408173810 | *
    | Vorlage:Webarchiv/Wartung/Stern{{#if: Xtend 2.4 Release Notes | {{#invoke:WLink|getEscapedTitle|Xtend 2.4 Release Notes}} | {{#invoke:Webarchiv|getdomain|http://www.eclipse.org/xtend/releasenotes_2_4.html}} }} (Archivversionen)
    | {{#iferror: {{#time: j. F Y|20130408173810}}
         | {{#if:  || }}Vorlage:Webarchiv/Wartung/DatumDer Wert des Parameters {{#if: wayback | wayback | Datum }} muss ein gültiger Zeitstempel der Form YYYYMMDDHHMMSS sein!
         | {{#if: Xtend 2.4 Release Notes | {{#invoke:WLink|getEscapedTitle|Xtend 2.4 Release Notes}} | {{#invoke:Webarchiv|getdomain|http://www.eclipse.org/xtend/releasenotes_2_4.html}} }} {{#ifeq:  | [] | [ | ( }}Memento{{#if: {{#if:  | {{{archiv-bot}}} |  }} |  des Vorlage:Referrer }} vom {{#time: j. F Y|20130408173810}} im Internet Archive{{#if:  | ;  }}{{#ifeq:  | [] | ] | ) }}
      }}
  }}
      | {{#if:
          | {{#iferror: {{#time: j. F Y|{{{webciteID}}}}}
    | {{#switch: {{#invoke:Str|len|{{{webciteID}}}}}
       | 16= {{#if: Xtend 2.4 Release Notes | {{#invoke:WLink|getEscapedTitle|Xtend 2.4 Release Notes}} | {{#invoke:Webarchiv|getdomain|http://www.eclipse.org/xtend/releasenotes_2_4.html}} }} {{#ifeq:  | [] | [ | ( }}Memento{{#if: {{#if:  | {{{archiv-bot}}} |  }} |  des Vorlage:Referrer }} vom {{#time: j. F Y| 19700101000000 + {{#expr: floor {{#expr: {{#invoke:Str|sub|{{{webciteID}}}|1|10}}/86400}} }} days}} auf WebCite{{#if:  | ;  }}{{#ifeq:  | [] | ] | ) }}
       | 9 = {{#if: Xtend 2.4 Release Notes | {{#invoke:WLink|getEscapedTitle|Xtend 2.4 Release Notes}} | {{#invoke:Webarchiv|getdomain|http://www.eclipse.org/xtend/releasenotes_2_4.html}} }} {{#ifeq:  | [] | [ | ( }}Memento{{#if: {{#if:  | {{{archiv-bot}}} |  }} |  des Vorlage:Referrer}} vom {{#time: j. F Y| 19700101000000 + {{#expr: floor {{#expr: {{#invoke:Str|sub|{{#invoke:Expr|base62|{{{webciteID}}}}}|1|10}}/86400}} }} days}} auf WebCite{{#if:  | ;  }}{{#ifeq:  | [] | ] | ) }}
       | #default= Der Wert des Parameters {{#if: webciteID | webciteID | ID }} muss entweder ein Zeitstempel der Form YYYYMMDDHHMMSS oder ein Schüsselwert mit 9 Zeichen oder eine 16-stellige Zahl sein!Vorlage:Webarchiv/Wartung/webcitation{{#if:  || }}
      }}
    | c|{{{webciteID}}}}} {{#if: Xtend 2.4 Release Notes | {{#invoke:WLink|getEscapedTitle|Xtend 2.4 Release Notes}} | {{#invoke:Webarchiv|getdomain|http://www.eclipse.org/xtend/releasenotes_2_4.html}} }} (Memento{{#if: {{#if:  | {{{archiv-bot}}} |  }} |  des Vorlage:Referrer}} vom {{#time: j. F Y|{{{webciteID}}}}} auf WebCite{{#if:  | ;  }}{{#ifeq:  | [] | ] | ) }}
  }}
          | {{#if: 
              | Vorlage:Webarchiv/Today
              | {{#if:
                      | Vorlage:Webarchiv/Generisch
                      | {{#if: Xtend 2.4 Release Notes | {{#invoke:WLink|getEscapedTitle|Xtend 2.4 Release Notes}} | {{#invoke:Webarchiv|getdomain|http://www.eclipse.org/xtend/releasenotes_2_4.html}} }}  
                 }}}}}}}}{{#if:
    | Vorlage:Webarchiv/archiv-bot
  }}{{#invoke:TemplatePar|check
     |all      = url=
     |opt      = text= wayback= webciteID= archive-is= archive-today= archiv-url= archiv-datum= ()= archiv-bot= format= original=
     |cat      = Wikipedia:Vorlagenfehler/Vorlage:Webarchiv
     |errNS    = 0
     |template = Vorlage:Webarchiv
     |format   = *
     |preview  = 1
  }}{{#ifexpr: {{#if:20130408173810|1|0}}{{#if:|+1}}{{#if:|+1}}{{#if:|+1}}{{#if:|+1}} <> 1
    | {{#if:  || }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Genau einer der Parameter 'wayback', 'webciteID', 'archive-today', 'archive-is' oder 'archiv-url' muss angegeben werden.|1}}
  }}{{#if: 
    | {{#switch: {{#invoke:Webarchiv|getdomain|{{{archiv-url}}}}}
        | web.archive.org = 
          {{#if:  || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von Internet Archive erkannt, bitte Parameter 'wayback' benutzen.|1}} 
        | webcitation.org = 
          {{#if:  || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von WebCite erkannt, bitte Parameter 'webciteID' benutzen.|1}} 
        | archive.today |archive.is |archive.ph |archive.fo |archive.li |archive.md |archive.vn = 
          {{#if:  || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von archive.today erkannt, bitte Parameter 'archive-today' benutzen.|1}}
      }}{{#if: 
         | {{#iferror: {{#iferror:{{#invoke:Vorlage:FormatDate|Execute}}|}}
             | {{#if:  || }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Wert des Parameter 'archiv-datum' ist ungültig oder hat ein ungültiges Format.|1}}
          |  }} 
         | {{#if:  || }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Pflichtparameter 'archiv-datum' wurde nicht angegeben.|1}}
      }}
    | {{#if: 
         | {{#if:  || }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Parameter 'archiv-datum' ist nur in Verbindung mit 'archiv-url' angebbar.|1}}
      }}
  }}{{#if:{{#invoke:URLutil|isHostPathResource|http://www.eclipse.org/xtend/releasenotes_2_4.html}}
    || {{#if:  || }}
  }}{{#if: Xtend 2.4 Release Notes
    | {{#if: {{#invoke:WLink|isBracketedLink|Xtend 2.4 Release Notes}}
        | {{#if:  || }}
      }}
    | {{#if:  || }}Vorlage:Webarchiv/Wartung/Linktext_fehlt
  }}{{#switch: 
    |addlarchives|addlpages= {{#if:  || }}{{#if: 1 |Vorlage:Webarchiv/Wartung/Parameter}}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: enWP-Wert im Parameter 'format'.|1}}
  }}{{#ifeq: {{#invoke:Str|find|http://www.eclipse.org/xtend/releasenotes_2_4.html%7Carchiv}} |-1
    || {{#ifeq: {{#invoke:Str|find|{{#invoke:Str|cropleft|http://www.eclipse.org/xtend/releasenotes_2_4.html%7C4}}%7Chttp}} |-1
         || {{#switch: {{#invoke:Webarchiv|getdomain|http://www.eclipse.org/xtend/releasenotes_2_4.html }}
              | abendblatt.de | daserste.ndr.de | inarchive.com | webcitation.org = 
              | #default = {{#if:  || }}{{#if: 1 |Vorlage:Webarchiv/Wartung/URL}}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Archiv-URL im Parameter 'url' anstatt URL der Originalquelle. Entferne den vor der Original-URL stehenden Mementobestandteil und setze den Archivierungszeitstempel in den Parameter 'wayback', 'webciteID', 'archive.today' oder 'archive-is' ein, sofern nicht bereits befüllt.|1}}
            }} 
       }}
  }}</ref><ref>Xtend 2.4 Release Notes</ref>

Die hier beschriebene Sprache Xtend ist nicht zu verwechseln mit der älteren Sprache gleichen Namens aus dem Xpand-Projekt.<ref>Xpand</ref> 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.<ref>JDT</ref>

Semantik

Xtend gleicht Java in vielerlei Hinsicht, wie das nachstehende Xtend-Beispiel zeigt: <syntaxhighlight lang="Scala"> 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 + '!'
 }

} </syntaxhighlight>

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: <syntaxhighlight lang="Scala"> def greetThem(List<String> names) {

 names.forEach [ println(sayHello) ]

} </syntaxhighlight> 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: <syntaxhighlight lang="Scala"> def sayHello(String name)

   Hello «name» !

</syntaxhighlight> 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

<references />