In Europa findet seit diesem Jahr jährlich die ElixirConfEU statt. Zum Auftakt in Krakau war auch ich mit dabei und möchte die Gelegenheit nutzen, euch mit den Programmiersprachen Elixir und Erlang vertraut zu machen.

Die Konferenz hat gezeigt, dass Elixir nicht nur was für innovationsbegeisterte Neulinge ist. Viele “Alte Hasen” und renommierte Firmen setzen auf Erlang und sind interessiert an einer Weiterentwicklung wie Elixir.  Zwar ist die Szene um diese Technologie bisher noch nicht so groß wie die von NodeJS, doch in den letzten Jahren hat sie sich als sehr beständig gezeigt. In vielerlei Hinsicht ist ein gesundes Wachstum auch sinnvoller, als sich in jeden neuen Hype und seine zahlreichen Schattenseiten zu stürzen.

Doch nun zum Thema dieses Artikels: Was sind Erlang und Elixir und was können wir in Zukunft von ihnen erwarten?

Wo geht die Reise hin?

Was man mit Elixir wohl nicht machen wird, ist native Desktop Anwendungen zu entwickeln oder eine neue Technologie im Browser einzuführen, da eignen sich andere Programmiersprachen weitaus besser für.
Wir wollen Elixir so betrachten wie es gedacht war: Als (Web-) Framework, Serveranwendung, als universelle Sprache für CLI-Programme oder auch im Embedded-Bereich.
Im Web-Umfeld hat Elixir neben den Platzhirschen Java, PHP und Ruby on Rails einiges zu bieten, was hauptsächlich durch sein wichtigstes Feature herrührt, dem mächtigen Aktor-Modell von Erlang.

erlang-logoErlang und sein Aktor-Modell

Unter Erlang versteht sich neben der ursprünglich an Prolog angelehnten Programmiersprache auch eine effiziente Virtuelle Maschine (VM), die sich nicht hinter der Java-VM verstecken muss. Erlang wird erfolgreich beim Facebook Chat, Github, Heroku oder WhatsApp verwendet, wo zehntausende von gleichzeitigen Verbindungen bearbeitet werden müssen.

Das Geheimnis von Erlang sind dabei die Prozesse, die am ehesten mit Threads verglichen werden können, jedoch wesentlich leichtgewichtiger sind. Es lassen sich problemlos tausende Prozesse starten, die von der Erlang VM automatisch über alle vorhandenen CPUs verteilt werden. Zwischen den Prozessen werden keine synchronisierten Funktionen aufgerufen, sondern asynchron Nachrichten verschickt und im empfangenden Prozess verarbeitet. Statt mit Objekten und Methoden, wird in Erlang also mit Prozessen und Nachrichten gearbeitet. So hat man die Möglichkeit, asynchronen und parallelen Code zu schreiben, der direkt vertikal skalieren kann. Um horizontal zu skalieren kann man einfach seine Prozesse auf weiteren Nodes starten.

Syntax matters

Eines der größten Mankos von Erlang ist wohl seine Programmiersprache, oder besser deren Syntax. Diese wirkt auf viele Programmierer altertümlich und kompliziert. Doch kompliziert ist Erlang ganz und gar nicht, es werden nur weniger geläufige, dafür aber sehr mächtige Konzepte genutzt. Teilweise stammen diese Konzepte aus funktionalen Sprachen, doch wurde Erlang nie als solche konzipiert – laut seiner Erschaffer sollte es nur “den Job richtig erledigen”.

Beispiel: Fibonacci in Erlang

fib(0) -> 0;
fib(1) -> 1;
fib(N) -> fib(N-1) + fib(N-2).

Was auf den ersten Blick ungewohnt und verwirrend erscheint, sind einfach nur drei verschiedene Funktionsblöcke der Funktion fib, die mittels Pattern Matching anhand der Argumente ausgewählt werden. So werden die häufigen if/else oder switch/case Konstruktionen aus anderen Programmiersprachen direkt in der Signatur der Funktion deklariert und auch Schleifen lassen sich leicht über Rekursion definieren. Eine for Schleife gibt es in Erlang leider gar nicht.

Leider hat die Syntax von Erlang über die Jahre wenig Weiterentwicklung erfahren und entspricht nicht mehr den Erwartungen, die heutige Entwickler an Programmiersprachen haben. Hier knüpft Elixir als eine syntaktische Mischung aus Erlang und Ruby an und versucht genau diese Erwartungen zu erfüllen.

elixir-logo-smallDie Neugeburt von Erlang heißt Elixir

