Deklarative Programmierung - Westsächsische Hochschule Zwickau

Werbung
Deklarative Programmierung
Sibylle Schwarz
Westsächsische Hochschule Zwickau
Dr. Friedrichs-Ring 2a, RII 263
http://wwwstud.fh-zwickau.de/~sibsc/
[email protected]
WS 2009/2010
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
Einordnung der LV in die Informatik
Informatik Lehre von Darstellung und Verarbeitung von
Information
Anteil der Teilgebiete:
I
theoretische Grundlagen: Prädikatenlogik, λ-Kalkül
I
technische Informatik
I
praktische Informatik: Programmierung (z.B. deklarativ)
I
angewandte Informatik
Programmierung
deklarativ (beschreibend)
Programm: Repräsentation eines Problems
Programmelemente: Ausdrücke
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)
Programmierstil
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/
Modellierung von Aufgaben
Modell:
I
Menge von strukturierten Objekten mit
I
Eigenschaften (einstellige Relationen) und
I
Beziehungen (mehrstellige Relationen, Funktionen)
Modellierung:
Beschreibung der Struktur, Eigenschaften und Beziehungen
der Objekte in einer Sprache.
verschiedene Möglichkeiten, z.B:
I
Diagramm (graphische Darstellung)
I
Ausdrücke: Terme, logische Formeln
(Zeichenkette, Baumstruktur)
I
Programmiersprache (Zeichenkette, Baumstruktur)
Deklarative Programmierung
Grundidee: Jedes Programm ist ein mathematisches Objekt mit einer
bekannten wohldefinierten Semantik
funktionale Programmierung (Haskell)
Programm = Menge von Funktions-Definitionen
(Gleichungen zwischen Termen)
Ausdruck
Ausführung Termersetzung (Auswertung des
Ausdruckes)
logische Programmierung (Prolog)
Programm = Menge logischer Formeln
(Horn-Klauseln)
Ausführung SLD-Resolution
funktional-logische Programmierung (Mercury)
Kombination funktionaler und logischer Konzepte
Constraint-Programmierung
Programm = Menge logischer Formeln
(Gleichungen)
Ausführung Constraint-Löser
Organistation der Lehrveranstaltung PTI891
I
2 Vorlesungen aller 2 Wochen
I
1 Praktikum aller 2 Wochen
(Prüfungsvorleistung)
I
alternative Prüfungsleistung
Präsentation / Vortrag:
andere deklarative Sprachen
(Prinzipien, Praktikum-Beispiele, Anwendungen, Vergleich
mit in LV vorgestellten Sprachen)
I
I
I
I
I
funktional (OCAML)
funktional-logisch (Curry)
deklarative Konzepte in imperativen Sprachen
(z.B. C# , OpenQuark)
SAT-Solver
Constraint-Solver
Funktionale Programmierung
Idee: Programm besteht aus
I einer Menge von Funktionsdefinitionen
(Termgleichungen)
I einem Ausdruck
Vorteile:
I
I
I
deklarativ:
Jedes funktionale Programm beschreibt ein
Problem, nicht dessen Lösung
Funktionen sind Daten
(ermöglicht Funktionen höherer Ordnung)
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
Prototyping)
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
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
Beispiele
Ausdruck 7 hat den Wert 7
Ausdruck 3 * 7 + 2 hat den Wert ?
Ausdruck = Term (Baumstruktur)
rekursive Berechnung des Wertes durch Termersetzung
Beispiel
verdoppeln :: Int -> Int
verdoppeln x = x + x
(Typdeklaration)
(Funktionsdefinition)
Ausdruck verdoppeln 3 hat
I
den Typ Int
I
den Wert 6
Ausdruck verdoppeln (3 * (verdoppeln 3)) - 5 hat
I den Typ Int
I
den Wert ?
Ausdruck verdoppeln hat
I
den Typ Int -> Int
I
den Wert x 7→ x + x (mathematische Notation)
Entwicklung von Haskell-Programmen
Entwicklungsumgebungen:
I
http://leksah.org/
I
http://eclipsefp.sourceforge.net/
I
http://www.haskell.org/visualhaskell/
Real Programmers (http://xkcd.com/378/)
I
Quelltext im Editor emacs Foo.hs
I
Interpreter ghci Foo.hs
I
Interpreter: Ausdrücke auswerten
I
Editor: speichern, Interpreter: neu laden (:r)
Herunterladen