Gliederung n Teil I: Einleitung und Grundbegriffe l 1. Organisatorisches l 2. Grundlagen von Programmiersprachen n Teil II: Imperative und objektorientierte Programmierung l 1. Grundelemente der Programmierung l 2. Objekte, Klassen und Methoden l 3. Rekursion und dynamische Datenstrukturen l 4. Erweiterung von Klassen und fortgeschrittene Konzepte n Teil III: Funktionale Programmierung: Haskell n Teil IV: Logische Programmierung: Prolog III.1 Prinzipien der funktionalen Programmierung- 1 -
Populäre Programmiersprachen Quelle: www.tiobe.com, Oct. 2015 III.1 Prinzipien der funktionalen Programmierung- 2 -
Populäre Programmiersprachen 1. Java... 32. Prolog... 39. Haskell Quelle: www.tiobe.com, Jan. 2016 III.1 Prinzipien der funktionalen Programmierung- 3 -
Kenntnis verschiedener Sprachen n Eigene Ideen bei der Software-Entwicklung können besser ausgedrückt werden n Nötig, um in konkreten Projekten geeignete Sprache auszuwählen n Erleichtert das Erlernen weiterer Programmiersprachen n Nötig für den Entwurf neuer Programmiersprachen III.1 Prinzipien der funktionalen Programmierung- 4 -
Übersicht Imperative Sprachen Deklarative Sprachen l Folge von nacheinander ausgeführten Anweisungen l l Spezifikation dessen, was berechnet werden soll Compiler legt fest, wie Berechnung verläuft n Prozedurale Sprachen l Variablen, Zuweisungen, Kontrollstrukturen n Funktionale Sprachen l keine Seiteneffekte l Rekursion n Objektorientierte Sprachen l l Objekte und Klassen Abstrakte Datentypen und Vererbung n Logische Sprachen l Regeln zur Definition von Relationen III.1 Prinzipien der funktionalen Programmierung- 5 -
Wichtige Programmiersprachen 1950 1960 Fortran Cobol Algol 60 Lisp 1970 1980 1990 PL/1 Pascal Ada Algol 68 C Modula-3 Simula Smalltalk C++ Ada-95 Java Eiffel Python Scheme ML Miranda Haskell Prolog 2000 Scala prozedural objektorientiert funktional logisch I.2. Grundlagen von Programmiersprachen - 6 -
n 1. Prinzipien der funktionalen Programmierung n 2. Deklarationen n 3. Ausdrücke n 4. Muster (Patterns) n 5. Typen und Datenstrukturen n 6. Funktionale Programmiertechniken I.2. Grundlagen von Programmiersprachen - 7 -
Imperative Programmierung (Java) Eingabe: Eine Liste x Ausgabe: Länge der Liste x Algorithmus: 1. Setze n = 0. 2. Falls x nicht die leere Liste ist, dann: 2a. Lösche das erste Element von x. 2b. Erhöhe n um 1. 2c. Gehe zu Schritt 2. 3. Liefere n zurück. class Element { Vergleichbar wert; Element next;... } public class Liste { Element kopf;... static int len (Liste x) { int n = 0; while (x.kopf!= null) { x.kopf = x.kopf.next; n = n + 1; } return n; } III.1 Prinzipien der funktionalen Programmierung- 8 -
Kennzeichen imperativer Programmierung n Programm besteht aus einzelnen Anweisungen, die nacheinander abgearbeitet werden. n Verschiedene Kontrollstrukturen, um Programmablauf zu steuern. n Abarbeitung einer Anweisung ändert Werte der Variablen. n Seiteneffekte n Programmierer muss Speicherorganisation bedenken III.1 Prinzipien der funktionalen Programmierung- 9 -
Funktionale Programmierung (Haskell) A. Falls die Liste x leer ist, so ist len(x) = 0. B. Falls die Liste x nicht leer ist und "rest" die Liste x ohne ihr erstes Element ist, so ist len(x) = 1 + len(rest). Programm in Haskell: len [] = 0 len (kopf : rest) = 1 + len rest III.1 Prinzipien der funktionalen Programmierung- 10 -
Ausführung funktionaler Programme len [] = 0 len (kopf : rest) = 1 + len rest len [15, 70, 36] = 1 + len [70, 36] = 1 + 1 + len [36] = 1 + 1 + 1 + len [] = 1 + 1 + 1 + 0 = 3 III.1 Prinzipien der funktionalen Programmierung- 11 -
Kennzeichen funktionaler Programme n Rekursion statt Schleifen n Keine Seiteneffekte (referentielle Transparenz) n Funktionen als gleichberechtigte Datenobjekte (Funktionen höherer Ordnung) n Verwendung von einer Funktions-Implementierung für verschiedene Typen (Polymorphismus) n Programme sind kürzer, klarer, besser zu warten, zuverlässiger, schneller zu erstellen III.1 Prinzipien der funktionalen Programmierung- 12 -
Seiteneffekte n Seiteneffekt: Veränderung des (Speicher-)Zustands n Fehlende Seiteffekte in Funktionalen Programmiersprachen: l l Verzicht auf Variablen und Wertzuweisungen Ausschließlich Verwendung von Ausdrücken n Referenzielle Transparenz: l Wert eines Ausdrucks hängt nicht vom Zeitpunkt oder der Reihenfolge der Auswertung ab. III.1 Prinzipien der funktionalen Programmierung- 13 -
Funktionale Programmierung (Haskell) n Interaktiver Modus des Glasgow Haskell Compilers (GHCi) l Eingabe: Auszuwertender Ausdruck l Ausgabe: Ergebnis des ausgewerteten Ausdrucks n Bsp: l Eingabe: len [15, 36, 70] l Ausgabe: 3 n Interpreter l führen jede Zeile des Programms nacheinander aus. l Vorteil: Keine vorherige Übersetzung nötig, gut zur Programmentwicklung geeignet. l Nachteil: Ineffizienter als Compiler. III.1 Prinzipien der funktionalen Programmierung- 14 -
n 1. Prinzipien der funktionalen Programmierung n 2. Deklarationen n 3. Ausdrücke n 4. Muster (Patterns) n 5. Typen und Datenstrukturen n 6. Funktionale Programmiertechniken III.1 Prinzipien der funktionalen Programmierung- 15 -
Deklarationen len :: [Int] -> Int len [] = 0 len (kopf : rest) = 1 + len rest square :: Int -> Int square x = x * x Funktionsdeklarationen Typdeklarationen Programm in Haskell: Folge von linksbündig untereinander stehenden Deklarationen III.1 Prinzipien der funktionalen Programmierung- 16 -
Deklarationen len :: [Int] -> Int len [] = 0 len (kopf : rest) = 1 + len rest square :: Int -> Int square x = x * x var :: type, decl var pat = exp III.1 Prinzipien der funktionalen Programmierung- 17 -
Auswertungsstrategie square :: Int -> Int square x = x * x square (12-1) (12-1) * (12-1) square 11 11 * (12-1) (12-1) * 11 11 * 11 121 strikte Auswertung (call-by-value), innen links nicht-strikte Auswertg. (call-by-name), außen links III.1 Prinzipien der funktionalen Programmierung- 18 -
Bedingte definierende Gleichungen maxi :: (Int, Int) -> Int maxi (x, y) x >= y = x otherwise = y var :: type, decl var pat = exp exp = exp III.1 Prinzipien der funktionalen Programmierung- 19 -
Currying plus :: (Int, Int) -> Int plus (x, y) = x + y plus :: Int -> Int -> Int plus x y = x + y Currying var :: type, decl var pat = exp exp = exp III.1 Prinzipien der funktionalen Programmierung- 20 -
Pattern Matching und :: Bool -> Bool -> Bool und True y= y und False y = False x var, :: type decl var pat = exp exp = exp III.1 Prinzipien der funktionalen Programmierung- 21 -
Pattern Matching und :: Bool -> Bool -> Bool und True y= y und y = False x Bool = "True" "False" len :: [Int] -> Int len [] = 0 len (x : xs) = 1 + len xs Liste = "[]" Element ":" Liste III.1 Prinzipien der funktionalen Programmierung- 22 -
Lokale Deklarationen roots :: Float -> Float -> Float -> (Float, Float) roots a b c = ((-b - d)/e, (-b + d)/e) where {d = sqrt (b*b - 4*a*c); e = 2*a} where d = sqrt b*b - 4*a*c e = 2*a locdecls { var decl :: type }, ; decl var pat = exp exp = exp where locdecls III.1 Prinzipien der funktionalen Programmierung- 23 -