Erlang ist bereits im Jahr 1987 erschienen, lange vor dem heutigen Internet mit seinen Hypes, Twitter oder Github. Somit hatte Erlang nie die Chance eine extrem breite Masse zu erreichen, was andere Sprachen wie NodeJS, Google Go oder Clojure beflügelt hat.
Seine Nische hat Erlang bisher in der Lösung von Problemen mit tausenden Clients und bidirektionaler Kommunikation gefunden und ist darin jahrzehntelang gewachsen. Diese Randposition wird nun verlassen; Erlang kann mit Elixir als universelle Programmiersprache betrachtet werden.

Anfang 2011 hat der Ruby-Kernentwickler José Valim mit der Arbeit an der Programmiersprache Elixir begonnen, die es inzwischen geschafft hat, mit neuzeitlichen Programmiersprachen gleichzuziehen und das Potenzial der Erlang-VM gekonnt auszuspielen. Elixir kompiliert zu Bytecode für die Erlang-VM (BEAM) und es lässt sich bestehender Erlang Code in Elixir weiter nutzen.

Das Fibonacci Beispiel sieht in Elixir umgesetzt etwas vertrauer aus:

defmodule Fib do 
  def fib(0) do 0 end
  def fib(1) do 1 end
  def fib(n) do fib(n-1) + fib(n-2) end
end

Wer tiefer in die Sprache einsteigt, wird viele Funktionen finden, die weit über die Möglichkeiten von Erlang hinausgehen:

  • Metaprogrammierung und Manipulation des Abstract Syntax Tree (AST).
  • Polymorphismus durch Protokolle.
  • Dokumentation und Attribute als first-class Elemente der Sprache.
  • Rekursion und Higher-Order Funktionen.
  • Lazy und Asynchrone Collections, sowie Streams.
  • Aktor Modell mit Shared-Nothing Prozessen.
  • Pattern Matching.
  • Unicode Support und UTF-8 Strings.

Elixir verfügt auch über weitaus mehr sprachliche Ausdrucksmöglichkeiten als Erlang. So finden sich in Elixir nützliche for Schleifen, Generatoren a <-

[1,2,3] oder die Pipeline |> für alle die weniger gern Rekursion verwenden. Praktisch ist hier ein Blick in den ElixirCheatSheet.

Am 10. September 2014 ist die Version v1.0.0 von Elixir veröffentlicht worden und somit ist die Sprache stabil. Seitdem gedeiht ein Ökosystem rundherum und Entwickler aus vielen anderen Sprachen wenden sich Elixir zu. Einen Einstieg in Elixir findet sich auf der Webseite des Projekts:  Getting Started.

Elixir ermöglicht es, in vertrauterer Syntax und mit der erprobten Erlang-VM ausgestattet, universelle Programme zu schreiben. Damit wird es zur unmittelbaren Konkurrenz für Java, PHP, Ruby und NodeJS.

Warum Elixir?

Was Erlang und Elixir sind und wie sie sich positionieren, wissen wir nun. Warum, aus technischer Sicht, Elixir die Plattform und Programmiersprache von Morgen sein könnte, behandeln wir jetzt.

Technisch gesehen hat Elixir alles, was aktuell in anderen Systemen auch möglich ist:

  • Wie in NodeJS, lässt sich Code leicht asynchron ausführen, jedoch automatisch über alle CPUs verteilt.
  • Wie in NodeJS, lässt sich asynchron über Nachrichten mit Sockets/Dateien arbeiten.
  • Wie in Java/Ruby, lassen sich Threads ausführen, jedoch nicht als ressourcenhungrige Betriebsystem-Threads, sondern sehr leichtgewichtig.
  • Wie in Java/Ruby, kann Code mittels Metaprogrammierung erzeugt/verändert werden. In Elixir wurde dies noch ausgeweitet und erlaubt Zugriff auf den AST, um so mächtige Makros zu erzeugen.
  • Wie in PHP kann Code geschrieben werden, der als eigener Prozess ausgeführt eine Response zur dem aktuellen Request generiert.
  • Es ist möglich, hochverfügbare Anwendungen zu schreiben, wie Saša Jurić in seinem Vortrag auf der ElixirConfEU präsentiert hat.

Wer jetzt Zweifel hat, wie eine Programmiersprache ohne Objektorientierung heutzutage sinnvoll sein kann, dem sei ein Zitat vom OOP Pionier und Smalltalk Erschaffer Alan Kay ans Herz gelegt:

“OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things.”
Quelle: //userpage.fu-berlin.de/~ram/pub/pub_jf47ht81Ht/doc_kay_oop_en

Diese Ansicht passt erstaunlich gut auf Erlang und Elixir, denn Objekte sind Prozesse mit lokalen Daten; es wird nur über Nachrichten kommuniziert; erst wenn andere Prozesse benötigt werden, wird der entsprechende Prozess ermittelt.

