Ein zweiter Blick auf JVM-Programmiersprachen

Seite 4: Ceylon

Inhaltsverzeichnis

Deutlich jünger als die bisher vorgestellten Sprachen ist Ceylon. Es wird seit 2011 von Red Hat entwickelt und ist vor Kurzem in Version 1.0 erschienen. Ceylon ist objektorientiert und statisch typisiert. Semikolons und Klammern sind bei Ceylon nicht optional, wie folgendes Hello-World-Programm zeigt.

void sayHello(String name) {
print("Hallo ``name``!");
}

void run() {
sayHello("JavaLand");
}

Die doppelten Backticks (``) sorgen für String Interpolation, run ist der Name der Einstiegsfunktion (ähnlich wie main in Java) und ein static-Schlüsselwort gibt es nicht. Stattdessen werden statische Methoden außerhalb einer Klasse definiert.

Eine Besonderheit von Ceylon ist das Modulssytem, das fester Bestandteil der Sprache ist und das Zusammenfassen von Paketen zu größeren Einheiten (Modulen) erlaubt. Im nächsten Beispiel ist eine Moduldefinition angegeben, die das Modul "de.olofsson" in Version 1.0.0 definiert und das Collection-Modul der Programmiersprache importiert.

// module.ceylon:
module de.olofsson "1.0.0" {
import ceylon.collection "1.0.0";
}

Braucht man in der Java-Welt ein Tool wie Maven oder Gradle, um Abhängigkeiten zu verwalten, ist eine entsprechende Option bereits in Ceylon enthalten. Ein Modul stellt unterschiedliche Pakete und Klassen zur Verfügung. Unten ist die Verwendung der Klasse HashMap aus dem Paket ceylon.collection gezeigt, das wiederum aus dem Modul ceylon.collection stammt. Soll ein Programmelement für andere Module sichtbar sein, muss es mit dem Schlüsselwort shared freigegeben werden.

// useMap.ceylon:
import ceylon.collection { HashMap }

Annotationen spielen in Ceylon eine zentrale Funktion. Anders als in Java sind sie ohne das führende @-Zeichen geschrieben und sehen damit aus wie Schlüsselwörter. Der Compiler prüft die Annotationen, dadurch lassen sich beispielsweise fehlerhafte Verweise in der Dokumentation vermeiden.

Richtig lassen sich Annotationen wie folgt verwenden:

import ceylon.language.meta
{ annotations }

"Eine Funktion mit Annotationen."
by ("Simon Olofsson")
void annotationsDemo() {

value a = annotations(`DocAnnotation`,
`function annotationsDemo`);
}

Über der Funktion annotationsDemo stehen die Dokumentationsannotationen, die sie wieder ausliest. Dabei referenzieren Ausdrücke in Backticks das Metamodell von Ceylon, das hilfreich ist, um auf Programmelemente zuzugreifen. DocAnnotation ist der Typ des Dokumentations-Strings oberhalb der Funktion.

Das Typsystem von Ceylon ist recht ausgefeilt, so gibt es Vereinigungstypen, die einen Typen definieren, der alle angegebenen Typen enthält. Dies ist nützlich, um zu deklarieren, dass eine Variable einen Nullwert enthalten könnte.

List<String> l1 = ["Eins"];

String? s1 = l1.get(0);
String|Null s2 = l1.get(0);

List<String|Integer> l2 = ["Eins", 1];

Der hier gezeigte Vereinigungstyp ist entweder ein String oder Null. Da dies in der Praxis häufig vorkommt, gibt es mit String? eine Abkürzung. Die darunter angegebene Liste kann Zeichenketten und Ganzzahlen enthalten. Das Gegenstück sind die Schnitttypen (Typ A und B), die allerdings seltener gebraucht werden.

Wer sich gerne auf Neues einlässt, trifft mit Ceylon eine gute Wahl. Die noch relativ junge Programmiersprache bricht mit einigen Strukturen der Java-Welt, was sich nicht nur an umbenannten Schlüsselwörtern festmacht. Das integrierte Modulkonzept ist anfangs vielleicht etwas zu mächtig, erweist aber ab einer bestimmten Programmgröße gute Dienste. Auch die häufige Nutzung von Annotationen und das ausgeklügelte Typsystem machen einen sinnvollen Eindruck. Ceylon als einzige Programmiersprache einzusetzen ist vielleicht verfrüht, aber Komponenten, die nicht im Mittelpunkt der Anwendung stehen, lassen sich schon in Ceylon realisieren.