Eine kleine Einführung in die rein funktionale Programmierung

In Verbindung mit der funktionalen Programmierung taucht oft der Begriff der rein funktionalen Programmierung auf. Die „Reinheit“ bezeichnet dabei den Verzicht auf Seiteneffekte, meist im besonderen den Verzicht auf Zuweisungen an Variablen.

Entwicklern, die hauptsächlich in traditionellen objektorientierten Sprachen zu Hause sind, erscheint diese Art der Programmierung oft fremdartig und einschränkend - es geht ja schließlich erst einmal um Verzicht. Wie Asketen wissen, erschließt Verzicht oft ungeahnte neue Kräfte: Darum wird es auf diesem Blog später noch gehen. Dieser Beitrag beschäftigt sich erst einmal damit, wie das überhaupt geht mit der rein funktionalen Programmierung.

Weiterlesen...

Parallele Programmierung mit Haskell

Computerprozessoren werden heutzutage nicht mehr mit jeder neue Generation schneller und schneller. Stattdessen konzentrieren sich die Chiphersteller darauf mehr Prozessorkerne in unsere Rechner einzubauen. Für die Softwareentwicklung bedeutet dies dass Software nicht mehr automatisch mit jeder Prozessorgeneration schneller läuft sondern dass die Entwickler dafür etwas tun müssen.

Ein Zauberwort heißt daher parallele Programmierung. Damit ist gemeint dass verschiedene Teile eines Programms gleichzeitg ablaufen können, somit mehrere Prozessorkerne auslasten und im Endeffekt schneller an‘s Ziel kommen. Die automatische Parallelisierung von Software ist allerdings immer noch ein Traum; stattdessen muss Parallelität von Hand in die Software eingebaut werden. Funktionale Programmierung eignet sich hervorragend zur parallelen Programmierung, insbesondere weil funktionale Programme diszipliniert und sparsam mit Seiteneffekten umgehen und damit ein großes Hindernis für Parallelität von Grund auf vermeiden.

Dieser Artikel demonstriert, wie man in der funktionalen Sprache Haskell sehr einfach und elegant parallele Programme schreiben kann. Dazu stelle ich eine Haskell-Bibliothek vor, die Parallelität ermöglicht ohne dabei auf ein deterministisches Programmverhalten zu verzichten. Das bedeutet dass ein mit der Bibliothek entwickeltes paralleles Programm garantiert dasselbe Ergebnis liefert, egal ob es auf einem, zwei oder 32 Prozessorkernen läuft (sofern das Programm keine anderen, nicht-deterministischen Teile enthält). In anderen Sprachen ist im Gegensatz dazu Parallelität häufig nicht-deterministisch. Damit werden Programme deutlicher schwerer zu debuggen, da sie beispielsweise auf einem Kern wunderbar funktionieren, auf zwei Kernen aber das falsche Ergenbis berechnen und es auf vier Kernen hin und wieder zu einem Deadlock kommt.

Als kleine Vorausblick hier der Speedup in Relation zur Anzahl der Kerne, den wir mit Parallelität in Haskell durch eine sehr einfache Modifikation eines ursprünglich sequentiellen Programms erzielen können:

</img>


Zum Verständnis des Artikels sind Grundkenntnisse in Haskell sowie Bekanntschaft mit der do-Notation hilfreich.

Weiterlesen...

Funktional Programmieren am konkreten Beispiel (Ant)

Die Vorteile der funktionalen Programmierung bei der Code-Wiederverwendung, Test- und Beweisbarkeit oder der Parallelisierung kann man abstrakt aufzählen und erläutern, aber wesentlich anschaulicher wird es doch, wenn man mal die gleiche Funktionalität in einer imperativen und einer funktionalen Sprache gegenüberstellt.

In diesem konkreten Beispiel nehmen wir einen kleinen Teil eines reellen Java-Programms, und zeigen wie dieser mit rein funktionalen Elementen in der Programmiersprache Scala implementiert werden kann. Dabei wird zum Beispiel deutlich, wie die um ein vielfaches besseren Möglichkeiten der Wiederverendung von Code die Fehlerrate deutlich senkt.

Weiterlesen...