Elm - Architektur
Seiteneffekte
Elm ist eine rein funktionale Sprache. Das bedeutet, dass Funktionen keine Seiteneffekte haben, also nichts außerhalb der Funktion verändern. Es dürfen keine Dateien geschrieben werden oder Daten ins Netzwerk gesendet werden. Eine Funktion darf nicht einmal eine Ausgabe auf dem Bildschirm erzeugen. Außerdem müssen Funktionen immer das gleiche Ergebnis liefern, wenn sie mit den gleichen Parametern aufgerufen werden. Eine Funktion darf also auch nicht von einer Zufallszahl, die innerhalb der Funktion generiert wird, oder von einer Benutzereingabe abhängen.
Ein Programm, das bei der Ausführung keine Ausgabe erzeugen darf und keine Daten speichern kann, ist im Normalfall natürlich nicht besonders nützlich. Die Frage, die sich also stellt, ist: Wie können Elm-Programme trotzdem mit der Außenwelt interagieren?
The Elm Architecture - TEA
Elm löst dieses Problem mit der sogenannten Elm Architecture. In englischsprachigen Texten wird sie oft mit TEA abgekürzt. Die Grundidee dabei ist, dass das eigentliche Elm-Programm rein funktional bleibt, während alle Seiteneffekte von der Elm-Laufzeit-Umgebung (engl.: Runtime), die beim Übersetzen des Elm-Programms in JavaScript erzeugt wird, übernommen werden. Die folgende Grafik verdeutlicht das Konzept.
Wir gehen zur Vereinfachung erst einmal davon aus, dass der zu verschlüsselnde Text fest ist und nicht vom Benutzer eingegeben wird. Nur der Schlüssel - also die Verschiebezahl - soll vom Benutzer verändert werden. Das Datenmodell des Programms besteht also nur aus dem Schlüssel.
- Das initiale Datenmodell wird von der Laufzeit-Umgebung abgerufen.
- Die view-Funktion wird mit dem Datenmodell aufgerufen...
- ... und berechnet daraus eine Beschreibung der Webseite, die potentiell eine Nachricht vom Typ Msg erzeugt.
- Die Laufzeit-Umgebung stellt die Webseite dar.
- Der Benutzer interagiert mit der Seite z.B. durch Klick auf den Button zum Erhöhen des Schlüssels.
- Die update-Funktion wird mit der Nachricht Erhoehen und dem aktuellen Datenmodell aufgerufen...
- ... und berechnet daraus das neue
Datenmodell.
Im nächsten Schritt muss also wieder die
view-Funktion aufgerufen werden...
Klicke auf die einzelnen Schritte zur Veranschaulichung.
Aufgabe
(a) Klicke dich durch die einzelnen Schritte der Grafik, um die Elm-Architektur zu verstehen und beschreibe die einzelnen Schritte in eigenen Worten. Verdeutliche wie es in Elm möglich ist, dass alle Funktionen rein funktional (auf englisch: purely functional) bleiben und dennoch Seiteneffekte erzeugt werden können.
(b) Stelle den Prozess in einem Rollenspiel dar.
Eine Person spielt die Rolle der Laufzeit-Umgebung,
eine Person stellt das initiale Datenmodell bereit,
je eine Person spielt die view- und die update-Funktion, eine weitere
Person spielt die Rolle des Benutzers, der mit der Webseite interagiert.
Nutze Papierzettel, um die Datenmodelle, Nachrichten, abstrakte Html-Darstellung
und die Webseite zu visualisieren.
Verdeutliche auch im Rollenspiel, wie die Funktionen rein funktional bleiben und
dennoch Seiteneffekte erzeugt werden können.
Exkurs: Laufzeit-Umgebung - Runtime Environment
Laufzeit-Umgebungen gibt es auch in anderen Programmiersprachen, z.B. in Java. Dort wird die Laufzeit-Umgebung JVM (Java Virtual Machine) genannt. Während die JVM für Java einmal auf einem Rechner installiert wird und dann alle Java-Programme ausführen kann, wird die Laufzeit-Umgebung für Elm bei jedem Übersetzen eines Elm-Programms in JavaScript erzeugt. Jedes Elm-Programm hat also seine eigene Laufzeit-Umgebung. Da nur die Funktionen und Daten, die für das jeweilige Programm benötigt werden, in die Laufzeit-Umgebung eingebunden werden, ist sie sehr klein und effizient. Das ist besonders wichtig, da Elm-Programme im Normalfall in Webseiten eingebettet werden und die Laufzeit-Umgebung nicht unnötig viel Speicher verbrauchen darf.
Die Laufzeit-Umgebung für Elm wird zusammen mit dem übersetzten Elm-Programm als einzelne Datei in die Webseite eingebunden. Für einfache Programme ist diese Datei nur einige Kilobyte groß. Die JVM für Java hingegen ist einige Megabyte groß.