Eine neue Programmiersprache? Bitte nicht schon wieder…

Funktionale Programmierung

Für alle neuen JVM-Sprachen gehört die Unterstützung funktionaler Programmierkonzepte zum guten Ton; selbst das gute alte Java soll um wenigstens ein Konstrukt aus diesem Umfeld (Closures) erweitert werden [1]. Als Lisp ist Clojure schon von den Grundkonzepten her eine funktionale Sprache (wenn auch nicht rein funktional wie z. B. Haskell). Wesentliches Merkmal funktionaler Sprachen ist, dass Funktionen ganz normale Werte sind, die als Parameter an andere Funktionen übergeben bzw. von diesen zurückgegeben werden können. Solche Funktionen höherer Ordnung (higher order functions) erlauben Konstrukte, die insbesondere in Verbindung mit mächtigen Datenstrukturen für sehr klar lesbaren und korrekten Code sorgen, vor allem im Vergleich mit den Anonymous-Inner-Class-Klimmzügen im Java-Umfeld. Sind Funktionen seiteneffektfrei, lassen sie sich außerdem perfekt parallelisieren und leichter testen. Clojure verzichtet auf ein Klassenmodell à la Java; stattdessen werden die verschiedenen Aspekte, die Java auf das Klassenkonstrukt abbildet, als separate Abstraktionen exponiert, die sich nach Bedarf kombinieren lassen.

Interaktive Entwicklung

Die „REPL“, also die interaktive Shell zur Evaluierung und Ausgabe von Ausdrücken, ist für Lisp- bzw. Clojure-Programmierer eines der wichtigsten Instrumente bei der Programmierung. Die Möglichkeit, Experimente durchzuführen, führt zu einem anderem, sehr viel interaktiveren Programmierstil. In Verbindung mit seiteneffektfreien Funktionen kann ein Teilbereich eines Systems explorativ untersucht und erweitert werden; typischerweise springt man dabei ständig zwischen interaktiver Eingabe und dem Schreiben ganzer Funktionen bzw. Namespaces hin und her. Diesen Vorteil theoretisch zu erklären ist sehr schwer; wer jedoch einmal mit einer REPL (und einer entsprechenden IDE) entwickelt hat, kann darauf nur noch schwer verzichten.

Unterstützung von Parallelverarbeitung

Das Argument, mit dem am häufigsten für Clojure geworben wird, haben wir bewusst ans Ende gestellt: Die Unterstützung für Parallelverarbeitung in Clojure erlaubt es, mit vergleichsweise geringem Aufwand Programme zu entwickeln, die Multi-Core-Systeme ausnutzen und dabei auch noch korrekt sind. Mechanismen wie Atome, Agenten und Referenzen/Software Transactional Memory wirken mit der konsequenten Immutability zusammen. Profitieren können Sie davon vor allem, wenn Sie ein CPU-gebundenes Problem haben, das sich für die Parallelisierung auf Multi-Core eignet. In vielen Businessanwendungen trifft dies nur auf eine vergleichsweise kleine Teilmenge der Probleme zu; dann jedoch ist die Parallelisierung in Clojure gerade im Vergleich zu Java überaus angenehm: Auf Locks, sychronized-Blöcke, Race Conditions, explizit als volatil zu deklarierende Instanzvariablen oder ConcurrentModificationExceptions verzichtet fast jeder Java-Entwickler gern.

Produktivitätssteigerung

Die Möglichkeiten zu internen DSLs, die mächtigen Datenstrukturen, die umfangreichen Bibliotheken von Funktionen höherer Ordnung, die interaktive Entwicklungsmöglichkeit: All diese Aspekte tragen dazu bei, dass Clojure – entsprechende Kenntnis des Entwicklers vorausgesetzt – eine äußerst produktive Umgebung bietet. Natürlich lässt sich von der Anzahl der Codezeilen nicht 1:1 auf eine Produktivitätssteigerung schließen. Eine systemimmanente Komplexität bleibt erhalten, ganz unabhängig davon, mit welchen Konstrukten und in welcher Sprache diese ausgedrückt wird. Unserer Erfahrung nach ist es jedoch mit Clojure möglich, die zufällige, ungewollte Komplexität, die aus der Technologieplattform entsteht, zu minimieren.

Fazit

Wir haben versprochen, die Nachteile nicht in den Mittelpunkt zu stellen und wollen uns daran auch halten. Dennoch ist klar, dass ein Wechsel einer Programmiersprache keine Kleinigkeit ist – selbstverständlich müssen Sie sehr genau überlegen, ob und in welchem Umfang das für Ihren spezifischen Projektkontext überhaupt denkbar ist. Und natürlich fehlen noch große Referenzprojekte; es wird sich noch kein Lebensversicherungsbestandsführungs- oder Core-Banking-System finden lassen, das vollständig in einer der neuen JVM-Sprachen implementiert ist. Sie sollten sich aber auf jeden Fall der Tatsache bewusst sein, dass Programmiersprachen keinesfalls gleich sind – jede hat ihre individuellen Stärken, und im richtigen Kontext eingesetzt, können Sie klare und messbare Vorteile in Produktivität, Qualität und Performance bringen. Wir sind daher davon überzeugt, dass Sie es sich selbst schuldig sind, sich zumindest zu informieren. Und sei es auch nur des intellektuellen Anreizes wegen, letzteres gerade bei Clojure, weil hier für OO-Entwickler der größte Schritt notwendig ist. Und Spaß macht es auch noch. Was will man mehr?

Stefan Tilkov ist Geschäftsführer und Principal Consultant bei der innoQ Deutschland GmbH, Autor von „REST und HTTP“, Verfasser diverser Fachartikel, häufiger Sprecher auf Konferenzen und enthusiastischer Anhänger der „Eine neue Programmiersprache pro Jahr“-Philosophie.
Kommentare

Schreibe einen Kommentar

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