Suche
Ahoi, Designenthusiasten!

Lux: der perfekte Mix aus Haskell und Clojure [Pirates of the JVM]

Redaktion JAXenter

Die schönsten Sonnenaufgänge in der Welt der Pirates of the JVM kann man auf der Insel Lux beobachten. Doch Vorsicht! Freibeuter, die sich im Besitz des einzig wahren Programmierkodexes wähnen, sind hier nicht gern gesehen, sagt Lux-Entdecker Eduardo Julian. Was Abenteurer sonst noch auf der Insel erwartet, und wie man Lux erfolgreich erforscht, hat er für uns zusammengefasst.

Im Funktionalen Ozean geht die Sonne über der kleinen Insel Lux immer als erstes auf. Ein passendes Bild, denn noch hat die metaphorische Sonne von Lux nicht ihren Zenit erreicht: Die Sprache befindet sich aktuell in der Beta-Phase. Oft tingeln Bewohner der Nachbarinsel Clojure herüber, die gerne das dynamisch-typisierte Leben gegen ein statischeres eintauschen wollen, ihre Abenteuerlust aber nicht verloren haben. Eduardo Julian, Vorsteher und Entdecker der Insel, erklärt Ihnen in dieser Folge der JVM-Piraten, was die Insel alles in petto hat.

Klick auf die Karte für die komplette Infografik.

JAXenter: Was hat dich dazu bewogen, mit Lux zu arbeiten? Welche Vorteile bietet Lux, die andere Programmiersprachen nicht haben?

Eduardo Julian: Clojures Design und der Mangel an Typen haben mich frustriert. Haskell hatte andererseits ein außergewöhnliches Design, aber dennoch einige Mängel mit denen ich unzufrieden war. Zudem war die Meta-Programmierung nicht so gut wie ich sie haben wollte. Lux basiert also auf dem Wunsch, Clojure und Haskell zu vermischen und das Beste aus beiden Welten mitzunehmen. Seit dem Projektstart forsche ich unentwegt weiter an Ideen, wie Lux seine Vorgänger übertreffen und zu einer wirklich bedeutsamen Sprache werden kann.

Lux ist ein statisch-typisiertes Lisp, was gleichermaßen gut für Clojure-User, die eine statisch-typisierte Sprache nutzen wollen, und für Haskell- bzw. Scala-User, die eine gerne in Lisp coden würden, ist. Lux unterstützt Concurrency-Ansätze in vielerlei Hinsicht; supportet werden Promises, funktional-reaktives Entwickeln, transaktionaler Speicher und das Aktorenmodell. Dazu bietet Lux großartige Werkzeuge zur Meta-Programmierung, wie etwa Zugriff auf den Compiler-Zustand, und die Möglichkeit, First-Class-Typen als Datenstruktur. Lux wurde entwickelt, um in möglichst vielen Umgebungen laufen und mit vielen verschiedenen Technologien interagieren zu können, beispielsweise JVM, JavaScript, .Net, Python, Ruby und LLVM.

JAXenter: Kannst du die Kernprinzipien der Sprache darlegen?

Eleganz über Zweckmäßigkeit

Eduardo Julian: Eines der Dinge, die mich mich von Clojure weggetrieben haben, war, dass sich ein Großteil des Designs wie ein Hack angefühlt hat. Ich kann diesbezüglich vieles vergeben, da sich einige dieser Ideen zuerst vermutlich super angehört haben, bevor sie sich später als nicht so gut offenbarten. Von Clojures Fehlern liegen aber die meisten meines Erachtens nach in Fahrlässigkeit, mangelnder Recherche und der Favorisierung von kurzlebigen Lösungen über gutem Design begründet.

Für Lux versuche ich in harter Arbeit alles passgenau auszufeilen, damit das Design der Sprache und der Bibliotheken am Ende das bestmögliche ist. Ich nehme jegliches Feedback und alle Verbesserungsvorschläge sehr ernst, da ich niemals das Gefühl bekommen möchte, dass Lux sein Potential nicht vollends ausschöpft.

Vielfalt über Dogmen

Ich glaube niemand weiß so wirklich, wie man Software schreibt. Es gibt viele Ideen und Theorien bezüglich des „einen, wahrhaften Wegs“, Software zu schreiben. Aber jeder, der behauptet, ihn zu kennen, ist entweder ein Lügner oder ein Narr. Aus diesem Grund bietet Lux den Programmierern verschiedene Tools und überlässt ihnen die Designwahl selbst.

Wo Erlang einem Aktoren und Go einem CSPs aufdrängt, bietet Lux Promises, funktional-reaktive Programmierung, transaktionaler Speicher und das Aktorenmodell. Du willst ML-Style-Module verwenden? Lux hat sie. Du willst polymorphes Typklassendesign? Lux hat es (ab v.0.5.0). Als Sprachendesigner ist es nicht meine Aufgabe, dir zu sagen, wie man codet. Es ist meine Aufgabe, dir dabei zu helfen, die bestmöglichsten Arbeiten abzuliefern.

Bottom-up über Top-down

