© Excellent backgrounds/Shutterstock.com
Frege - konsequent funktionale Programmierung

Ein Haskell für die JVM


Frege ist ein Haskell für die JVM. Man programmiert nicht mit Objekten, sondern mit Funktionen. Reine Funktionen haben keine beobachtbaren Effekte. Sie nehmen unveränderliche Werte entgegen und geben einen unveränderlichen Wert zurück. Das macht den Code in vielen Dimensionen robust – vor allem für den nebenläufigen und parallelen Einsatz. Das Typsystem kann die Reinheit von Funktionen zur Compile-Zeit zusichern. Das macht Frege einzigartig auf der JVM.

Neue Sprachen auf der JVM brauchen eine Existenzberechtigung, ein Alleinstellungsmerkmal, und für Frege ist das die vollständige Überwindung der imperativen Programmierung durch Funktionen. Traditionell programmieren wir mit veränderlichem Zustand. Das haben wir so gelernt, und wir haben uns so sehr daran gewöhnt, dass uns kaum noch auffällt, wie sehr wir uns damit selbst das Leben schwer machen.

Das Grundproblem der traditionellen Programmierung wird schon bei einer der ersten Aufgaben deutlich, die Programmieranfänger bewältigen müssen. Was passiert hier?

a = 1 b = 2 c = b b = a a = c

Die meisten werden erkannt haben, was dieses Stückchen Code bewirkt: Es vertauscht a und b. Stimmt das auch oder habe ich mich vertan? Ehrlich gesagt habe ich mir selbst nicht getraut und habe es gleich noch einmal verifiziert. Ist das nicht furchtbar – bei so einer trivialen Aufgabe? Das Problem ist nicht, dass wir uns ein gedankliches Modell von drei Speicherzellen machen müssen. Das ist ok. Schwierig wird es, weil sich das Modell mit jeder Zuweisung ändert:

a

b

c

1

-

-

1

2

-

1

2

2

1

1

2

2

1

2

Zuweisungen führen das Konzept von Zeit ein: Die Welt vor und die Welt nach der Zuweisung. Dadurch wird die Reihenfolge der Zuweisungen relevant. Fast jede Umordnung der Zuweisungen führt zu einem falschen Ergebnis.

Man muss sich vier verschiedene Belegungen merken. Vier Belegungen mal drei Zellen machen zwölf Zustände. Das übersteigt schon mein Kurzzeitgedächtnis. Zusätzlich muss man diesen Code isolieren. Während der Umstellung darf niemand anders die Speicherzellen verändern oder auch nur anschauen. Als Programmierer lernen wir mit diesen Schwierigkeiten umzugehen und Mittel des Software Engineering einzusetzen, um den Schaden in Grenzen zu halten (Code in Objekten/Methoden verbergen, c nach temp umbenennen usw.). Die Zähmung dieses Biests macht einen Großteil unserer täglichen Arbeit aus, und oft genug überschätzen wir unsere Cleverness und das Biest gewinnt. Dann brauchen wir den Debugger, um Wertänderungen über die Zeit nachvollziehen zu können. Wer an dieser Art des gedanklichen Jonglierens keine Freude hat, bleibt wahrscheinlich nicht lange Programmierer.

Die funktionale Brille

Man kann aber auch ganz anders an die Aufgabe herangehen: mit Funktionen:

swap (a, b) = (b, a)

Hier ist swap eine Funktion, die eine neue Sicht auf a und b bereitstellt. Wer a und b vertauscht sehen möchte, schaut einfach durch die swap-Brille. Es gibt nichts mehr, was man falsch machen kann. Dabei werden a und b nie verändert. Jeder darf sie jederzeit anschauen, selbst parallel und aus nebenläufigen Threads, ganz ohne Speicherschutz. Die swap-Funktion selbst darf natürlich nicht wieder versteckten Zustand oder zeitliche Abhängigkeiten als Folge von Seiteneffekten einführen. Man darf nicht schummeln, sonst kann man die Brille nicht beliebig auf- und absetzen. Die swap-Funktion muss pure (rein) sein.

Nun könnte ich mich ja „ganz aus Versehen“ auch selbst beschummeln. Das ist am einfachsten zu vermeiden, wenn man gar nicht schummeln kann. In unserem Fall: Wenn es Zuweisungen, mit denen ich Zustand verändern könnte, schon rein syntaktisch gar nicht gibt. Und so ist es bei Haskell und damit auch in Frege.

Programmieren ohne Zuweisungen

In Frege gibt es keine Zuweisungen oder sonstige Statements. Alles basiert konsequent auf Funktionen, deren Def...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang