Open Source im professionellen Einsatz
Linux-Magazin 09/2015
© Natallia Khlapushyna, 123RF

© Natallia Khlapushyna, 123RF

Funktional programmieren mit Elixir

Zauberhaftes Gemisch

Elixir 1.0 setzt auf die virtuelle Maschine von Erlang, bietet aber dank seiner Syntax einen einfachen Einstieg in die funktionale Programmierung. Mit Hilfe dieser dynamischen Mischung entwirft der Entwickler skalierbare und fehlertolerante Anwendungen im Serverumfeld.

831

Was Elixir in der Praxis kann, zeigt dieser Artikel, indem er mit Elixir [1] das verteilte Serversystem aus Abbildung 1 ausrollt. Darin läuft ein Proxy auf dem ersten Serverknoten und leitet eingehende HTTP-Anfragen zwecks Leistungssteigerung jeweils an einen von zwei Serverknoten im lokalen Netzwerk weiter. Beide Knoten speichern die Inhalte redundant und liefern auf die Anfrage hin jeweils identische Dokumente aus, die als Antwort über den Proxy zurück an den Client wandern.

Abbildung 1: Die Beispielanwendung nutzt das Loopback-Netzwerk von Localhost, um die drei Serverknoten zu simulieren.

Freundlicher Parasit

Listing 1 zeigt die Installation der aktuellen Version von Elixir (Stand: 1.0.4-1) unter Ubuntu 14.04. Zeile 1 holt zunächst über »wget« ein Debian-Paket ab, das auf ein externes Paket-Repository verweist, das die aktuellen Versionen von Elixir und Erlang [2] vorhält. Der Paketmanager »dpkg« verfrachtet die Liste in Zeile 2 an den richtigen Ort im Dateisystem, in der nächsten Zeile liest »apt-get update« die Liste ein. Abschließend installiert der Entwickler Elixir und das Paket »erlang-dev« auf dem Rechner.

Listing 1

Elixir unter Ubuntu 14.04 installieren

01 wget http://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb
02 sudo dpkg -i erlang-solutions_1.0_all.deb
03 sudo apt-get update
04 sudo apt-get install elixir erlang-dev

Der Befehl »iex« startet nach erfolgreicher Installation eine interaktive Session in der Shell. Der Ausdruck

:crypto.md5("Verwende crypto aus Erlang  OTP")

testet, ob Elixir mit Erlang kompatibel ist, indem er die Funktion »md5()« aus dem Erlang-Modul Crypto aufruft. In der Shell sollte »iex« die von »md5()« zurückgegebene Zeichenkette anzeigen, und zwar als Folge von Bytes, die spitze Klammern einzäunen (Abbildung 2).

Abbildung 2: Die interaktive Session unter iex lädt zum Ausprobieren ein.

Neben Bytefolgen bietet Elixir Tupel, Listen und Structs, um strukturierte Daten zu speichern. Die Liste

[{:app, :httpd}, {:version, "0.0.1"}]

speichert in ihrem Kopf das Tupel »{:app, :httpd}« , das seinerseits die beiden Literale »:app« und »:httpd« enthält. Die mit »:« eingeleiteten Literale nennt Elixir Atome. Sie kommen in der Sprache großflächig zum Einsatz.

Um Datenstrukturen zu entwirren, bringt Elixir Muster mit und tut es dabei Haskell [3] gleich. So ein Muster lässt sich beispielsweise links vom Gleichheitszeichen in dem Ausdruck

[{a, b}|_] = [mein: :haus, dein: :haus]

bewundern. Bevor Elixir es mit der Liste rechts abgleicht, überführt es diese zunächst in ihre Normalform »[{:mein, :haus}, {:dein :haus}]« . Beim Musterabgleich passt das Tupel im Kopf der Liste auf der linken Seite auf das entsprechende Tupel im Kopf der Liste auf der rechten Seite. Beide Tupel nehmen jeweils zwei Elemente auf. Konkret sind nach dem Abgleich die Variablen »a« und »:mein« sowie »b« und »:haus« . Der »_« -Operator rechts neben dem Pipe-Symbol im Muster passt zu jedem beliebigen Ausdruck, im Beispiel auf »:dein :haus« . Abbildung 2 zeigt noch einmal die Werte aus »a« und »b« nach dem Musterabgleich.

