Sprachen für die JVM im Zusammenspiel mit Java

Sprachen  –  16 Kommentare

Neuere Sprachen für die Java-Plattform wie Groovy, Scala oder Clojure lassen sich statt oder in Kombination mit Java einsetzen. Mit ihnen können Java-Entwickler ihre tägliche Arbeit spürbar verbessern. Denn Java enthält durchaus einige Defizite, die Oracle aufgrund der geforderten Abwärtskompatibilität auch in neuen Versionen wie Java 7 oder 8 nicht beseitigen kann.

Die Java-Plattform umfasst weit mehr als nur die Programmiersprache Java. Sie besteht auch aus Bibliotheken wie JDBC, JMX oder Swing, Deployment-Techniken, Tools wie den Java-Compiler sowie der Java Virtual Machine (JVM), der den Bytecode der Java-Programme ausführenden Laufzeitumgebung. Zudem bietet die Plattform:

  • Lauffähigkeit auf allen wichtigen Systemen,
  • Ausgereiftheit und hohe Stabilität,
  • eine gute Performance,
  • vielfältige Konfigurierbarkeit wie Garbage-Collection- oder Heap-Einstellungen,
  • eine große Entwickler-Community mit qualitativ hochwertigen Bibliotheken und
  • eine große Verbreitung.

Die Sprache Java verfügt jedoch auch über einige Eigenschaften, die nicht für alle Einsatzszenarien hilfreich sind. Beispielsweise ist Java streng statisch typisiert, dynamische Fähigkeiten sind erst mal nicht vorhanden. Die Sprache ist darüber hinaus nicht vollständig objektorientiert und besitzt implizit keine funktionalen Konzepte. Des Weiteren verwendet die Sprache für die Parallelprogrammierung ein komplexes Programmiermodell mit Threads und Locks. Aufgrund garantierter vollständiger Rückwärtskompatibilität ist eine Flexibilität hinsichtlich Optimierungen und Neuerungen schwierig zu leisten.

Das hinterlässt eine Lücke, in die andere auf der Java-Plattform laufende Sprachen stoßen. Diese sogenannten JVM-Sprachen leisten das, was bei .NET mit C, C++, C#, F# oder Silverlight (XAML) schon lange üblich ist: Sprachauswahl nach dem Motto "Right tool for the right job". Voraussetzung hierfür ist, dass die neuen JVM-Sprachen "nur" kompatiblen Bytecode generieren müssen, um auf der JVM einsetzbar zu sein.

Bekannteste Vertreter der JVM-Sprachen sind wohl Groovy, Scala, der Lisp-Dialekt Clojure sowie die Portierungen anderer Sprachen wie Jython (Python), JRuby (Ruby), Rhino (JavaScript) und Erjang (Erlang). Mit Ceylon, Fantom und Kotlin sind außerdem gleich drei neue Sprachen in der Entstehung, die zurzeit die Gunst der Öffentlichkeit zu gewinnen suchen. Daneben existieren etwa 240 weitere JVM-Sprachen – oftmals jedoch nur mit Forschungscharakter. Die Sprachen gehen viele der geschilderten Defizite Javas unterschiedlich an. Beispielsweise nutzen einige gänzlich andere Ideen, etwa dynamische Typisierung, Mehrfachvererbung oder funktionale Konzepte.

Dieser Artikel zeigt, warum Entwickler neben Java auch andere Programmiersprachen auf der Java-Plattform einsetzen sollten. Dabei ist es nicht immer sinnvoll, gleich das gesamte Projekt in einer anderen Sprache zu realisieren – oft ist nur ihr Einsatz in einzelnen Teilbereichen sinnvoll.

Hat man weniger Quellcode zu schreiben, bedeutet das nicht nur weniger Aufwand in der Entwicklung, sondern auch einen geringeren Aufwand für das Lesen, Analysieren, Refactoring und Debugging des Codes. Fast alle wichtigen JVM-Sprachen bringen diese Eigenschaft gegenüber Java ins Spiel. Beispielsweise können Entwickler mit ihnen oft Punkte und Klammern bei Methodenaufrufen sowie Strichpunkte einfach weglassen. Durch das Überladen von Operatoren lassen sich zudem lange Methodennamen ersetzen. Zusätzliche Sprachfunktionen wie das Weglassen von Typen bei dynamischen Sprachen oder automatische Typinferenz bei statischen Sprachen sind ebenfalls anzutreffen. Ein gutes Beispiel für wenig Quellcode ist die native Unterstützung bei der XML-Verarbeitung, wie das folgende XML-Dokument zeigt:

<books>
<book isbn="...">
<title>Groovy in Action</title>
<author>Dierk Koenig</author>
<author>Paul King</author>
...
</book>
<book isbn="...">
...
</book>
</books>

Soll der Titel des zweiten Buchs ausgegeben werden, reichen dazu beispielsweise in Groovy folgende zwei Zeilen aus:

root = new XmlSlurper().parse('books.xml')
println root.book[1].title

Auf den entsprechenden Java-Code – egal ob mit JAXB (Java Architecture for XML Binding) oder einer anderen Bibliothek – wird aus Platzgründen verzichtet.