Ein zweiter Blick auf JVM-Programmiersprachen

Groovy, Scala, Clojure, Ceylon, Kotlin und Fantom sollen frischen Wind auf die Java Virtual Machine bringen. Doch welche Programmiersprache ist für welchen Anwendungsfall sinnvoll, und was macht sie jeweils aus?

In Pocket speichern vorlesen Druckansicht 19 Kommentare lesen
Lesezeit: 23 Min.
Von
  • Simon Olofsson
Inhaltsverzeichnis

Groovy, Scala, Clojure, Ceylon, Kotlin und Fantom sollen frischen Wind auf die Java Virtual Machine bringen. Doch welche Programmiersprache ist für welchen Anwendungsfall sinnvoll, und was macht sie jeweils aus?

Die Java Virtual Machine (JVM) hat sich im letzten Jahrzehnt von einer Laufzeitumgebung für Java-Programme zu einer polyglotten VM gewandelt. Neben Java gibt es auf ihr inzwischen etliche andere Programmiersprachen. Es existieren sowohl Portierungen bekannter Sprachen, wie Python oder Ruby, als auch Neuentwicklungen. Benjamin Schmid hat in seinem Artikel einen guten Überblick über einige Sprachen gegeben, der an dieser Stelle erweitert und vertieft werden soll.

Der vorliegende Artikel beschäftigt sich mit sechs Programmiersprachen, die für die JVM entwickelt wurden und zu Bytecode kompilieren. Xtend und ähnliche Projekte, in denen ein Compiler die Quellen in Java-Code überführt (auch als Transpilierung bezeichnet), sollen nicht berücksichtigt werden.

Einige Beispiele stellen Besonderheiten und interessante Konzepte der unterschiedlichen Programmiersprachen vor, wobei nur wenige davon exklusiv in einer Sprache vorhanden sind. Sie beeinflussen sich vielmehr gegenseitig. Daher ist es umso wichtiger, den Überblick über den aktuellen Stand zu behalten.

Groovy ist eine dynamisch typisierte Programmiersprache, deren Entwicklung 2003 begann. Eine statische Typprüfung ist in ihr optional möglich. Der Einstieg gestaltet sich recht einfach, da die meisten Java-Programme auch in Groovy gültig sind. Im folgenden Code-Ausschnitt definiert der Entwickler mit def eine Funktion und interpoliert den ausgegebenen String beziehungsweise ersetzt die enthaltene
Variable. Es ist zudem ersichtlich, dass Semikolons und Klammern beim Methodenaufruf optional sind.

def sayHello(name) {
println "Hallo $name!"
}

sayHello "JavaLand"

Eine der Stärken von Groovy ist die breite Unterstützung von Collections. So gibt es einen Typ Range, der ein Intervall erzeugt. Im unten stehenden Beispiel ist der Typ explizit angegeben, was sich insbesondere bei Methodenparametern zur besseren Dokumentation empfiehlt. Die Methode collect (der Name stammt aus Smalltalk und ist in anderen Programmiersprachen auch als map bekannt) ruft eine Funktion für jedes Element einer Collection auf und erzeugt aus den Rückgabewerten eine neue Collection. Im Code-Ausschnitt wurde das durch den impliziten Parameter it referenzierte Element mit zwei multipliziert.

Range range = 1..10

def doubled = range.collect {
it * 2
}

Wenn alle Elemente einer Collection auszuwählen sind, ist der Star-Dot-Operator nützlich:

def list = ["Star", "Dot", "Operator"]

def loweredList = list*.toLowerCase()

Das Programm ruft für alle Elemente der Liste die Funktion toLowerCase auf. Auch für Maps gibt es in Groovy vielfältige Verwendungsmöglichkeiten, es lassen sich beispielsweise Funktionen in ihnen speichern und anschließend aufrufen.

def map = [
function: {
println "Eine Funktion in einer Map!"
}
]

map.function()

Ihr Einsatz ist sinnvoll, wenn das Erstellen einer Klasse zu viel Overhead birgt, beispielsweise wenn ein Objekt für Tests zu mocken ist.

Der ungewollte Zugriff auf Nullwerte und die daraus resultierende Null-Pointer-Exception gehören zu den am häufigsten auftretenden Fehlerquellen in Java. Groovy bietet mit dem Elvis-Operator (der übrigens so heißt, weil er an die Haartolle von Elvis Presley erinnert) eine vereinfachte Form des ternären Operators an, um beispielsweise einen Standardwert zu verwenden, wenn eine Variable null ist (null ist in Groovy false). Der im Folgenden gezeigte Operator ist also äquivalent zum Elvis-Operator. Darüber hinaus erspart der Safe-Navigation-Operator die Überprüfung auf Nullwerte bei der Navigation eines Objektgraphen, da er Null zurück gibt, sobald ein Nullwert vorkommt.

def conference = [name: "JavaLand"]

// ternärer Operator
println conference.name ?
conference.name : "Unknown"

// Elvis-Operator
println conference.name ?: "Unknown"

// Safe-Navigation-Operator
conference.name?.toLowerCase()

Als abschließendes Beispiel sollen noch kurz die Builder vorgestellt werden, die das Erstellen von verschachteltem Markup erleichtern. Der folgende Quelltextauszug zeigt, wie sich eine einfache HTML-Seite mit dem XML-Markup-Builder generieren lässt.

def builder =
new groovy.xml.MarkupBuilder()

builder.html {
body {
a(href: 'http://groovy.codehaus.org',
"Mit Groovy erstellt")
}
}

Groovy ist eine ausgereifte Sprache, die einige Verbesserungen gegenüber Java mitbringt. Viele Projekte setzen sie als Ergänzung ein, um bestimmte Teile einer Applikation einfacher entwickeln zu können. So sind Tests, Skripte oder domänenspezifische Sprachen ein oft genannter Anwendungsfall für Groovy. Aber auch als Hauptsprache ist Groovy aufgrund der zahlreichen Features und der optionalen statischen Typprüfung eine gute Wahl. Zur Entwicklung von Webapplikationen bietet sich mit Grails ein robustes und durchdachtes Framework an.