Die Community hinter Elixir hat auch ein effektives Ökosystem auf die Beine gestellt:

  • Der Paketmanager hex.pm erlaubt es, Elixir Code, sowie bestehenden Erlang Code, in Form von Paketen zu installieren.
  • Das Build-Tool mix erinnert an npm und ist das lokale Werkzeug des Entwicklers, welches Erlang leider bisher gefehlt hat.
  • Die Templating-Engine EEx kompiliert Templates direkt zu Code.
  • Das Test-Framework ExUnit testet Code auch parallel und kann mit QuickCheck erweitert werden.
  • Die Http Abstraktion Plug erlaubt es, Middlewares unabhängig von Frameworks zu entwickeln.
  • Einen vollen Überblick über die verfügbaren Pakete findet sich in meiner awesome-elixir Liste.

phoenix-logoBesonders interessant sind Elixir Web-Frameworks für interaktive Webseiten, Anwendungen und APIs jeder Art. Hier findet sich ein Projekt mit dem schönen Namen Phoenix. Der Hauptentwickler Chris McCord hat neben einem tollem Workshop, auch eine sehr interessante Keynote zu Phoenix gegeben, die ein paar der eindrucksvollen Features des Frameworks zeigt:

  • Jeder Request ist ein Prozess und so unabhängig vom Rest des Systems.
  • Routing über Domain Specific Language (DSL), welche zu optimierten Code kompiliert.
  • Middlewares, die Features der Anwendung wiederverwendbar machen.
  • MVC mit dem bekannten Controller, Views und Models und der Datenbankabstraktion Ecto von Eric Meadows-Jönsson.
  • Channels, die WebSockets mit bidirektionaler Kommunikation erlauben.
  • PubSub ermöglicht eventgetriebene Architekturen auch über externe Dienste wie Redis/RabbitMQ.

Im Vergleich mit anderen Frameworks bringt es Phoenix auch auf ordentliche Zahlen bei Throughput und Latency, wie man im phoenix-showdown sehen kann.

Aus Sicht eines Entwicklers sind alle wichtigen, und noch mehr interessante Funktionen vorhanden. Was in der Praxis oft noch fehlt, sind Projekte und Kunden, die genau diese Vorteile brauchen oder sich dafür entscheiden. Ein interessantes Beispiel könnte hier Bet365 sein, eine der weltweit führenden Webseiten für Online-Wetten in Echtzeit, die statt mit Java eine neue Anwendung erfolgreich mit Erlang umgesetzt haben.

Der Blick in die Glaskugel

In einer Auftragslage, die größtenteils von Prototypen mit NodeJS, Websites und CMS mit PHP oder Enterprise Solutions mit Java dominiert wird, fehlt vielen noch die Sichtweise für den Lösungsraum, den Elixir abdeckt. Noch befinden sich in diesem Raum hauptsächlich APIs, WebSockets und kleinere Websites/Applications. Mit stetigem Fortschritt wird sich Elixir aber als ernstzunehmender Konkurrent in der Entwicklung von CMS Websites und Enterprise Applications etablieren.
Auch im ganz neuen Feld “Industrie 4.0” oder InternetOfThings kann sich Erlang und somit auch Elixir behaupten. Ein interessantes Beispiel ist hier ein Quadrocopter, dessen Firmware in Erlang geschrieben ist und mittels Hot-Code Update während des Fluges aktualisiert wird. Auch interessante Spielereien sind möglich, wie Torben Hoffmann in seinem Talk “Building Lego Robots with Elixir” auf der ElixirConfEU gezeigt hat.

Geeignete Entwickler sind natürlich zunächst rar, fachkundige Leute können sich allerdings recht schnell in Elixir einarbeiten. Oder man “schnitzt” sich passende Mitarbeiter, denn viele Informatik-Studenten kommen heutzutage früh in Kontakt mit funktionaler Programmierung und haben weniger Hürden oder Be­rüh­rungs­ängste. Ein paar Programmierer im Haus zu haben, die auch abseits von ausgetretenen Wegen etwas mit funktionaler Programmierung anfangen können, kann eigentlich nicht verkehrt sein.

Elixir hat sich auf der ElixirConfEU in Krakau als neuer Mitspieler im Feld der Programmiersprachen präsentiert. In Zukunft wird vermehrt mit ihr zu rechnen sein. Was Elixir auszeichnet, ist der Antrieb, auf einer soliden Grundlage etwas Neues und Innovatives zu machen. Ganz im Gegensatz zu anderen Neulingen wie Go, Rust oder Clojure.

Für 2016 wurde die nächste ElixirConfEU in Berlin angekündigt, aber vorher gibt es am 01. Dezember, ebenfalls in Berlin, noch die Erlang Factory Lite. Ich für meinen Teil werde sicherlich dort anzutreffen sein und freue mich, andere Interessierte dort zu treffen!