"Erlang ist eine nebenläufige und verteilte funktionale Sprache." [Sahlin 1996]
Die native Unterstützung dieser drei Paradigmen durch einfache und leicht erlernsowie
anwendbare Sprachstrukturen machen die Programmiersprache Erlang zu
einem äußerst mächtigen Werkzeug wenn es darum geht, verteilte Anwendungen, die
durch viele leichtgewichtige Prozesse abbildbar sind, unkompliziert und sicher zu
realisieren.
Die Eigenschaft der Zustandsfreiheit, der prinzipielle Verzicht auf geteilten Speicher
und die Behandlung von Fehlern, die mittels Verbinden von Prozessen behandelt
werden können, stellen Funktionen zur Verfügung, welche die geforderte Sicherheit
verteilter Softwaresysteme auf relativ einfache Weise garantieren können.
Besonders im Hinblick darauf, dass Leistungszuwächse von Rechnern neuer
Generationen nicht auf schnellere einzelne Prozessoren sondern auf die Verteilung
der Rechenlast auf mehrere Prozessoren zurückzuführen sein wird, kann davon
ausgegangen werden, dass dieser Programmiersprache in naher Zukunft noch
bedeutende Relevanz zukommen wird.
Inhaltsverzeichnis
Abbildungsverzeichnis
Listingverzeichnis
1 Kurzfassung
2 Begriffsdefinitionen
3 Einleitung
4 Syntax
4.1 Ausdrücke
4.2 Variablen
4.3 Atome
4.4 Tupel
4.5 Listen
4.6 Module und Funktionen
4.7 Error Handling
5 verfügbare Programmierumgebungen
5.1 Standard-Programmierumgebung
5.2 Erlide
6 Unterschiede zu weitverbreiteten Sprachen
7 Paradigmen in Erlang
7.1 Ausgewählte Programmierparadigmen
7.2 Realisierung von Paradigmen in Erlang
7.3 In Erlang nicht realisierte Paradigmen
8 Allgemeiner Nutzen von Erlang
9 Literaturverzeichnis
Abbildungsverzeichnis
Abbildung 1: Klassifizierung von Programmiersprachen [Grabmüller 2003, S. 12]
Listingverzeichnis
Listing 1: Eine einfache Berechnung in Erlang
Listing 2: Zuweisung von Variablen mittels Pattern Matching
Listing 3: Anlegen eines Tupels, welcher mehrere Tupel enthält
Listing 4: Einsatz des Pattern Matching Operators zum Extrahieren von Werten
Listing 5: Einige Beispiele mit Listen
Listing 6: Definition einer Liste mit verschiedenen Figuren
Listing 7: Modul geometrie.erl
Listing 8: Kompilieren des Moduls geometrie und Test der Funktion flaeche()
Listing 9: Erweiterung des Moduls geometrie durch die Funktion totaleFlaeche()
Listing 10: Anwendung der Funktion totaleFlaeche()
Listing 11: Verwendung von case-Konstrukten in flaeche()
Listing 12: flaeche() mit Exceptions
Listing 13: Aufruf der neuen Funktion flaeche()
Listing 14: Funktion flaecheMitTryUndCatch()
Listing 15: Aufruf der Funktion flaecheMitTryUndCatch()
Listing 16: Pattern Matching in Funktionen [Armstrong 2007, S. 45]
Listing 17: Rekursive for-Schleife in Erlang [Armstrong 2007, S. 47]
Listing 18: Key-Value-Server, [Armstrong 2007, S. 170ff]
Listing 19: lokaler Testlauf des Servers
Listing 20: Start Node 1
Listing 21: Start Node 2
Listing 22: Nodes auf verschiedenen Maschinen
Listing 23: Testlauf KVS auf verteilten Rechnern
1 Kurzfassung
"Erlang ist eine nebenläufige und verteilte funktionale Sprache." [Sahlin 1996]
Die native Unterstützung dieser drei Paradigmen durch einfache und leicht erlern- sowie anwendbare Sprachstrukturen machen die Programmiersprache Erlang zu einem äußerst mächtigen Werkzeug wenn es darum geht, verteilte Anwendungen, die durch viele leichtgewichtige Prozesse abbildbar sind, unkompliziert und sicher zu realisieren.
Die Eigenschaft der Zustandsfreiheit, der prinzipielle Verzicht auf geteilten Speicher und die Behandlung von Fehlern, die mittels Verbinden von Prozessen behandelt werden können, stellen Funktionen zur Verfügung, welche die geforderte Sicherheit verteilter Softwaresysteme auf relativ einfache Weise garantieren können.
Besonders im Hinblick darauf, dass Leistungszuwächse von Rechnern neuer Generationen nicht auf schnellere einzelne Prozessoren sondern auf die Verteilung der Rechenlast auf mehrere Prozessoren zurückzuführen sein wird, kann davon ausgegangen werden, dass dieser Programmiersprache in naher Zukunft noch bedeutende Relevanz zukommen wird.
2 Begriffsdefinitionen
Abbildung in dieser Leseprobe nicht enthalten
Tabelle 1: Begriffsdefinitionen
3 Einleitung
Die folgende Arbeit behandelt die Programmiersprache Erlang mit speziellem Augenmerk auf die Umsetzung der Paradigmen funktionaler, verteilter und nebenläufiger Programmierung in dieser Sprache.
Zu diesem Zweck wird in den einleitenden Kapiteln 4-6 die Sprache, ihre Syntax sowie Parallelen und Unterschiede zu bekannten Programmiersprachen vorgestellt.
In weiterer Folge werden in Kapitel 7 die für diese Sprache wesentlichen Paradigmen theoretisch behandelt. Abschließend werden die theoretischen Kriterien dieser Paradigmen mit der konkreten Umsetzung in Erlang verglichen.
Zum Abschluss der Arbeit wird der allgemeine Nutzen von Erlang im Hinblick auf die Anwendungsmöglichkeiten behandelt.
4 Syntax
Die Syntax eines Erlang-Programms unterscheidet sich in einigen Teilen sehr wesentlich von der Syntax konventioneller Sprachen wie C++ oder Java. Im folgenden Kapitel sollen auf die Grundstrukturen der Erlang-Syntax eingegangen und wichtige Sprachkonstrukte dargestellt werden.
4.1 Ausdrücke
Ein Erlang-Programm ist primär aus verschiedenen Ausdrücken aufgebaut. Ein Ausdruck in Erlang hat immer einen bestimmten Wert und wird mit einem "." als Trennzeichen beendet. Kommentare werden in Erlang dagegen mit einem "%"- Zeichen eingeleitet. Der folgende Erlang-Code soll dies verdeutlichen [vgl. Armstrong 2007, S. 14]:
Abbildung in dieser Leseprobe nicht enthalten
Listing 1: Eine einfache Berechnung in Erlang
Zahlen können in Erlang entweder ganzzahlig (Integer) oder als Gleitkommazahl (Float) benützt werden. Für die Integer-Arithmetik benützt Erlang intern beliebig lange Integer. Dadurch wird das Problem eines Integer-Überlaufs ausgeschlossen.
4.2 Variablen
Variablennamen beginnen in Erlang stets mit einem Großbuchstaben und darauf folgend optional beliebig viele alphanumerischen Zeichen inklusive "_" und "@".
Beispiele für gültige Variablennamen wären somit: Variable1,
Meine_Zweite_Variable und Email@server_com.
Der erste wichtige Unterschied einer funktionalen Programmiersprache wie Erlang gegenüber konventionellen Programmiersprachen wie Java oder C++ wird bei den Variablen sichtbar. In Erlang können Variablen nur einmal mit einem Wert belegt werden. Ist der Wert einer Variable einmal festgelegt, kann er nicht mehr geändert werden. Dies hat den großen Vorteil, dass es keine Seiteneffekte durch veränderbare Variablen gibt, und sich Erlang Programme sehr einfach, parallel und über mehrere Systeme verteilt, ausführen lassen.
Eine Variable kann sich in den Zuständen ungebunden (noch kein Wert zugewiesen) und gebunden (bereits ein Wert zugewiesen) befinden. Alle Variablen sind anfangs in einem ungebundenem Zustand. Mittels Pattern Matching Operator "=" kann einer Variable ein Wert zugewiesen werden.
[Armstrong 2007, S. 18]. erklärt den Pattern Matching Operator im Zusammenhang mit der Zuweisung von Variablen folgendermaßen:
"Lhs = Rhs really means this: evaluate the right side (Rhs), and then match the result against the pattern on the let side (Lhs).
Now a variable, such as X, is a simple form of pattern. As we said earlier, variables can be given a value only once. The first time we say X = SomeExpression, Erlang says to itself, "What can I do to make this statement true?" Because X doesn't yet have a value, it can bind X to the value of SomeExpression, the statement becomes valid, and everyone is happy."
Der folgende Code soll dies weiter veranschaulichen [Vgl. Armstrong 2007, S. 19]:
Abbildung in dieser Leseprobe nicht enthalten
Listing 2: Zuweisung von Variablen mittels Pattern Matching
Besondere Bedeutung kommt den sogenannten anonymen Variablen zu, die mit "_" beginnen. Sie werden beim Pattern Matching als Wildcard verwendet.
4.3 Atome
Atome werden in Erlang benützt um verschiedenste konstante nicht-numerische Werte zu repräsentieren. Am ehesten lassen sich Atome mit Konstanten in C++ oder Java vergleichen. Der Wert eines Atoms ist das Atom selbst, d.h. das Atom "mai" trägt auch den Wert "mai".
Atome beginnen im Gegensatz zu Variablen mit einem Kleinbuchstaben und können, ähnlich wie Variablen, darauf folgend beliebig viele alphanumerische Zeichen inkl. "_" und "@" enthalten. Einige Beispiele für gültige Atome sind: atom1, blau, mai, true, false.
Den letzten zwei Atoms kommt eine besondere Bedeutung zu, denn Erlang kennt an sich keine booelschen Datentypen. Dieses Manko wird dadurch behoben, das stattdessen die Atoms true bzw. false benützt werden. Dies ist allerdings nur eine Konvention und sollte unbedingt von selbst geschriebenen Funktionen eingehalten werden.
4.4 Tupel
Tupel können am ehesten mit strukturierten Datentypen aus C verglichen werden. Sie werden immer dann benützt, wenn verschiedene Daten in einer einzelnen Entität zusammengefasst werden sollen. Tupel können ihrerseits auch wieder Tupel enthalten, wie der nachfolgende Code verdeutlichen soll [Vgl. Armstrong 2007, S. 24]:
Abbildung in dieser Leseprobe nicht enthalten
Listing 3: Anlegen eines Tupels, welcher mehrere Tupel enthält
Die Werte eines Tupels werden also zwischen zwei geschweiften Klammern, und mit Beistrichen getrennt, angegeben. Das obige Tupel {person, ...} besteht selbst aus mehreren Tupel wie zB {footsize, 42}. Hierbei stellt das Atom footsize den ersten Wert des Tupels dar und 42 als Integer-Wert den zweiten Wert. Die Atome im obigen Code, werden verwendet, um die Lesbarkeit zu erhöhen, sie könnten aber auch weggelassen werden.
Um Werte aus einem Tupel wieder zu extrahieren, kann der Pattern Matching Operator verwendet werden, wie im Folgenden dargestellt wird:
Abbildung in dieser Leseprobe nicht enthalten
Listing 4: Einsatz des Pattern Matching Operators zum Extrahieren von Werten
Wie schon in einem vorhergehenden Kapitel erwähnt wird hier "_" als anonyme Variable verwendet, die wie ein Wildcard Operator funktioniert. Gleichzeitig werden die Atome person und footsize verwendet, welche auch mit den Atomen person und footsize in der Variable Person matchen. Der Variable X wird der Wert 42 aus dem Tupel {footsize, 42} zugewiesen.
4.5 Listen
Listen werden in Erlang benützt um eine variable Anzahl von Elementen zu speichern. Erlang speichert beispielsweise Strings als eine Liste von Integer-Werten die den ASCII-Codes der einzelnen Zeichencharakter entsprechen.
Eine Liste besteht in Erlang immer aus einem Head und einem Tail. Das erste Element wird als Head bezeichnet, während die übrige Liste den Tail darstellt. Listen werden dadurch erzeugt, dass die Listenelemente durch Beistriche getrennt in eckigen Klammern angegeben werden. Bei einer gegebenen Liste [1,2,3,4,5] wäre zB der Head der Integer 1 und der Tail die Liste [2,3,4,5]. Die kleinste Liste, ist die leere Liste []. Zur Erzeugung einer Liste kann auch der [ ... | Tail ] Konstruktor verwendet werden, wie im nachfolgenden Beispiel unter anderem dargestellt wird:
Abbildung in dieser Leseprobe nicht enthalten
[...]
-
Laden Sie Ihre eigenen Arbeiten hoch! Geld verdienen und iPhone X gewinnen. -
Laden Sie Ihre eigenen Arbeiten hoch! Geld verdienen und iPhone X gewinnen. -
Laden Sie Ihre eigenen Arbeiten hoch! Geld verdienen und iPhone X gewinnen. -
Laden Sie Ihre eigenen Arbeiten hoch! Geld verdienen und iPhone X gewinnen. -
Laden Sie Ihre eigenen Arbeiten hoch! Geld verdienen und iPhone X gewinnen. -
Laden Sie Ihre eigenen Arbeiten hoch! Geld verdienen und iPhone X gewinnen. -
Laden Sie Ihre eigenen Arbeiten hoch! Geld verdienen und iPhone X gewinnen. -
Laden Sie Ihre eigenen Arbeiten hoch! Geld verdienen und iPhone X gewinnen.