Deklarative Programmierung Prof. Dr. Sibylle Schwarz Westsächsische Hochschule Zwickau Dr. Friedrichs-Ring 2a, RII 263 http://www.fh-zwickau.de/~sibsc/ [email protected] WS 2012/2013 1 Motivation . . . there are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult. Tony Hoare, 1980 ACM Turing Award Lecture 2 Programmierparadigmen Abstraktionsstufen: I Programmierung = Maschinencode I menschenlesbare symbolische Darstellung (Assembler) I Programmablauf- und Datenstrukturen (Algorithmen) (imperative und objektorientierte Sprachen) I deklarative Programmiersprachen (Constraint-Programmierung, logische Programmierung, funktionale Programmierung) Unterschied besteht darin, wie detailliert das Programm den Lösungsweg beschreiben muss. 3 Deklarative vs. imperative Programmierung deklarativ (beschreibend) Programm: Repräsentation eines Problems Programmelemente: Ausdrücke (Terme) und Gleichungen Programmierung: Modellierung der Aufgabe Ausführung: Lösung des beschriebenen Problems durch Umformung von Ausdrücken imperativ zustandsorientiert (von-Neumann-Typ) Programm: Repräsentation eines Algorithmus Programmelemente: Ausdrücke und Anweisungen Programmierung: Modellierung eines Verfahrens zur Lösung einer Aufgabe Ausführung des Lösungsverfahrens durch schrittweise Zustandsänderungen (Speicherbelegung) 4 Deklarative Programmierung Grundidee: Jedes Programm ist ein mathematisches Objekt mit einer bekannten wohldefinierten Semantik funktionale Programmierung (z.B. Haskell, ML, Lisp): Programm: Menge von Funktions-Definitionen (Gleichungen zwischen Termen) Ausführung: Pattern matching, Reduktion (Termersetzung) logische Programmierung (Prolog): Programm: Menge logischer Formeln (Horn-Klauseln) Ausführung: Unifikation, SLD-Resolution funktional-logische Programmierung (z.B. Mercury, Curry): Kombination funktionaler und logischer Konzepte Constraint-Programmierung: Programm: Menge von Constraints (z.B. Gleichungen, Ungleichungen, logische Formeln) Ausführung: Constraint-Löser (abhängig vom Constraint-Bereich) Beispiel: Constraints: Constraint-Löser: Menge linearer Gleichungen Gauß-Algorithmus 5 Einordnung in die Informatik Informatik Lehre von Darstellung und Verarbeitung von Information Anteil der Teilgebiete der Informatik: theoretische Informatik: Grundlagen formale Sprachen, Prädikatenlogik, Berechnungsmodell λ-Kalkül technische Informatik: praktische Informatik: Grundlagen und Anwendung Programmierung, Softwareentwicklung, Übersetzerbau, rapid Prototyping, ausführbare Spezifikation, Verifikation deklarative Konzepte in Mainstream-Sprachen angewandte Informatik: Anwendung z.B. Finanzkalkulationen, sicherheitskritische Anwendungen, KI, Audio-Programmierung 6 Organisation der Lehrveranstaltung I dienstags Vorlesung I 14tägig (Z1) Übung / Praktikum Beispiele und schriftliche Übungen Prüfungsvorleistung: Testat (regelmäßiges Lösen der praktischen Aufgaben in den Übungen) alternative Prüfungsleistung: I Programmierprojekt: Kryptographische Verfahren, z.B. ElGamal, Diffie-Hellman (neue autotool-Aufgaben) I Gruppen zu je drei Studenten I Präsentation / Vortrag I elektronische Einschreibung nicht vergessen 7 Literatur online: http://www.haskell.org/ Informationen, Download, Dokumentation, Tutorials, . . . Bücher: I Graham Hutton: Programming in Haskell, Cambridge 2007 I Klassiker (englisch): http://haskell.org/haskellwiki/Books deutsch: I I I Peter Pepper und Petra Hofstedt: Funktionale Programmierung. Sprachdesign und Programmiertechnik Springer 2006 Manuel Chakravarty und Gabriele Keller: Einführung in die Programmierung mit Haskell Pearson 2004 8 Werkzeug und Stil Die Grenzen meiner Sprache bedeuten die Grenzen meiner Welt. Ludwig Wittgenstein speziell in der Informatik: We are all shaped by the tools we use, in particular: the formalisms we use shape our thinking habits, for better or for worse, and that means that we have to be very careful in the choice of what we learn and teach, for unlearning is not really possible. (Many years ago, if I could use a new assistant, one prerequisite would be No prior exposure to FORTRAN", and at high schools in Siberia, the teaching of BASIC was not allowed.) Edsger W. Dijkstra aus E. W. Dijkstra Archive http://www.cs.utexas.edu/~EWD/ 9 Funktionale Programmierung Idee: Programm besteht aus I einer Menge von Funktionsdefinitionen (Termgleichungen) I einem Ausdruck Vorteile: I deklarativ: Jedes funktionale Programm beschreibt ein Problem, nicht dessen Lösung I Funktionen sind Daten, können also selbst Argumente und Ergebnisse von Funktionen sein (Funktionen höherer Ordnung) I Rein funktionale Programme sind zustandsund damit nebenwirkungsfrei, daher I I I I Korrektheit einfach nachprüfbar (Verifikation) einfache modulare Konstruktion einfach parallelisierbar Programm repräsentiert seine Semantik (ausführbare Spezifikation, geeignet für rapid 10 Geschichte ab ca. 1930 ab ca. 1950 ab ca. 1960 ab ca. 1970 ab 1987 Alonzo Church John McCarthy Peter Landin John Backus Robin Milner David Turner λ-Kalkül LISP ISWIM FP ML Miranda Haskell 11 Warum Haskell? I deklarativ, Nähe zum (mathematischen) Modell I keine Nebenwirkungen (klare Semantik) I Funktionen sind Daten (Funktionen höherer Ordnung) I starkes Typsystem I Typklassen I lazy evaluation (ermöglicht Rechnen mit unendlichen Datenstrukturen) I kompakte Darstellung (kurze Programme) I Modulsystem 12 Entwicklung von Haskell-Programmen Haskell-Interpreter: ghci, Hugs Haskell-Compiler: ghc Entwicklungsumgebungen: I http://leksah.org/ I http://eclipsefp.sourceforge.net/ I http://www.haskell.org/visualhaskell/ alles kostenlos und open source Real Programmers (http://xkcd.com/378/) 13