Technische Universität München Imperative vs. Funktionale Programmierung • Beispiel: Entwerfe eine Funktion, die testet, ob eine Zahl n eine Primzahl ist oder nicht. • Beobachtung: (1) Wenn n Primzahl ist, ist die Menge der Teiler von n leer. (2) Die Menge der Teiler von n sind alle Zahlen x zwischen 2 … n-1, die n ohne Rest teilen Fakultät für Informatik, Einführung in die Informatik, WS 2010/11 Technische Universität München Imperative vs. Funktionale Programmierung Imperatives Programm zur Berechnung, ob eine gegebene Zahl eine Primzahl ist function isPrime (n : ganzzahl) : wahrheitswert; variables m : ganzzahl; found : wahrheitswert; begin m := 2; found := false; while (m <= n-1) and (not found) do if (n mod m) = 0 then found := true; else m := m + 1; isPrime := not found; end Fakultät für Informatik, Einführung in die Informatik, WS 2010/11 Technische Universität München Imperative vs. Funktionale Programmierung • Das imperative Programm (lat. imperare = befehlen) besteht aus einer Folge von Befehlen (Statements) an die Maschine; es beschreibt, wie der Algorithmus abläuft • Das imperative Programm kontrolliert die Abarbeitung durch explizite Schleifenanweisungen (while, for), bedingte Anweisungen (if then else), Sequenzierung (`;') von Anweisungen. – Die Anweisungsfolge ist explizit festgelegt. – Die Berechnung erfolgt als Seiteneffekt auf den Zustandsvariablen – Zustandsvariablen dienen gleichzeitig zur Kontrolle der Maschine und zur Protokollierung des Ergebnisses Fakultät für Informatik, Einführung in die Informatik, WS 2010/11 Technische Universität München Imperative vs. Funktionale Programmierung • Der imperative Programmierer hat seine Anweisungen explizit aufzureihen und muss den Ablauf des Programms direkt kodieren (über Kontrollstrukturen) • Der Zustand eines Algorithmus muss durch Variablenzuweisung bzw. -auslesen explizit kontrolliert werden • Direkte Abstraktion des von Neumann´schen Maschinenmodells Fakultät für Informatik, Einführung in die Informatik, WS 2010/11 Technische Universität München Imperative vs. Funktionale Programmierung • Imperative Programmiersprachen bieten noch weitergehenden direkten Zugriff auf die Maschine: – Felder und Indexzugriffe (A[i]) (abstrahiert den linearen Speicher der Maschine sowie indizierende Adressierungsmodi) – Pointer und Dereferenzierung (indirekte Adressierungsmodi) – Explizite (De-)Allokation von Speicher (der Speicher wird eigenverantwortlich als Ressource verwaltet) – Sprunganweisungen (goto) (direkte Manipulation des PC) Fakultät für Informatik, Einführung in die Informatik, WS 2010/11 Technische Universität München Imperative vs. Funktionale Programmierung • Funktionale Programmiersprachen gehören zu den deklarativen (lat. declarare = erklären) Programmiersprachen • Sie beschreiben was getan werden muss, durch eine Folge von Ausdrücken (Expressions) -- Ist n eine Primzahl? isPrime :: Integer -> Bool isPrime n = (factors n == []) where factors n = [ x | x <- [2..n-1], n `mod` x == 0 ] Fakultät für Informatik, Einführung in die Informatik, WS 2010/11 -- (1) -- (2) Technische Universität München Imperative vs. Funktionale Programmierung • Funktionale Programmiersprachen sind vollständig auf dem mathematischen Funktionsbegriff aufgebaut. • Programme einer funktionalen Programmiersprache bestehen ausschließlich aus Funktionsdefinitionen, Funktionsaufrufen (Applikation) und Funktionskomposition (𝑔°𝑓, g wird auf das Ergebnis von f angewendet. • Programme berechnen ihre Ergebnisse allein durch die Ersetzung von Funktionsaufrufen durch Funktionsergebnisse. – Berechnungen geschehen allein durch Auswertung von Funktionen, nicht durch Manipulation des Maschinenzustandes bzw. –speichers – FPLs sind zustandslos und bieten daher keine änderbaren Variablen Fakultät für Informatik, Einführung in die Informatik, WS 2010/11 Technische Universität München Imperative vs. Funktionale Programmierung • Beispiel für ein funktionales Programm zur Berechnung der Fakultätsfunktion fak :: ganzzahl -> ganzzahl fak 0 = 1 fak n = n * fak (n-1) Fakultät für Informatik, Einführung in die Informatik, WS 2010/11