Die Merkmale einer neuen Sprache für die JVM

Java versus Ceylon

Frank Hinkel

Die Programmiersprache Ceylon befindet sich aktuell in der Entwicklung, doch ein Blick auf den Sprachumfang gewährt jetzt schon tiefe Einblicke in Konzepte und Funktionsweisen. Außerdem sind Diskussionen und Entscheidungen zu konkreten Elementen der Sprache transparent.

Die Ziele der Entwickler von Ceylon sind hoch gesteckt. Nach eigenen Angaben liegt der Fokus von Ceylon auf:

  1. Eleganz
  2. Lesbarkeit
  3. Typsicherheit
  4. Meta-Programmierung

Die Programmierung soll wesentlich einfacher sein als mit Java. Besonders in Bereichen von generischer Typsicherheit räumt Ceylon auf. Die Sprache ist mit funktionalen Bestandteilen angereichert, verliert sich aber nicht in verketteten Operationen ohne Seiteneffekte sondern versucht das Beste aus den Welten der Objektorientierung und der funktionalen Programmierung zu vereinen.

Entwicklung

Aktuell existiert ein Plug-in für Eclipse, sodass diese IDE jetzt schon für Ceylon zur Verfügung steht [1].

Obwohl man bereits einfache Applikationen schreiben kann, stolpert man früh auf kleinere Bugs in der Sprache und auf Ungereimtheiten in der IDE. Beispielsweise funktioniert das Autoboxing und -unboxing derzeit nicht konsistent.

Derzeit wird kein offizieller Release-Termin für Ceylon veröffentlicht. Konkrete zeitliche Angaben über die Erreichung von Meilensteinen fehlen ebenso. Inhaltlich ist jedoch ausreichend Transparenz vorhanden, um sich ausmalen zu können, wie Ceylon zukünftig aussehen wird (siehe Ceylon Roadmap [2]).

Wörterbuch

Java Ceylon
implements satisfies
public shared (kontextabhängig)
protected
private
abstract formal (Attribute/Methoden)
Merkmale (Ceylon versus Java)

Im Folgenden habe ich die aus meiner Sicht interessantesten Merkmale von Ceylon zusammengefasst.

Keine NullPointerException:
  • Typsicherheit bei null
  • Nullwerte sind Inkarnationen der Klasse Nothing
  • Mögliche null-Werte müssen den Datentyp bei der Deklaration erweitern:
    • String? vorname = „Frank“
    • String|Nothing vorname = „Frank“;
  • Korrespondierendes exists-Konstrukt
    • if (exists vorname) {…}
Nur ein Zugriffsmodifikator: shared
  • Gültigkeitsbereich von shared ist dynamisch
  • Kontextabhängige Funktionsweise
  • Klassen sind standardmäßig paketlokal, shared muss explizit deklariert werden
  • Eine shared-Klasse kann keine paketlokalen Attribute besitzen
  • Protected kann nicht abgebildet werden
Enumerierte Ableitungen:
  • Es kann über enumerierte Subtypen eine direkte Verknüpfung der Basisklasse zu der Anzahl der entsprechenden Subtypen hergestellt werden
  • Dadurch wird zur Compile-Zeit sichergestellt, dass alle Ableitungen in polymorphen Aufrufen explizit im Code behandelt werden

Beispiel:

abstract class Tier() of Hund | Katze | Maus { ... }
... 
void sagHallo(Tier tier) {
    switch (tier)
    case (is Hund) { //wuff... }
    case (is Maus) { //pief... }
    // compile Error: Katze muss ebenfalls behandelt werden
}  
Haben Sie sich Ceylon selbst schon einmal angeschaut? Dann teilen Sie uns Ihre Einschätzung mit – entweder als Kommentar hier oder in unserem aktuellen Quickvote: Was halten Sie von Ceylon?
Geschrieben von
Frank Hinkel
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.