Universität Bielefeld Programmieren in Haskell Giegerich Programmieren in Haskell WS 2012/2013 Robert Giegerich Universität Bielefeld AG Praktische Informatik October 9, 2012 Administratives Programmierspr Haskell Kontakt & Kontext Prof. Dr. Robert Giegerich Email: [email protected] M3-125 Veranstaltungen im Modul A&D: Programmieren in Haskell Algorithmen und Datenstrukturen (Dr. Thiess Pfeiffer) Übungen zu A&D und Programmieren in Haskell (Stefan Janssen + 12 Tutoren) UNIX Einführung (Dr. Carsten Gnörlich + Tutoren) http://www.techfak.uni-bielefeld.de/ags/pi/lehre/ AuDIWS12/ Zentrale Seite für Übungszettel, Folien, usw. Universität Bielefeld Programmieren in Haskell Giegerich Administratives Programmierspr Haskell Übungen Universität Bielefeld Programmieren in Haskell Giegerich Administratives „Übungen zu Algorithmen und Datenstrukturen“ sind gemeinsame Übungen zu den beiden Veranstaltungen: Algorithmen & Datenstrukturen Programmieren in Haskell Scheinkriterien: ≥ 50 % der Punkte aktive Teilnahme an den Übungen Bearbeitung in 2er- bzw. 3er-Gruppen Programmierspr Haskell Prüfung Universität Bielefeld Programmieren in Haskell Giegerich Administratives Programmierspr Haskell Voraussetzung: Erfolgreiche Teilnahme an der Übungen Mündliche Prüfung (ca. 20 Minuten) mögliche Termine werden noch bekanntgegeben Skript Universität Bielefeld Programmieren in Haskell Giegerich Administratives Programmierspr Haskell Es gibt ein Vorlesungsskript zu den beiden Veranstaltungen: http://www.techfak.uni-bielefeld.de/ags/pi/lehre/ AuDIWS11/literatur_aud.html Uhrzeit Universität Bielefeld Programmieren in Haskell Giegerich Administratives Programmierspr Haskell Mittwochs, 16 c.t. - 18 Uhr ... in der Mitte ca 10 Min Pause ... Ideengeschichte der Programmiersprachen Universität Bielefeld Programmieren in Haskell Giegerich Welche Programmiersprachenparadigmen? Administratives Historische Entwicklung Programmierspr Wie ist Haskell einzuordnen? Haskell Visualisierungen O’Reilly Poster: http://oreilly.com/news/languageposter_0504.html Computer Languages History: http://www.levenez.com/lang/ Maschinennahe Sprachen Universität Bielefeld Programmieren in Haskell Welche Maschinen? Konventionelle Rechnenmaschinen Giegerich festverdrahtet keine Software Administratives Programmierspr 1941: Zuse Z3 elektromechanisch (Relais!) 2 Register 200 Byte RAM programmierbar (Lochstreifen) aber: kein Sprungbefehl 1945 Von-Neumann-Architektur Sprungbefehl! Universelle Rechenmaschine Keine Trennung von Programm und Daten Haskell Quelle: http://commons. wikimedia.org/wiki/File: Z3_Deutsches_Museum.JPG, CC-by-SA 3.0 Übliche Rechner-Architektur Universität Bielefeld Programmieren in Haskell Giegerich Administratives Programmierspr Haskell Vgl.auch: Unbeschränkte Registermaschine, A&D-Vorlesung Maschinennahe Sprachen Universität Bielefeld Programmieren in Haskell Giegerich Von Binärcode zu Assembler-Sprachen: Administratives Symbolische OP-codes Programmierspr Symbolische Adressen Haskell stack Subroutinen relocatable code indirekte adressierung → Programme überhaupt nicht portabel ⇒ Höhere Programmiersprachen (imperativ) Imperative Programmiersprachen Bis heute der Mainstream Weiterführung der Assembler-Ideen nah am Maschinenmodell 1957 Fortran FORmula TRANslation zunächst definiert durch die Fähigkeiten des Compilers ALGOL 60 systematisch konstruierte Sprache maschinenunabhängig präzise Syntaxdefinition (CFG) Strenge Typisierung Arrays Verschachtelte Sichtbarkeitsbereiche, Blockstruktur Prozeduren Rekursion, Schleifen, . . . Input/Output? Universität Bielefeld Programmieren in Haskell Giegerich Administratives Programmierspr Haskell Funktionale Programmiersprachen Universität Bielefeld Programmieren in Haskell Giegerich FP als neues Programmierparadigma 1958 LISP LISt Processing alles ist eine Liste, auch die Programme Funktionen als universelle Kontrollstruktur, z.B. (COND (EQUAL x y) (PLUS x 1)(Minus y 1)) if (x = y) then x+1 else y+1 Einfache Semantik durch Interpreter in LISP (fast) untypisiert moderne Variante: SCHEME Administratives Programmierspr Haskell Logische Programmiersprachen Universität Bielefeld Programmieren in Haskell Giegerich Administratives 1972 Prolog Programmierspr Menge von Fakten Haskell Menge von Regeln Inferenz-Algorithmus Programmablauf: Auswertung einer Abfrage wie funktionale Programmiersprachen, Teil der Gruppe der deklarativen Programmiersprachen Ada-Projekt Universität Bielefeld Programmieren in Haskell Giegerich DOD-Projekt Administratives Entwicklung 1979-1983 Programmierspr Haskell Ziel: Aufräumen mit dem Sprachendurcheinander Universal-Sprache → Steigerung der Wiederverwendbarkeit von Software Komplexe Sprache Verbot von Sprach-Subsets ⇒ keine Verbreitung Gegenläufiger Trend Universität Bielefeld Programmieren in Haskell Giegerich Kleine, einfache Sprachen C (1970) Pascal (1972) C++ (1979) Kompatibilität mit C OOP templates Überladung ... Administratives Programmierspr Haskell Objekt-orientierte Programmierung (OOP) Universität Bielefeld Programmieren in Haskell Giegerich Administratives Simula 67: ALGOL + Klassen Klasse = Funktion/Prozedur mit Gedächtnis 1972 Smalltalk Klassen und Methoden Vererbung Byte-Code Interpreter Klassen-Bibliothek 1979 C++ Programmierspr Haskell Anwendungsspezifische Sprachen Universität Bielefeld Programmieren in Haskell sed awk sh make bibtex LaTeX Postscript (Druckseitenbeschreibung) SGML, HTML (Dokumentenbeschreibung) ... aus Bielefeld: Locomotif, Bellman’s GAP (Bioinformatik) Giegerich Administratives Programmierspr Haskell Heute Universität Bielefeld Programmieren in Haskell Es gibt immer noch die alten Sprachen: Fortran (ISO 2010) — nun auch OO LISP C (ISO C99) C++ (ISO 2011) Ada (ISO 2005) Imperativer/OOP Mainstream: Java, C#, C, C++ Funktionaler Mainstream: Haskell, ML, LISP Scriptsprachen: Python, Ruby . . . Giegerich Administratives Programmierspr Haskell Haskell Universität Bielefeld seit 1990 benannt nach dem Logiker Haskell Curry Beeinflusst von ML Miranda Programmieren in Haskell Giegerich Administratives Programmierspr Haskell Quicksort Snippets funktional (pure) lazy evaluation stark typisiert notationelles Juwel Typinferenz Implementierungen Hugs GHC Quicksort Universität Bielefeld Programmieren in Haskell Giegerich 1 2 3 4 5 qsort : : ( Ord a ) => [ a ] −> [ a ] qsort [ ] = [] q s o r t ( a : as ) = q s o r t [ b | b <− as , b < a ] ++ [ a ] ++ q s o r t [ b | b <− as , b >= a ] Main> qsort [1,4,2,2,4] [1,2,2,4,4] Administratives Programmierspr Haskell Quicksort Snippets Pseudo-Code Universität Bielefeld Programmieren in Haskell function quicksort(’array’) Giegerich create empty lists ’less’ and ’greater’ Administratives if length(’array’) <= 1 Programmierspr // an array of zero or one elements Haskell // is already sorted return ’array’ select and remove a pivot value ’pivot’ from ’array’ for each ’x’ in ’array’ if ’x’ <= ’pivot’ then append ’x’ to ’less’ else append ’x’ to ’greater’ return concatenate(quicksort(’less’), ’pivot’, quicksort(’greater’)) Quicksort Snippets Quelle: http://en.wikipedia.org/w/index.php?title= Quicksort&oldid=454693051, CC-BY-SA 3.0 Haskell-Module Universität Bielefeld Programmieren in Haskell Giegerich Administratives Haskell-Script: Endung .hs, Kommentare werden mit - eingeleitet Literate-Haskell-Script: Endung .lhs, alles ist Kommentar, nur Zeilen, die mit > beginnen, gehören zum Programm. Zwischen Kommentaren und Definitionen muss sich mindestens eine leere Zeile befinden. Programmierspr Haskell Quicksort Snippets Beispiel 1 Universität Bielefeld > module T e s t 2 4 Administratives > where Programmierspr 6 7 Giegerich ^ immer g r o s s g e s c h r i e b e n 3 5 Programmieren in Haskell Es f o l g e n D e k l a r a t i o n e n und D e f i n i t i o n e n Haskell Quicksort 8 9 Snippets f : : I n t −> I n t 10 11 ^ Typnamen immer g r o s s g e s c h r i e b e n 12 13 > f x = x ∗ x 14 15 16 > l e s s : : I n t −> I n t −> Bool −− R u e c k g a b e t y p a l s l e t z t e s > less a b = a < b 17 18 A u f r u f von d e r S h e l l v i a : 19 20 $ h ugs T e s t Bedienung vom Hugs Universität Bielefeld Programmieren in Haskell Giegerich Administratives Aufrufen mit hugs <Modulname> Programmierspr Laden eines neuen Moduls: :l <Modulname> Haskell Erneutes Laden eines Moduls nach einer Änderung: :r Den Typ eines Ausdrucks anzeigen: :t <Ausdruck> Alle verfügbaren Kommandos anzeigen: :? hugs beenden: :q Quicksort Snippets Haskell-Typen Universität Bielefeld Programmieren in Haskell Giegerich Typ Werte Int Integer Float Double Bool Char String Int -> Int, . . . Ganze Zahlen Ganze Zahlen, unbeschränkte Stelligkeit Fliesskommazahlen 32 bit Fliesskommazahlen 64 bit Wahrheitswerte, True/False Zeichen, ’a’, ’b’, . . . Zeichenketten, “abrakadabra” Funktionen Administratives Programmierspr Haskell Quicksort Snippets Int vs. Integer Universität Bielefeld Programmieren in Haskell 1 2 3 > fakInt > fakInt 0 > fakInt n :: Int -> Int = 1 = n * fakInt (n -1) Fak> fakInt 20 -2102132736 1 2 3 > fakInteger :: Integer -> Integer > fakInteger 0 = 1 > fakInteger n = n * fakInteger (n -1) Fak> fakInteger 20 2432902008176640000 Giegerich Administratives Programmierspr Haskell Quicksort Snippets Listen Unendliche Listen: Universität Bielefeld Programmieren in Haskell Giegerich Hugs> [1..] [1,2,3,4,5,6,7,8,9,10,11,^C Die ersten 4 natürlichen Zahlen: Administratives Programmierspr Haskell Quicksort Snippets Hugs> take 4 [1..] [1,2,3,4] Hugs> [1..4]++[4,3..1] [1,2,3,4,4,3,2,1] Strings sind auch Listen: Hugs> reverse "Hello World" "dlroW olleH"