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
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; end while (m <= n-1) and (not found) do if (n mod m) = 0 then found := true; else m := m + 1; isprime := not found;
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
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
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)
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 == []) -- (1) where factors n = [ x x <- [2..n-1], n `mod` x == 0 ] -- (2)
Funktionale Programmiersprachen sind vollständig auf dem mathematischen Funktionsbegriff aufgebaut. Programme einer funktionalen Programmiersprache bestehen ausschließlich aus Funktionsdefinitionen, Funktionsaufrufen (Applikation) und Funktionskomposition (g f, 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
Beispiel für ein funktionales Programm zur Berechnung der Fakultätsfunktion fak :: ganzzahl -> ganzzahl fak 0 = 1 fak n = n * fak (n-1)