Alles im Griff

Das Buildtool »mix« unterstützt seine Benutzer dabei, Elixir-Projekte umzusetzen. Per Befehl über die Kommandozeile erstellt, kompiliert, startet und testet es Projekte. Ebenso wie »iex« landet »mix« auf dem Rechner, wenn der Entwickler Elixir installiert. Der Befehl »mix new httpd« erzeugt das Anwendungsgerüst für den geplanten Webserver (Listing 2).

Listing 2

Das Anwendungsgerüst für den Webserver

01 httpd
02 |- config
03    |- config.exs
04 |- lib
05    |- httpd.ex
06 |- mix.exs
07 |- README.md
08 |- test
09    |- httpd_test.exs
10    |- test_helper.exs

Die Datei »mix.exs« speichert die Konfiguration des Projekts (Listing 3). Zeile 1 deklariert mit dem Schlüsselwort »defmodule« ein Elixir-Modul »Httpd.Mixfile« , dann mündet der Code in einen »do end« -Block, der bis Zeile 15 reicht.

Listing 3

httpd/mix.exs (Projektkonfiguration)

01 defmodule Httpd.Mixfile do
02   use Mix.Project
03
04   def project do
05     [app: :httpd,
06      version: "0.0.1",
07      elixir: "~> 1.0",
08      deps: deps]
09   end
10
11   defp deps do
12     [{:cowboy, "~> 1.0.0"},
13       {:plug, "~> 0.13"}]
14   end
15 end

Der Block bindet in Zeile 2 über »use« das Makro »Mix.Project« ein. Öffentliche Funktionen wie »project()« leitet das Schlüsselwort »def« ein, bei privaten wie »deps()« kommt »defp« zum Zuge. Den Schlüsselwörtern folgen der Funktionsname sowie eine optionale Parameterliste. Der nachfolgende »do end« -Block bestimmt jeweils die Rückgabewerte der Funktionen.

Der Aufruf der Funktion »project()« (Zeilen 4 bis 9) gibt die Kerndaten des Projekts in Form einer Liste zurück, während »deps()« ab Zeile 11 die Abhängigkeiten des Projekts auflistet. Zu ihnen gehören das in Erlang verfasste Webserver-Framework Cowboy [4] (ab Version 1.0.0) und die Middleware Plug [5] (ab Version 0.13).

Private Funktionen lassen sich nur innerhalb des Moduls aufrufen. Gibt der Programmierer in die interaktive Shell »iex« den Aufruf »Http.Mixfile.deps()« ein, erhält er eine Fehlermeldung (»UndefinedFunctionError« ) zurück.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 5 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Elixir in Version 1.3 mit Kalendermodul

    Änderungen am Buildtool und am Test-Framework stechen als Neuerungen an Version 1.3 von Elixir ebenso hervor wie jene an der Sprache selbst. Neu ist auch ein Kalendermodul.

  • Phoenix 1.0: Web-Framework auf Elixir-Basis

    Anderthalb Jahre haben Entwickler an einem Web-Framework gearbeitet, das auf der funktionalen Programmiersprache Elixir basiert. Nun ist Phoenix in Version 1.0 zu haben.

  • Ruby on Rails

    Läuft alles nach Plan, setzen die Ruby-on-Rails-Macher Ende April 2017 die neue Version 5.1 aufs Gleis. Die liebt Javascript und hat unter anderem den flinken Javascript-Paketmanager Yarn an Bord. Zudem kann sie dank eigener Javascript-Bibliothek erstmals auf Jquery als Default-Option verzichten.

  • Crystal

    Das Open-Source-Projekt Crystal will das Beste zweier Welten vereinen: Die Einfachheit einer weitgehend zu Ruby ähnlichen Sprachsyntax mit der Geschwindigkeit und den Möglichkeiten der LLVM-Plattform.

  • Docker 1.0

    Dieser Workshop zeigt am Beispiel des Cloudstack Owncloud, wie stark die Entwickler das Integrieren etablierter Linux-Technologien wie LXC und Cgroups in Docker 1.0 abstrahiert und vereinfacht haben und wie Admins komplexe Szenarien in Containerumgebungen zähmen.

comments powered by Disqus

Ausgabe 09/2017

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.