Algorithmen und Programmierung I Funktionale Programmierung
WS 2012/2013 Prof. Dr. Margarita Esponda
ALP I: M. Esponda, 1. Vorlesung
1
Inhalt
Inhalt 1. Einführung in die Funktionale Programmierung (Haskell): 2. Grundlagen der Berechenbarkeit: 3. Das Beweisen von Programmeigenschaften: 4. Implementierung und Programmiertechnik:
ALP I: M. Esponda, 1. Vorlesung
2
Inhalt
1. Einführung in die Funktionale Programmierung • Ausdrücke und Primitive Datentypen • Funktionsdefinitionen • Listen, Tupel, Zeichenketten • Rekursion vs. Iteration • Such- und Sortieralgorithmen • Funktionen höherer Ordnung • Polymorphie • Typsystem, -herleitung und -überprüfung • Algebraische und abstrakte Datentypen
ALP I: M. Esponda, 1. Vorlesung
3
Inhalt
2. Grundlagen der Berechenbarkeit • Lambda-Kalkül • Kombinatoren • Turing-Maschine • Registermaschine • Primitive Rekursion • µ-Rekursion
ALP I: M. Esponda, 1. Vorlesung
4
Inhalt
3. Das Beweisen von Programmeigenschaften
• Termersetzung • Strukturelle Induktion • Terminierung, Implementierung und Programmiertechnik
ALP I: M. Esponda, 1. Vorlesung
5
Inhalt
4. Implementierung und Programmiertechnik
• Auswertungsstrategien für funktionale Programme • Modularer Programmentwurf
ALP I: M. Esponda, 1. Vorlesung
6
Literatur
Literatur ✴
The Craft of Functional Programming Third Edition. 2011. Addison-Wesley. Pearson. Simon Thompson.
✴
Real World Haskell O'Reilly. 2009. Bryan O'Sullivan, Don Stewart, and John Goerzen.
✴
Programming in Haskell Cambridge University Press, 2007. Graham Hutton.
ALP I: M. Esponda, 1. Vorlesung
7
Vorlesung & Übungen
Vorlesungen & Übungen Grundlegende Regeln zum Erfolg sind: 1. Regelmäßige und aktive Teilnahme in der Vorlesung Fragen stellen!
2. Regelmäßige und aktive Teilnahme an den Übungen Selbständige Lösung der Übungsblätter!
ALP I: M. Esponda, 1. Vorlesung
8
Mitschriften
Warum ist Mitschreiben wichtig?
Das Mitschreiben hat folgende Vorteile: ✴
Es erhöht die Aufmerksamkeit und fördert die Konzentration
✴
Es regt dazu an, sich aktiv zu beteiligen
✴
Es individualisiert den Lernstoff und bildet eine gute Grundlage für die Klausurvorbereitung
Fragen zuerst aufzuschreiben hat viele Vorteile.
ALP I: M. Esponda, 1. Vorlesung
9
Vorlesung & Übungen
Tutoren
Lucas Jacob
? ?
Simon Tippenhauer
?
Nicolas Lehmann
Oliver Wiese
Terese Haimberger
ALP I: M. Esponda, 1. Vorlesung
? ? 10
Kriterien des Leistungsnachweises
Kriterien für die Bestätigung der aktiven Teilnahme: 1. Eine regelmäßige Teilnahme an den Laborterminen ist unerlässlich. 2. Die Abgabe der Übungsblätter erfolgt montags um 10:10 Uhr. Nach diesem Termin abgegebene Übungsblätter werden nicht berücksichtigt. 3. Jeder Student muss an mindestens n-2 Übungsterminen anwesend sein. 4. Jeder Student muss n-2 Übungsblätter bestehen. Ein Übungsblatt gilt als bestanden, wenn man mind. 40% der zu erreichenden Punkte erreicht hat. 5. Jeder Student muss 60% der maximal erreichbaren Punktzahl aus allen Übungsblättern erreichen. 6. Jeder Student muss mindestens zwei Mal seine Lösungen vorrechnen. Wer jeweils vorrechnen muss, wird per Zufall am Anfang des jeweiligen Tutoriums entschieden.
ALP I: M. Esponda, 1. Vorlesung
11
Kriterien des Leistungsnachweises
Regelung für die Notenvergabe Die Prüfungsnote ergibt sich aus dem Wert folgenden Ausdrucks
⎛z+k z+n ⎞ max ⎜ , k, , n⎟ ⎝ 2 ⎠ 2
Dabei sind:
z - die Anzahl der erreichten Punkte in der Zwischenklausur (Stoff der ersten Semesterhälfte) k - die Anzahl der erreichten Punkte in der Endklausur (Stoff des ganzen Semesters) n - die Anzahl der erreichten Punkte in der Nachklausur (Stoff des ganzen Semesters) Zum Bestehen der Prüfung muss dieser Wert mindestens 50 Punkte betragen. Jede Klausur hat dabei eine maximale Punktzahl von 100.
ALP I: M. Esponda, 1. Vorlesung
12
Kriterien des Leistungsnachweises
Verbesserungsmöglichkeiten • Zusätzlich ist es den Teilnehmern möglich durch besonders
aktive mündliche Teilnahme an den Tutorien die Gesamtnote um maximal 0,7 zu verbessern. Diese Bewertung wird von den Tutoren individuell vorgenommen. • Durch diese Verbesserung kann ein Bestehen der Klausur
nicht erreicht werden. • Die beste zu erreichende Note ist 1,0.
ALP I: M. Esponda, 1. Vorlesung
13
Fragen
Fragen Inhaltliche Fragen sind immer willkommen – während und nach jeder Vorlesung – in der Sprechstunde (Freitags 8 -11)
ALP I: M. Esponda, 1. Vorlesung
14
Keine Laptops
NO iPADS NO MUSIKGeräte NO LAPTOPS
NO HANDYS
ALP I: M. Esponda, 1. Vorlesung
15
Homepage
Homepage http://www.inf.fu-berlin.de/lehre/WS12/ALP1/ Vorlesungsfolien Literaturliste Übungen Zusätzliches Material wichtige Nachrichten
[email protected] Sprechstunde: Fr. 8:00 - 11:00 Uhr Raum 161
ALP I: M. Esponda, 1. Vorlesung
16
Homepage
Warum Funktionales Programmieren? Warum Haskell? Wie so nicht F#? Warum nicht Dart oder Ceylon oder Rust?
ALP I: M. Esponda, 1. Vorlesung
17
Wie viele Programmiersprachen? Es gibt mehr als 2000 Programmiersprachen, die im kommerziellen Bereich bekannt sind oder gewesen sind. ✴
mehr als 200 davon haben sich im Laufe der Geschichte stärker verbreitet
✴
(einige) Firmen entwickeln eigene private Sprachen
✴
es gibt viele akademische Programmiersprachen
✴
und es kommen immer mehr Programmiersprachen hinzu
ALP I: M. Esponda, 1. Vorlesung
18
Einführung
Kurz über die Geschichte der Programmiersprachen
Sammet, J. Programming Languages. History and Fundamentals. Prentice Hall, 1969.
ALP I: M. Esponda, 1. Vorlesung
19
30er Jahre
Erste Programmiersprache
Alonzo Church 1903-1995
Stephen C. Kleene 1909-1994
λ − Kalkül Lisp 1958
Funktionale Programmiersprachen
Lambda-Kalkül ✴ universelle ✴ nur
abstrakte Programmiersprache
FP
Miranda
Haskell
die Hardware fehlte
ALP I: M. Esponda, 1. Vorlesung
20
30er Jahre Alan Turing
(1912-1954)
“On computable numbers, with an application to the Entscheidungsproblem”. 1936
Turing-Maschine Ein Modell, um die Klasse der intuitiv berechenbaren Funktionen zu bilden.
ALP I: M. Esponda, 1. Vorlesung
21
Einführung
Erste Programmgesteuerte Maschine Lochkarten-Steuerung der Jacquard-Maschine
Jacquard Looms 1801
"Programm
ALP I: M. Esponda, 1. Vorlesung
22
Einführung
Programmgesteuerter Rechner
1941
Konrad Zuse
Programm
Maschinensprache
ALP I: M. Esponda, 1. Vorlesung
23
Einführung
Programmierung Steinzeit der elektronischen Computer
eigentlich kein Programm ALP I: M. Esponda, 1. Vorlesung
24
Einführung
40er Jahre Das Wort Software existierte noch nicht.
✴
die ENIAC hatte keine Software
✴
am Anfang stand "Layette" bei der UNIVAC Corporation für die Programme
✴
Wurde später es durch das Wort "Software" ersetzt
ALP I: M. Esponda, 1. Vorlesung
25
Einführung
Konzepte imperativer Programmierung Die eigentliche Geschichte der imperative Programmiersprachen begann mit: • dem Konzept der von Neumann-Maschine, die 1945 die Notwendigkeit eines gespeicherten Programms postulierte. • und mit dem Konzept des "conditional control transfer" • If-then-Anweisung • looped-Anweisungen • Subroutines (Funktionen)
ALP I: M. Esponda, 1. Vorlesung
26
Einführung
Was ist ein Programm? Imperative Programmiersprachen
✴
Ein Programm ist eine Folge von Anweisungen, die auf einer Maschine ausgeführt werden können.
✴
Ein Programm ist die Formulierung eines Algorithmus in einer konkreten Programmiersprache.
✴
Ein OO-Programm ist ein System kooperierender Objekte.
ALP I: M. Esponda, 1. Vorlesung
27
50er Jahre Imperative Programmiersprachen Maschinensprache
Assembler-
Höhere
Programmiersprache
Programmiersprachen
0101000101101011
LOAD
#1 C
0101001011110101
LOAD
#2 B
0111000100100011
MULT
#1 #2 #3
0101010001010110
LOAD
#4 A
0010001101000001
ADD
#3 #4 #1
0000000101101011
STORE #1 C
C
=
A + B*C
....
ALP I: M. Esponda, 1. Vorlesung
28
Imperative Programmiersprachen Programme
LOAD
CPU
Anweisungen
ProgrammsteuerungsEinheit
Register
ALU
#1 5
STORE #3 7 ADD #1 #2 #3 JUMP 100
Daten
Daten
Arithemitc and Logic Unit (Rechenwerk) Speicher
ALP I: M. Esponda, 1. Vorlesung
29
Einführung
Imperatives Programmieren • Ältestes und populärstes Programmierparadigma – Fortran, Cobol, Algol, C, Basic, Pascal, Modula, Java, usw. • Widerspiegelt die dahinter stehende HardwareArchitektur – von Neumann Maschine – gespeichertes Programm + Daten
ALP I: M. Esponda, 1. Vorlesung
30
Einführung
Höhere Programmiersprachen 1955
Grace Hopper John Backus
1959
Cobol FORmula TRANslator
ALP I: M. Esponda, 1. Vorlesung
COmmon Business Oriented Language
31
Einführung
Höhere Programmiersprachen
John McCarthy
1958
Lisp LISt Processor
ALP I: M. Esponda, 1. Vorlesung
32
Einführung
Lisp 1958 schrieb McCarthy ein Paper mit einem einfachen Lisp- Interpreter, der wiederum in Lisp geschrieben war. Lambda-Kalkül ist die grundlegende Basis für seine minimalen Lisp-Funktionen. Es gibt keinen grundsätzlichen Unterschied zwischen Daten und Programmanweisungen. Dies ermöglicht unter anderem, Programme zur Laufzeit beliebig zu manipulieren Ein Lisp-Programm ist eine Liste, die einen abstrakten Syntaxbaum darstellt. ( + (+ a (* b c) d ))
ALP I: M. Esponda, 1. Vorlesung
33
Geschichtliche Einführung
Höhere Programmiersprachen
Deklarative Sprachen
Was?
Imperative Sprachen
Wie? Prozedurale
Funktionale Sprachen
Logische Sprachen
Objektorientierte Programmiersprachen
Aspektorientierte Programmiersprachen
in ALP I
ALP I: M. Esponda, 1. Vorlesung
in ALP II
34
Geschichtliche Einführung
deklarativ
vs.
- Sprachen basieren auf einem mathematischen Formalismus
imperativ - Sprachen sind von der dahinterstehenden Hardware geprägt
- Wissen über ein Problem rein deklarativ darstellbar - Intelligentes System, das Fragen an das Programm beantworten
- Befehlssequenz (Zustände) - zeitlicher Ablauf im Programm sichtbar
kann
kompakter
effizienter
robuster einfacher ALP I: M. Esponda, 1. Vorlesung
35
Einführung
Was ist ein Programm? Funktionale Programmiersprachen
✴
Ein Funktionales Programm ist eine Menge von Funktionsdefinitionen. ✴
✴
Eine Funktion bindet eine Variable an einen Wert.
Die Ausführung des Programms wird mit der Auswertung eines Ausdrucks gestartet, die mit Hilfe der Funktionsmenge erfolgt.
ALP I: M. Esponda, 1. Vorlesung
36
Geschichtliche Einführung
Deklarative Programmiersprachen Programm in Prolog Mutter( luise, maria ). Mutter( anne, maria ). Mutter( maria, andrea ). Vater( luise, peter ). Vater( maria, joachim ). Oma( X, Y ) :- Mutter( X, Z ), Mutter( Z, Y ). Oma( X, Y ) :- Vater( X, Z ), Mutter( Z, Y ). Geschwister( X, Y ) :- Mutter( X, Z ), Mutter( Y, Z ). Geschwister( X, Y ) :- Vater( X, Z ), Vater( Y, Z ). ?Oma( anne, andrea ).
ALP I: M. Esponda, 1. Vorlesung
37
In der realen Welt verwendete Sprachen
Normalisierte Ergebnisse aus der Popularität in: - Open-Source-Projekte - Powell`s Books - Job-Angebot - Popularität in der Software-Industrie - Google Code Search - usw. Quelle: http://langpop.com/ (DedaSys. Open Source Consulting) 2011
ALP I: M. Esponda, 1. Vorlesung
38
TIOBE Programming Community Index (Oktober 2012)
Beliebteste Programmiersprachen
ALP I: M. Esponda, 1. Vorlesung
39
Einführung
Deklarative Programmiersprachen 1950
1960
1970
1980
LISP
1990
2000
COMMON LISP
2010
COMMON LISP ANSI
SCHEME SASL FP
FL
HOPE Erlang
ML
MIRANDA
HASKELL Clean
Caml PROLOG ALP I: M. Esponda, 1. Vorlesung
Haskell Curry 1900-1982
OCaml PARLOG 40
Einführung
Software-Krise • John Bakus • 1977 • Lecture for the ACM Turing award session "Can Programming be liberated from the von Neumann Style? A Functional Style and its Algebra of Programs“ • FP (Funktionale Programmiersprache)
ALP I: M. Esponda, 1. Vorlesung
41
Einführung
Warum Haskell? ✴
sehr einfach
✴
Programme sind klein, übersichtlich und einfacher zu warten
✴
sehr nützlich als Spezifikationssprache
✴
Programmeigenschaften sind einfacher zu beweisen
✴
Algorithmen können auf einem höheren Niveau formuliert und analysiert werden
✴
Moderne Programmiersprache
✴
mit ständiger Verbreitung im kommerziellen Bereich
ALP I: M. Esponda, 1. Vorlesung
42
Einführung
Warum Haskell? ✴
Haskell ist geeignet an Stellen, wo Sicherheit und fehlerfreie Software vor Geschwindigkeit steht.
In Haskell implementierte Software: • Xmonad windows manager für Linux • Cryptol Language (www.cryptol.net) • Facebook (Projekte und Tools) • usw.
Programmiersprachen, die das Funktionale Paradigma unterstützen sind im Trend. Beispiel: F#, Erlang und Scale.
ALP I: M. Esponda, 1. Vorlesung
43
Funktionale Programmierung
The International Obfuscated C Code Contest /* + + + + [
>i>n[t */ #include /*2w0,1m2,]_r>i>=>(['0n1'0)1; */int/**/main(int/**/n,char**m){FILE*p,*q;int A,k,a,r,i/* #uinndcelfu_dseti/_*/;char*d="P%" "d\n%d\40%d"/**/ "\n%d\n\00wb+",b[1024],y[]="yuriyurarararayuruyuri*daijiken**akkari~n**" "/y*u*k/riin