Your SlideShare is downloading. ×
Kaffee gegen Tee: Java versus Ceylon
Kaffee gegen Tee: Java versus Ceylon
Kaffee gegen Tee: Java versus Ceylon
Kaffee gegen Tee: Java versus Ceylon
Kaffee gegen Tee: Java versus Ceylon
Kaffee gegen Tee: Java versus Ceylon
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Kaffee gegen Tee: Java versus Ceylon

969

Published on

„Say more, more clearly“: Dieses Motto haben sich Ceylon-Entwickler auf die Fahnen geschrieben. In diesem Artikel wird untersucht, mit welchen Zutaten der hausgemachte Tee Gavin Kings gebraut wird – …

„Say more, more clearly“: Dieses Motto haben sich Ceylon-Entwickler auf die Fahnen geschrieben. In diesem Artikel wird untersucht, mit welchen Zutaten der hausgemachte Tee Gavin Kings gebraut wird – und ob Ceylon das Zeug dazu hat, dem weltweit geliebten Kaffee von Oracle in absehbarer Zukunft Paroli zu bieten.

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
969
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
5
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. inkl.JAVA Mag CD Apache Tapestry: Skalierbare Webapplikationen entwickeln 46 6.2012 magazin Java • Architekturen • Web • Agile www.javamagazin.de Tutorial BPMN 2.0 E pluribusCD-INHALT Continuous Delivery und Java EE 6 JVM Im Maschinenraum 69 Workflows mit Activiti 100 Compilerbau entmystifiziert 23 JSF 2.0 in Liferay Portal von Andy Bosch Video von der JAX 2011 HIGHLIGHTS JSF 2.2 Was Sie von der neuen Version PrimeFaces 3.2 erwarten können 28 Sonderdruck für Ceylon 0.2 Tapestry 5.3.2 Interview mit Spec Lead Ed Burns www.codecentric.de 34 JSF und Webperformance 36 WEITERE INHALTE • Accumulo 1.4.0 • Jawr 3.3.3 • TomEE 1.0.0-beta-2 Java versus Ceylon Alle CD-Infos ab Seite 3 Eine neue Sprache für die JVM 18 DeltaSpike Vereinigung der CDI-Communitys 85 Scala und Spring im Tandem A Match made in Heaven 95
  • 2. Sonderdruck Eine neue Sprache für die JVM Kaffee gegen Tee: Java versus Ceylon „Say more, more clearly“: Dieses Motto ­ haben sich Ceylon-Entwickler auf die Fahnen geschrieben. In diesem Artikel wird unter- sucht, mit welchen Zutaten der hausgemachte Tee Gavin Kings gebraut wird – und ob Ceylon das Zeug dazu hat, dem weltweit geliebten Kaffee von Oracle in absehbarer Zukunft Paroli zu bieten. von Frank Hinkel und Muhammet Altindal Warum Ceylon? Auf der QCon in Beijing 2011 setzte sich Gavin King für Neben der Sprache Java existiert eine Vielzahl weiterer seine neue Kreation ein und präsentierte die Gründe, die Programmiersprachen, die die Java Virtual Maschine ihn zur Entwicklung von Ceylon bewegt haben und die (JVM) als Laufzeitumgebung verwenden. Ceylon ist eine Ziele, die er mit der Sprache verfolgt. Ihn stören vor al- davon. Ebenso wie bei der Java-Sprache wird der Quell- lem schlechte Metaprogrammierung, fehlende funktionale code von Ceylon in Bytecode umgewandelt, der von der Elemente und fehlende Modularisierung des Java SE SDK. JVM interpretiert werden kann. Ceylon ist eine neue ob- Ebenfalls kritisiert er Arrays, primitive Datentypen, die jektorientierte Programmiersprache, die eine Reihe von ungeschickte Realisierung von Annotationen, die kaum funktionalen Aspekten beinhaltet. Die polarisierenden erlernbaren Generics mit Wildcards und Rawtypes und und hoch gesteckten Ziele hat sie in die Medien der IT andere sehr bizarre Phänomene wie beispielsweise die Tat- katapultiert. Dabei soll Ceylon ausdrucksstärker, stabiler sache, dass alle Java-Objekte Semaphores sind. Diesem 15 und einfacherer als Java sein. Obwohl sie sich aktuell in Jahre alten Work-in-Progress-Feeling soll Ceylon ein Ende der Entwicklung befindet, sorgt die Sprache bereits jetzt bereiten. Die obersten Ziele sind demnach: Eleganz, Les- für heiße Diskussionen: Eine Umfrage auf JAXenter.de barkeit, Typsicherheit und Metaprogrammierung. hat ergeben, dass die Community die Notwendigkeit und den Nutzen einer weiteren Sprache anzweifelt [1]. Das Überblick mag vor allem an der Situation von Scala liegen, die zu- Um die Elemente einer Sprache zu überschauen und ei- letzt harte Kritik einstecken musste. Dieser Artikel ver- nen ersten Einblick in die Unterschiede beider Sprachen sucht die Ideen von Ceylon beispielhaft zu transportieren zu bekommen, ist es wichtig, das Typsystem von Java und direkt mit den Merkmalen von Java zu vergleichen, und Ceylon zu kennen (Abb. 1). um einen möglichen Mehrwert transparent zu machen. Auf Enums und primitive Datentypen verzichtet Cey- lon vollständig und erweitert das Typsystem um Union- Stand der Dinge und Intersection-Typen. Was das im Detail bedeutet, wird Nachdem Gavin King – die federführende Person von im späteren Vergleich deutlich. Neben dem Typsystem ist Hibernate und Seam – im 1. Quartal 2011 halbverse- das Vererbungsmodell von zentraler Bedeutung (Abb. 2). hentlich die Existenz des Ceylon-Projekts bekannt gab, Die Vererbungsmodelle von Java und Ceylon decken wurde Ende Dezember dann offiziell der erste Meilen- sich weitestgehend. Ceylon unterstützt die enumerierten stein (Newton) erreicht und somit das erste Release ver- Subklassen, die im späteren Verlauf anhand von Beispie- öffentlicht. Mit dem aktuellen Stand lassen sich bereits len erläutert werden. Das letzte Übersichtskriterium, das einfache Programme realisieren [2]. Empfehlenswert ist beim Einstieg in Ceylon helfen kann und notwendig ist die Entwicklungsumgebung Eclipse, da hierfür ein funk- um die Listings besser zu verstehen, ist das Wörterbuch tionsfähiges Plug-in existiert [3]. in Tabelle 1.2 javamagazin 6 | 2012 © Software & Support Media GmbH www.JAXenter.de
  • 3. SonderdruckVergleich von Java und Ceylon Abb. 1: ­TypsystemeZwar inspirierte Java die Gestaltung von Ceylon über- im Vergleichwiegend, jedoch sind auch Inhalte anderer objektorien-tierter und funktionaler Sprachen mit eingeflossen. Umdie konkreten Inhalte und Unterschiede transparent zumachen, werden die Inhalte von Ceylon in drei Katego-rien betrachtet:1. Neue Inhalte (nicht vorhanden in Java) Abb. 2:2. Ausgetauschte Inhalte (in Ceylon ersetzt) Verbungs-3. Entfernte Inhalte (nicht vorhanden in Ceylon) modelle im VergleichNeue Inhalte von CeylonHigh-Order Functions: Als „High-Order Functions“werden Funktionen bezeichnet, die andere Funktionenals Parameterargumente akzeptieren oder diese als Er-gebnis zurückliefern. Das ermöglicht funktionale Pro-grammierung in Ceylon. Diese Technik ist Grundlagefür eine ausgefeilte Closure-Verwendung und zentrale Listing 1Komponente von Ceylon. Die Syntax von „High-Order void repeat(Integer times, Callable<Void,Integer> perform) {Functions“ ist angelehnt an Smalltalk (Listing 1). for (i in 1..times) { Polymorphe Operatoren: Jeder Operator ist für be- perform(i);stimmte Datentypen definiert. Es gibt keine Unterstüt- }zung für benutzerdefiniertes Überladen von Operatoren. }Durch die Implementierung einer Schnittstelle für einenOperator kann die Anwendung des Operators für denimplementierenden Typ gewährleistet werden (Listing 2). Named Argument Syntax: Der Aufruf von Funktio- Listing 2nen kann unter Nutzung der „Named Argument Syn- shared class Dualzahl(String neueDualzahl) satisfies Summable<Dualzahl> {tax“ erfolgen. Diese Art von Funktionsaufrufen erhöht variable String dualzahl := neueDualzahl;bei einer Parameterliste mit mehr als zwei bis drei Über- // getter settergabewerten die Übersichtlichkeit sowie die Lesbarkeit. shared actual Dualzahl plus(Dualzahl other) {Dies ist eine typsichere und deklarative Spracherweite- // Addition der Dualzahlen this.dualzahlrung für die Initialisierung von Objekten und ermöglicht return summand;das einfache Erzeugen von Template-Funktionalitäten. }Durch diese Syntax können hierarchisch strukturierte }Daten wie beispielsweise Dokumente, Benutzerschnitt- // Beispiel Aufrufstellen und Konfigurationen im Quellcode ausgedrückt variable Dualzahl d1 := Dualzahl("1010");werden. Damit bietet Ceylon eine weitere Möglichkeit variable Dualzahl d2 := Dualzahl("1100");auf XML als strukturiertes Datenformat zu verzichten d1 := d1 + d2;und nähert sich bei der Initialisierung gängigen Daten-formaten wie JSON (Listing 3).Compilergeschützte Namenskonventionen: Ceylonkennt insgesamt drei Namensräume für Bezeichner Lexikalisches Lexikalisches Java Ceylonund zwingt den Entwickler zur Einhaltung definierter Element ElementKonventionen. Klassen, Interfaces und Typparame- implements Schlüsselwort satisfies Schlüsselwortter müssen mit einem Großbuchstaben beginnen. At- public Schlüsselwort shared (modul) Annotationtribute, Variablen und Methoden beginnen mit einem protected Schlüsselwort nicht vorhanden -Kleinbuchstaben. Packages müssen vollständig aus private Schlüsselwort (ohne Modifikator)Kleinbuchstaben bestehen (Listing 4). Attribute – C#-Style Properties: Attribute stellen flexible new Schlüsselwort nicht vorhanden -Mechanismen für das Lesen und Schreiben von Werten in final Schlüsselwort variable (Gegenteil) Annotationprivaten Klassenfeldern dar. Mit Attributen werden Getter abstract Schlüsselwort formal Annotationund Setter für Klassenfelder in Ceylon abgebildet. Diese @Override Annotation actual Annotationwerden in Ceylon auf drei verschiedene Arten deklariert: instanceof Schlüsselwort is SchlüsselwortSimple, Getter, Setter. Attribut-Definitionen können von null Schlüsselwort Nothing KlasseSubklassen überschrieben werden und unterstützen einepolymorphe Verwendung. Bei der Deklaration von Attri- Tabelle 1: Wörterbuch – Java, Ceylonwww.JAXenter.de © Software & Support Media GmbH javamagazin 6 | 2012 3
  • 4. Sonderdruck buten werden diese auf Konsistenz geprüft. Der Compiler Listing 3 stellt sicher, dass Name und Typ eines definierten Attri- bute Setters deckungsgleich zu einem korrespondierenden Html html { Attribute Getter sind. Falls kein Simple Attribute dekla- head = Head { riert wird, kann ein Attribute Getter auch mit der Named title = "Titel der Website"; Argument Syntax deklariert werden (Listing 5). }; Union und Intersection Types: Mit Union Types body = Body { werden mehrere Typen aus verschiedenen Zweigen der content = Div { Typhierarchie zu einem Typ zusammengeführt (Abb. 3 text = "Inhalt"; und 4). Der Union Type für die Typen A und B wird mit css = "meineCssKlasse"; A | B beschrieben. Dabei sind die Typen A und B Subty- }; pen des Union Typs A | B. Zukünftig wird geplant, dass }; Ceylon Aliase für Union Types unterstützen soll. Inter- } section Types bilden die Schnittstelle mehrerer Typen. Der Intersection Type für die Typen A und B wird mit A & B beschrieben (Listing 6). Listing 4 Void und Bottom: Alle Typen sind Subtypen der Klas- se Void, die in dem Modul ceylon.language definiert class MeineKlasse() {} // compile success wird. Das Attribut bottom vom Typ Bottom ist allen class meineKlasse() {} // compile error Typen zuweisbar. Die Instanziierung von Objekten die- class Bruch() { ser Typen ist nicht möglich. Float zaehler; // compile success Float Nenner; // compile error Ausgetauschte Inhalte } Neben den grundsätzlich neuen Inhalten hat Ceylon fol- Package package { gende bestehende Komponenten und Funktionalitäten name=neuerPackage; // Verstoß gegen Namenskonvention von Java entfernt und durch andere ersetzt. shared=true; // wird noch nicht vom compiler erkannt Keine expliziten C-ähnlichen Typecasts, sondern impli- } zite blocklokale Umwandlung in Folge einer Prüfung bei den Schlüsselwörtern is, exists und nonempty (Listing 7). Keine NullPointerException, sondern explizite Eingren- zung und korrespondierende Behandlung von Nullwer- Listing 5 ten. Bei der Deklaration von Variablen muss der Datentyp class Person(String neuerName) { explizit nullwertfähig deklariert werden, falls dieser Null- variable String name := neuerName; // simple attribute werte beinhalten können soll. Das geschieht entweder shared String currentName { return name; } // attribute getter über das „?“ hinter dem Datentyp oder als Union-Type- assign currentName { this.name := currentName; } // attribute setter Deklaration. Der Zugriff auf einen solchen Datentyp muss } über das Schlüsselwort exists geschützt werden, sodass class Konfiguration() { zur Compile-Zeit lesende Zugriffe auf Nullwerte ausge- // attribute getter mit named argument syntax schlossen sind. In Ceylon sind NullPointerExceptions un- shared Eintrag einstellung { möglich. Ceylon realisiert dies intern über einen impliziten id = "config1"; Cast von Nothing|String auf String, der durch das Schlüs- wert = "inhalt"; selwort exists ausgelöst wird (Listing 8). } Keine Überladung, sondern Default-Parameter, } U ­ nion Types und Varargs. Ceylon möchte auf die wort- reichen Elemente von überladenen Methoden verzich- Listing 6 Listing 7 // Verwendung von Intersection Type bei satisfies interface MeinInterface{} class MeineKlasse() satisfies Equality & Annotated {} class MeineAbleitung() satisfies MeinInterface{ // Verwendung von Union Type für die enumerierte Liste von Subtypen shared void sagHallo(){print("Hallo Welt!");} interface Identity of Person | Organization {} } // ... class Umwandlung(MeinInterface wirdUmgewandelt){ Integer|Float nummer = 3; if(is MeineAbleitung wirdUmgewandelt){ if (is Equality&Integer nummer) { wirdUmgewandelt.sagHallo(); //zugriff auf SubMethode // Verarbeitung ... } } }4 javamagazin 6 | 2012 © Software & Support Media GmbH www.JAXenter.de
  • 5. Sonderdruckten. So können diverse überladene Methodensignaturen Abb. 3: ­Vertikale undin Java durch eine einzige Methode in Ceylon abgebil- horizontaledet werden (Listing 9). Typkompa­ Keine Konstruktoren, sondern Initialisierungspara- tibilitätmeter. Ein einziger Initialisierungsblock pro Klasse stehtin Ceylon zur Verfügung. Ziel ist es, mehr Übersichtund Struktur in den einzelnen Klassen zu erzeugen. Ini-tialisierungsparameter werden dabei direkt in den ClassHeader geschrieben und können mit Default-Wertenvorbelegt werden (Listing 9). Keine „final“, sondern „variable“ Deklaration. InCeylon sind alle Variablen standardmäßig konstantund können über den „=“ Operator initialisiert werden.Wenn echte nichtkonstante Variablen benötigt werden,muss dies explizit vor dem Datentypen annotiert wer- Abb. 4:den. Außerdem erfolgt die Wertezuweisung ausschließ- Union undlich über den „:=“ Operator (Listing 10). Intersec- tion Type Keine Arrays, sondern Sequences. Die Sequenzenvon Ceylon verhalten sich ähnlich wie klassische Ar-rays, erlauben allerdings keine Manipulation der bein-halteten Elemente. Außerdem können Sequences nichtleer sein. Sie müssen mindestens ein Element beinhal-ten. Falls dennoch leere Sequences benötigt werden,kann dies über einen Union Type abgebildet werden: ­Empty|Sequence<String>. Die abgekürzte Schreibweise • Primitive Datentypen existieren nicht in Ceylon. Allefür diese Definition ist die bekannte Array-Deklaration: Typen können in der Sprache selbst ausgedrücktString[]. Beim Zugriff muss ähnlich wie bei Nullwerten werden. Deshalb sind alle Werte Instanzen der Klassevorher geprüft und implizit umgewandelt werden. Das Void. Der Ceylon Compiler behält sich jedoch vor,geschieht in diesem Fall durch das Schlüsselwort non- aus Performancegründen Umwandlungen in primitiveempty. Sequences erlauben komfortable Listenoperati- Datentypen der JVM vorzunehmen.onen (Listing 11). • Checked Exceptions sind nicht in das Fehlerbehand- Kein Reflection, sondern Metamodell. In Ceylon wird lungsmodell von Ceylon eingeflossen. Dieses lehntMetaprogrammierung anhand eines zur Compile-Zeit sich stark an Java an, schließt dabei aber grundsätz-typsicheren Metamodells realisiert. Dies hat zur Folge, lich „Checked Exceptions“ aus. Das hat zur Folge,dass generische Zugriffe auf Attribute, Methoden und dass es keine erzwungenen try-catch-Böcke gibt.Klassen nicht durch diverse Checked Exceptions geprüft • Statische Variablen und Methoden wurden im Aufbauwerden müssen. Die typischen Reflection Exceptions von Ceylon nicht berücksichtigt. Toplevel-Methodenwie ClassNotFoundException, SecurityException, No- und Attribute sind in Paketen deklariert und könnenSuchMethodException etc. existieren in Ceylon nicht. dadurch direkt auf Paketebene verwendet werden.Dies reduziert erheblich die Menge an Code – bestehend Dies führt zu einer einheitlichen modularen Struktur.aus endlosen try-catch-Blöcken – und stabilisiert dieMetaprogrammierung (Listing 12). Keine Raw-Types und Wildcards, sondern Co- und Listing 8Contravariant Type Parameter. Das „?“ und die fikti- // Compileclean, Zugriffe durch "exists" geschütztven Datentypen in generischen Parametern bereiten seit shared String lese(String? wert, Nothing|String wert2, String wert3){Java  5 den Entwicklern regelmäßig Kopfschmerzen. if (exists wert) { return wert; }Ceylon räumt hier auf und macht „generics-related error if (exists wert2) { return wert2; }messages [...] understandable to humans.“ [4] In diesem return wert3;Zuge sind die Schlüsselwörter in und out zu verwenden, }die den generischen Typ qualifizieren. in-Parameterdürfen ausschließlich in Argumentenlisten auftauchen,während out-Parameter nur als Rückgabetypen zu ver-wenden sind (Listing 13). Listing 9 class InitKlasse(Float version, String name = "Ceylon"){Entfernte Inhalte InitKlasse k1 = InitKlasse(1.0); //varargs StyleNeben den ausgetauschten Inhalten wurden bei der InitKlasse k2 = InitKlasse(9.0, "Java");Entwicklung von Ceylon auch einige komplett aus dem }Sprachumfang entfernt:www.JAXenter.de © Software & Support Media GmbH javamagazin 6 | 2012 5
  • 6. Sonderdruck • Synchronized-Methoden und -Blöcke sollen in Cey- Listing 10 lon zukünftig über Semaphores realisiert werden (Listing 14). class Variablen(){ String konstante = "fix"; Fazit variable String aenderbar := "ersetzen"; Bei der Analyse von Ceylon und entsprechenden Ent- konstante = "fehler"; //Compile Error wicklungsexperimenten ist uns aufgefallen, dass man aenderbar := "ok"; sich als Java-Entwickler schnell zurechtfindet. Da die } High-Order Functions, das Metamodell, die Callable- Komponenten sowie grundlegende Sprachmodule erst mit den kommenden Meilensteinen fertig gestellt wer- den, stößt man bei der Entwicklung mit Ceylon schnell Listing 11 an Grenzen. In diesem Rahmen sind uns die vereinfachte class MeineSequenzen(){ Initialisierung und die Union Types positiv aufgefallen. String[] leer1 = {}; Deren zusätzlicher horizontaler Polymorphie-Zweig er- Empty|Sequence<String> leer2 = {}; möglicht beispielsweise die „Empty“- und „Nothing“- variable Sequence<String> nichtLeer := {"Hallo"}; Erweiterung an Deklarationen, die zur flexiblen //merkwürdige Präzedenz: && höher als nonempty Nullwertsicherheit führt. Die Metaprogrammierung if((nonempty leer1) && (nonempty leer2)){ wird erst mit Meilenstein 5 zur Verfügung stehen, wirkt nichtLeer := leer1 + leer2; // Verknüpfung erst ab milestone 3 auf uns allerdings sehr vielversprechend [5]. Daneben } gibt es ein weiteres Entwicklungsprojekt Ceylon-JS, das Ceylon-Code zu JavaScript kompiliert. Die funktiona- } len Komponenten sowie die Konzepte der „Structured Data“ von Ceylon sind auf diesen Anwendungsfall aus- gerichtet. Natürlich muss Ceylon als Angreifer unserer Listing 12 geliebten Java-Sprache Kritik einstecken und einen lan- gen Weg gehen, bevor man von einem wirklichen „Java // Konzeptbeispiel, wird in Milestone 5 umgesetzt Killer“ wird sprechen können. Wir sehen große Stärken class MeinMeta(){ in generischen Entwicklungsbereichen und könnten uns Type<List<String>> stringListType = List<String>; vorstellen, dass Ceylon dort tendenziell leichter begrün- Class<Person,Name> personClass = Person; dete Anwendungsfälle findet. Ceylon punktet besonders Method<Log, Void, String> infoMethod = Log.info; in den Bereichen Typsicherheit und beeindruckt durch Method<String, Boolean, String> smaller = Comparable<String>. lesbaren, schlanken, aber ausdrucksstarken Code. Es smallerThan; bleibt dabei aber sehr flexibel. Das Motto von Ceylon, } „Say more, more clearly“, wird unserer Ansicht nach deutlich erkennbar gelebt. Wir empfehlen also jedem Java-Fan, auch mal eine Runde Tee zu genießen [6]. Listing 13 Frank Hinkel arbeitet in der Softwarearchitektur der Provinzial Rheinland Versicherung AG und entwickelt für das interne Web- interface Producer<in Input, out Value> { und SOA-Framework. Seine Schwerpunkte sind die Spring-Integ- shared formal Value produce(Input input); ration und das Bereitstellen einer Infrastruktur für die Realisierung } komplexer Geschäftslogik in Java. class FensterProducer() satisfies Producer<Material, Fenster> { shared actual Fenster produce(Material input) { Muhammet Altindal arbeitet bei der codecentric AG und realisiert derzeit ein zentrales CRM-System. Seine Schwerpunkte sind die return Fenster(input); Entwicklung von RIAs unter Verwendung der Technologien SmartGWT } und Vaadin. } Links & Literatur Listing 14 [1] http://it-republik.de/jaxenter/quickvote/results/1/poll/135 [2] http://ceylon-lang.org/download/ try (semaphore) { [3] http://ceylon-lang.org/documentation/ide/ if (!map.defines(key)) { map[key] := item; [4] http://ceylon-lang.org/documentation/spec/pdf/ceylon-language- specification.pdf } } [5] http://ceylon-lang.org/documentation/roadmap/ [6] http://ceylon-lang.org/documentation/introduction/6 javamagazin 6 | 2012 © Software & Support Media GmbH www.JAXenter.de

×