Warum funktional?

Warum haben wir als Firma entschieden Softwareentwicklung fast ausschließlich in funktionalen Programmiersprachen durchzuführen? Dieses Blog gibt auf diese Fragen jede Woche eine neue Antwort. Und wir hoffen mit unseren Antworten Softwareentwickler und Manager von funktionaler Programmierung zu überzeugen.

Uns ist aber auch klar dass nicht in jedem Projekt eine funktionale Sprache zum Einsatz kommen kann, sei es aus politischen Gründen oder aufgrund externer Zwängen. So werden beispielsweise iOS-Apps typischerweise in Objective-C geschrieben und eine moderene Webanwendung wird mit großer Wahrscheinlichkeit in Javascript entwickelt.

Heute möchte ich eine Antwort auf die Frage „warum funktional?“ anhand eines Beispiels aus der Praxis geben. Das Beispiel stammt aus meiner alltäglichen Arbeit und zeigt, wie man auch in einer imperativen Sprache wie Objective-C durch funktionale Denkweise und die Prinzipien der funktionalen Programmierung einfacheren, besser wartbaren Code schreiben kann.

Weiterlesen...

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...