Es gibt einen Webcast mit den Inhalten dieses Kapitels aus dem Sommersemester 2021 für alle, die gern nicht nur Folien anschauen, sondern dazu auch etwas hören möchten.
Diese Fragen dienen der persönlichen Beschäftigung mit der Thematik, werden aber nicht separat in der Vorlesung besprochen.
Die Unterschiede von strukturierter und funktionaler Programmierung lassen sich gut am Beispiel der Fibonacci-Folge zeigen. Die Berechnung der ersten zehn Glieder dieser Folge soll einmal strukturiert und einmal funktional erfolgen, in beiden Fällen wird Python-Code gezeigt werden. Gegeben sei die Fibonacci-Folge:
In ihrer modernen Definition beginnt sie meist mit der Zahl 0, hier als f0 bezeichnet. Eine Umsetzung mit den Mitteln der strukturierten Programmierung könnte in Python wie folgt aussehen. Die Kommentare weisen auf den Seiteneffekt und die Zuweisung als inhärente Eigenschaften dieses Programmierparadigmas hin.
def fibonacci(n, first=0, second=1): for _ in range(n): print(first) # Seiteneffekt first, second = second, first + second # Zuweisung fibonacci(10)
Die gleiche Funktionalität, diesmal umgesetzt mit den Mitteln der funktionalen Programmierung, ist auf den ersten Blick etwas gewöhnungsbedürftig. Der Lambda-Ausdruck und die Rekursion sind Kernbestandteile des funktionalen Programmierparadigmas. Die hier gezeigte Funktion ist frei von Seiteneffekten und Zuweisungen.
fibonacci = (lambda n, first=0, second=1: # Lambda-Ausdruck [] if n == 0 else [first] + fibonacci(n-1, second, first+second)) # Rekursion print(fibonacci(10))
Die Beispiele zeigen, dass moderne Programmiersprachen wie Python (ähnliches gilt für JavaScript, Java, C++ und weitere) durchaus unterschiedliche Programmierparadigmen unterstützen. Welches Paradigma verwendet wird, ist u.a. eine Frage des persönlichen Geschmacks und der Fähigkeiten sowie der Anforderungen.
Hinweis: Die Fibonacci-Folge steht in einem engen Zusammenhang mit dem Goldenen Schnitt. Das Verhältnis (Quotient) zweier aufeinanderfolgender Zahlen der Fibonacci-Folge strebt gegen den Goldenen Schnitt.
Eine kommentierte und handverlesene Liste mit weiterführender Literatur zum Thema. Die Auswahl ist zwangsläufig subjektiv.
Der Begriff des Paradigmas wurde von Robert W. Floyd 1979 in seiner „ACM Turing Award Lecture“ [Floyd, 1979Floyd, Robert W. (1979): The paradigms of programming, Commun. ACM 22:455-460] in die Computerwissenschaften eingeführt und nimmt Bezug auf Thomas Kuhn und seine Darstellung der Wissenschaftsgeschichte und -theorie [Kuhn, 1976Kuhn, Thomas S. (1976): Die Struktur wissenschaftlicher Revolutionen, Suhrkamp, Frankfurt am Main].
Als „Geburtsdaten“ für die drei hier vorgestellten Paradigmen lassen sich [McCarthy, 1960McCarthy, John (1960): Recursive functions on symbolic expressions and their computation by machine, part I, Commun. ACM 3:184-195] für die funktionale, [Dahl, 1966Dahl, Ole-Johan; Nygaard, Kristen (1966): SIMULA—an ALGOL-based simulation language, Commun. ACM 9:671-678] für die objektorientierte und [Dijkstra, 1968Dijkstra, Edsger W. (1968): Go to statement considered harmful, Commun. ACM 11:147-148] für die strukturierte Programmierung ins Feld führen.
Ein interessanter Artikel von Robert C. Martin („Uncle Bob“), der die drei vorgestellten Paradigmen zusammenfasst, findet sich im Blog von 8th Light Inc: Three Paradigms. Etwas ausführlicher findet sich diese Darstellung in seinem recht neuen Buch „Clean Architecture“ [Martin, 2018Martin, Robert C. (2018): Clean Architecture. A Craftman's Guide to Software Structure and Design, Prentice Hall, Boston].
Eine recht gute Einführung in die funktionale Programmierung ist der Artikel von John Hughes [Hughes, 1989Hughes, John (1989): Why functional programming matters, Comput. J. 32:98-107], kurz darauf als Buchkapitel [Hughes, 1990Hughes, John (1990): Why Functional Programming Matters, in Turner, David A. (Hg.): Research Topics in Functional Programming, Kap. 2, S. 17-42, Addison-Wesley, Boston, MA] veröffentlicht (und deutlich lesbarer formatiert).
Sehr interessant sind die beiden Essay „The Other Road Ahead“ und „Beating the Averages“ von Paul Graham, als Kapitel 5 und 12 abgedruckt in seinem Buch „Hackers & Painters“ [Graham, 2010Graham, Paul (2010): Hackers & Painters, O'Reilly, Sebastopol, CA]. Er beschreibt darin, wie er mit einem Freund gemeinsam ein Startup für Webshops gründete, das später von Yahoo aufgekauft wurde. Der Schlüssel zum Erfolg war die Verwendung von Lisp, einer funktionalen Programmiersprache, die einen viel kürzeren Entwicklungszyklus als herkömmliche strukturierte bzw. objektorientierte Sprachen ermöglichte.