Ich glaube, dass Software eher einem langsam wachsenden Organismus ähnelt als einem riesigen Block Marmor, den man plötzlich in Form bringen soll. Dementsprechend favorisiert Lux kombinierbare Abstraktionen besonders. Selbst die grundlegenden Datenstrukturen von Lux (Varianten und Tupel) sind kombinierbar, sowohl im Type-, als auch im Value-Level. Das bedeutet, dass man mittels Kombination von Funktionen Datentypen erzeugen kann, die den Funktionen selbst nicht bekannt sind.

Ein Beispiel:

(type: PrivacyModifier
  #PublicPM
  #PrivatePM
  #ProtectedPM
  #DefaultPM)

(def: privacy-modifier^
  (Syntax PrivacyModifier)
  (let [(^open) Monad]
    ($_ alt
        (this! (' #public))
        (this! (' #private))
        (this! (' #protected))
        (wrap []))))

In diesem Beispiel kann ich Instanzen von PrivacyModifier erstellen, indem ich schlicht einzelne Syntax-Parser kombiniere, die ihrerseits nichts über den letztendlichen Typ wissen.

JAXenter: Wie würde ein typisches Programm mit Lux aussehen?

Eduardo Julian: Hier sind zwei Programme aus dem Lux-Repository, die sich bei Interesse angeschaut werden können:

Das erste Programm ist quasi ein kleines Spielzeugprojekt, das eine To-do-Liste implementiert. Es ist eher quick-and-dirty, da es um die Demonstration geht, wie man einige grundlegende Merkmale der Sprache benutzt und wie eine JVM-Interaktion durchgeführt wird.

Luxdoc ist ein seriöseres Programm, das ich zur Generierung der Wiki-Dokumentation verwende. Durch den Fokus auf die Meta-Programmierung können damit einige der fortgeschritteneren Konzepte in Lux erlernt werden, wie zum Beispiel das Schreiben von Funktionen, die mit Compiler-Daten interagieren oder die Typen verrechnen (hier, um die Dokumentation zu generieren).

JAXenter: Für welche Art von Anwendungen / Use Cases eignet sich Lux besonders gut? Für welche eher weniger?

Eduardo Julian: Lux wurde als eine General-Purpose-Sprache (GPL) erdacht und ich wünsche mir, sie für Backend-, Frontend-, Mobile- und Desktop-Entwicklung gleichermaßen nutzen zu können. Lux zur verteilten Programmierung oder für das IoT einsetzen zu können, ist ebenfalls wichtig, da ich in diesen Bereichen bereits gearbeitet habe. Gleichwohl ist es keine Priorität, Lux zur schnellsten Sprache der Welt zu machen, sodass für rechenintensive Aufgaben oder System-Programmierung vielleicht noch immer compiled-to-native-Sprachen wie C oder C++ bevorzugt werden.

JAXenter: Wie ist der derzeitige Status Quo der Sprache?

Eduardo Julian: Lux entwickelte sich von etwas, das nur ich verwenden konnte (Anfang 2016) hin zu einer Sprache, die reif genug dafür ist, auch von anderen ausprobiert zu werden. Der Compiler ist ausgesprochen stabil und die Standardbibliothek ist merklich gewachsen und mittlerweile von hoher Qualität. Ich denke Lux ist endlich an dem Punkt angelangt, an dem es dafür genutzt werden kann, echte Software zu schreiben.

JAXenter: Welche Pläne gibt es für die Zukunft von Lux?

Eduardo Julian: Ich habe für eine nunmehr längere Zeit versprochen, Lux für mehrere Plattformen fit zu machen. Die Einhaltung des Versprechens hat sich leider wiederholt verzögert, da ich bislang andere Prioritäten hatte. Mit Version 0.5.0 habe ich allerdings angefangen, das Versprechen langsam in die Tat umzusetzen: Lux beinhaltet ab sofort Android-Support.

Für Version 0.6.0 ist die Unterstützung von JavaScript geplant und ich möchte Lux mit jedem neuen Release auf eine weitere Plattform bringen, bis ich mein Ziel, Lux zu einer universellen Sprache gemacht zu haben, erreiche.

JAXenter: Wie können Interessierte in Lux einsteigen?

Eduardo Julian: Der beste Weg, sich mit Lux auseinanderzusetzen, ist das dazugehörige Buch zu lesen, welches auf GitBook kostenfrei zur Verfügung gestellt wird. Ich stelle immer sicher, dass es zu jedem neuen Release aktualisiert wird. Zusätzlich kann man sich in die Mailingliste eintragen und dem Gitter Chatroom beitreten, wo ich Fragen beantworte, Beispiele gebe und Beratung biete. Selbstverständlich kann man mich auch per E-Mail erreichen: luxlisp@gmail.com

Eduardo Julian ist seit 2008 Entwickler und hat bereits eine Vielzahl an Programmiersprachen, Frameworks und Datenbanken erforscht. Er ist ein vielseitiger und anpassungsfähiger Programmierer. Er lernt leidenschaftlich und schnell und ist hungrig auf alles, was neu ist.

Die Pirates of the JVM

Gehen wir auf Schatzsuche! In der Infografik „Pirates of the JVM“ verbirgt sich so manches Programmiersprachen-Juwel, das inspirierte Entwickler auf der Java-Plattform für sich entdecken werden. Doch sehen Sie selbst…

Piratenflagge via Shutterstock.com / katyam1983

Geschrieben von
Kommentare

Schreibe einen Kommentar

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