Grundlagen der Programmierung 2: Geplanter Inhalt der ersten Hälfte Grundlagen der Programmierung 2 • • • • • • Prof. Dr. Manfred Schmidt-Schauß Künstliche Intelligenz und Softwaretechnologie 17. April 2013 • 1 Bücher, Literatur, URLs rekursives Programmieren in Haskell Auswertung in Haskell Programmieren mit Listen Datenstrukturen: Bäume Polymorphe Typen und Typklassen Compilerbau; ◦ Lexer ◦ Parser ◦ Kombinator-Parser ◦ Kode-Erzeugung; abstrakte Maschinen ◦ Shift-Reduce Parser und Compiler-Generatoren ◦ Compiler-Generatoren (Semantik) Haskell Haskell und funktionale Programmierung: • http://www-stud.informatik.uni-frankfurt.de/˜prg2 insbesondere das Skript zur Vorlesung • www.haskell.org • http://haskell.org/onlinereport/ • • • • Compiler: • • rekursive Programmierung Haskell-Web-Seite mit einer stark typisierten Haskell-Doku Manuel Chakravarty und Gabriele Keller, Einführung in die Programmierung mit Haskell Richard Bird, Introduction to Functional Programming Using Haskell Simon Thompson, Haskell: The Craft of Functional Programming Graham Hutton, Programming in Haskell (2007) funktionalen Programmiersprache mit parametrischem Polymorphismus Jeffrey D. Ullman, Monica S. Lam, Ravi Sethi , Alfred V. Aho Compilers: Principles, Techniques, and Tools , 2nd Edition, Pearson 2006 deutsch: Compiler: Prinzipien, Techniken und Werkzeuge, Pearson Studium, 2008 Niklaus Wirth, Grundlagen und Techniken des Compilerbaus, Oldenbourg 1997 Grundlagen der Programmierung 2 (1.A) - 2 - Grundlagen der Programmierung 2 (1.A) - 3 - Haskell Grundlagen der Programmierung 2 (1.A) - 4 - Haskell Haskell Haskell ist eine moderne Programmiersprache; sehr weitgehende Konzepte werden erprobt und kombiniert • • • Wichtige Eigenschaften funktionaler Programmiersprachen Referentielle Transparenz Gleiche Funktion, gleiche Argumente =⇒ gleicher (Rückgabe-)Wert Keine Seiteneffekte! D.h. keine Änderung von Objekten Verzögerte Auswertung Nur die für das Resultat notwendigen Unterausdrücke werden (so spät wie möglich) ausgewertet. Parametrisch Polymorphes Typsystem Nur Ausdrücke mit Typ sind erlaubt — es gibt Typvariablen. Das Typsystem garantiert: keine dynamischen Typfehler. Automatische Speicherverwaltung Anforderung und Freigabe von Speicher strenge und statische Typisierung Nicht-strikte Auswertung ⇒ ⇒ viele korrekte Programmtransformationen korrekte automatische Parallelisierung Prozess-Programmierung und Konkurrente Auswertung ⇒ deklarative Programmierung - 5 - Grundlagen der Programmierung 2 (1.A) PR zu Funktionalen Programmiersprachen - 6 - Grundlagen der Programmierung 2 (1.A) Programmierung in Haskell OCaml: Variante von ML, eine Programmiersprache analog zu Haskell. Grundprinzipien: des funktionalen Programmierens Aus dem Artikel von Yaron Minsky und Stephen Weeks: (JFP 2008) Immutability wird gelobt: entspricht Verzicht auf Zuweisungen Pattern Matching wird gelobt: entspricht Datentypen mit Konstruktoren und case-Expressions Tail-Rekursions-Optimierung) wird vermisst. ( kommt noch) Grundlagen der Programmierung 2 (1.A) Das gibt es in Haskell - 7 - • • • • Definition von Funktionen Aufbau von Ausdrücken: Anwendung der Funktion auf Argumente, die wieder Ausdrücke sein können. programminterne Kommunikation: Nur der Wert von Ausdrücken wird bei der Auswertung zurückgegeben. Funktionen können Datenobjekte sein Grundlagen der Programmierung 2 (1.A) quadrat x = x*x 3*(quadrat 5) 75 - 8 - Standards zu Folien und Skript Interpreter / Compiler für Haskell Wir verwenden den Interpreter GHCi Darstellung von Quell-Code (Source-code) auf den Folien und Skript: www.haskell.org quadrat x = x*x Einfacher Download und Installation Darstellung von Interpreteraktionen auf Folien und Skript: Siehe Hilfestellungen auf der Professur-Webseite. *Main> 2+2 ←4 Simon Peyton Jones und Simon Marlow ( Microsoft Research) die wichtigsten Forscher und Weiterentwickler des GHC: (Glasgow Haskell Compiler). (März 2013: Simon Marlow wechselt zu Facebook.) Grundlagen der Programmierung 2 (1.A) - 9 - Umgang mit dem Interpreter Online-Report Aufruf: - 10 - Grundlagen der Programmierung 2 (1.A) Einfache Daten und Operatoren http://www.haskell.org/onlinereport ghci (im richtigen Fenster) prompt > ghci ←< Einige Zeilen Infos > Prelude> :h ←< Hilfe-Menu > Prelude> :t True ←True :: Bool (druckt den Typ des Ausdrucks True) (Option s für Statistik gesetzt) Prelude> :set +s ←- • ganze Zahlen • • • • • beliebig lange ganze Zahlen rationale Zahlen Gleitkommazahlen Zeichen Datenkonstruktoren 0,1,-3 Typ: Int n mit |n| ≤ 231 − 1 = 2147483647 11122399387141 Typ: Integer, 3%7 Typ: Ratio 3.456e+10 Typ: Floating ’a’ Typ: Char True, False Typ: Bool Diese nennen wir auch Basiswerte (bis auf Floating) Module im Interpreter verwenden: Prelude> :m +Char +Numeric ←Grundlagen der Programmierung 2 (1.A) - 11 - Grundlagen der Programmierung 2 (1.A) - 12 - Einfache Daten und Operatoren Beispiel Definition eines Polynoms, z.B.: x2 + y 2: • • • Arithmetische Operatoren: (ein) Typ: Int → Int → Int +, −, ∗, /, Arithmetische Vergleiche: (ein) Typ: Int → Int → Bool ==, <=, < . . . Logische Operatoren: (ein) Typ: Bool → Bool → Bool &&, ||, not quadratsumme x y = quadrat x + quadrat y Auswertung: ... *Main> quadratsumme 3 4 ←25 - 13 - Grundlagen der Programmierung 2 (1.A) Typen in Haskell Grundlagen der Programmierung 2 (1.A) - 14 - Typen in Haskell Ausdruck TYP Integer -> Integer -> Integer -> Integer -> Integer -> Int Integer Float Double Integer Integer Integer Typ (Typ von Argument 1) -> (Typ von Argument 2) -> Ergebnistyp 3 123 1.23e45 1.23e45 (+) quadrat quadratsumme Konstanten, Funktionen Beispiel Die Ausgabe des Interpreters für die Addition (+) ist komplizierter: Prelude> :t (+) ←(+) :: (Num a) => a -> a -> a D.h.: Für alle Typen a, die man als numerisch klassifiziert hat, d.h. die in der Typklasse Num sind, hat (+) den Typ a -> a -> a Z.B. gilt: (+)::Integer -> Integer -> Integer (+)::Double -> Double -> Double Grundlagen der Programmierung 2 (1.A) - 15 - Grundlagen der Programmierung 2 (1.A) - 16 - (vereinfachte) Haskell-Syntax Aus der Haskell-Dokumentation hFunktionsDefinitioni ::= hFunktionsnameihParameteri∗ = hAusdrucki hAusdrucki ::= hBezeichneri | hZahli | (hAusdrucki hAusdrucki) | (hAusdrucki) | (hAusdruckihBinInfixOpi hAusdrucki) hBezeichneri ::= hFunktionsnamei | hDatenkonstruktornamei | hParameteri | hBinInfixOpi hBinInfixOpi ::= ∗ | + | − | / Argumente einer Funktion: Anzahl der Argumente: formale Parameter. Stelligkeit der Funktion: (ar(f )) Die Nichtterminale hFunktionsnamei, hParameteri, hBezeichneri, hDatenkonstruktornamei sind Namen (z.b. quadrat“) ” - 17 - Grundlagen der Programmierung 2 (1.A) (lambda abstraction, n>=1) (let expression) (conditional) (case expression) (do expression) function application) (variable) (general constructor) (parenthesized expression) (tuple, k>=2) (list, k>=1) (arithmetic sequence) Grundlagen der Programmierung 2 (1.A) - 18 - Ein Haskell-Programm ist definiert als quadratsumme x y = (quadrat x) + (quadrat y) Grundlagen der Programmierung 2 (1.A) exp10 -> \ apat1 ... apatn -> exp | let decls in exp | if exp then exp else exp | case exp of { alts } | do { stmts } | fexp fexp -> [fexp] aexp aexp -> qvar | gcon | literal | ( exp ) | ( exp1 , ... , expk ) | [ exp1 , ... , expk ] | [ exp1 [, exp2] .. [exp3] ] Programm Beispiel zur Grammatik Zeichenfolge im Programm quadratsumme x y = (quadrat x) + (quadrat y) + quadrat x http://www.hck.sk/users/peter/HaskellEx.htm http://www.haskell.org/onlinereport/exps.html#sect3.2 Name in der Grammatik (sog. Nichtterminal) hFunktionsnamei hParameteri hParameteri = gleiches Zeichen wie in Grammatik hAusdrucki der Form hAusdrucki + hAusdrucki binärer Infix-Operator Anwendung: quadrat ist ein Ausdruck und x ist ein Ausdruck - 19 - • Eine Menge von Funktionsdefinitionen • Eine davon ist die Definition der Konstanten main. Ohne main: dann ist es ein Modul Grundlagen der Programmierung 2 (1.A) - 20 - Fallunterscheidung: IF-THEN-ELSE Haskell: Verschiedenes . . . Prelude: vordefinierte Funktionen, Typen und Datenkonstruktoren Syntax: if hAusdrucki then hAusdrucki else hAusdrucki Präfix, Infix, Prioritäten: ist möglich für Operatoren if“, then“, else“ sind reservierte Schlüsselworte ” ” ” Konventionen zur Klammerung: s1 s2 . . . sn ≡ ((. . . (s1 s2) s3 . . .) sn) Der erste Ausdruck ist eine Bedingung (Typ Bool) Funktionsdefinitionen: • formale Parameter müssen verschiedenen sein; • keine undefinierten Variablen im Rumpf! Typisierung: if Bool . . . then typ else typ Weitere Trennzeichen: “{“,“}“ Semikolon “; “ (if 1 then 1 else 2) Layout-sensibel: bewirkt Klammerung mit {, }. ergibt einen (Typ-)Fehler - 21 - Grundlagen der Programmierung 2 (1.A) Bedingungen, Arithmetische Vergleiche - 22 - Darstellungen eines Programms Die Infixoperatoren ==, <, >, <=, >=, / = haben den Typ: Integer -> Integer -> Bool sichtbare Syntax: vom Programmierer benutzt Achtung: = ist reserviert für Funktionsdefinitionen und let Boolesche Ausdrücke sind kombinierbar mit not, ||, && Konstanten sind True, False. Grundlagen der Programmierung 2 (1.A) Interne Syntax: “Linearisierung“; entzuckerte Version; voll geklammert; alle Operatoren sind Präfix; kein Layout (nicht, oder, und) Ableitungsbaum (Herleitungsbaum): Interne Darstellung; Vom Kompiler erzeugt Beispiel: 3.0 <= x && x < 5.0 Grundlagen der Programmierung 2 (1.A) - 23 - Grundlagen der Programmierung 2 (1.A) - 24 - Darstellungen eines Programms Syntaxbaum: Beispiele if x <= 0 then 1 else x*(quadrat (x-1)) Syntaxbaum: Eindeutige Darstellung des Programms als markierter Baum. Wird vom Compiler/Interpreter (Parser) intern erzeugt. Ermöglicht die eindeutige Definition der Ausführung des Programms. ifThenElseUUUUU <= DD { x { {{ {{ {{ {} { i iiii iiii iiii tiiii DD DD DD DD ! 0 1 UUUU UUUU UUUU U* x ∗ KKKK KK KK KK KK KK % quadrat x Entspricht der hierarchischen Schachtelung des Programms. Z.B. Klammerstruktur. x*(quadrat (x-1)) q qqq qqq qqq qx qq x − MMMM MMM MMM MMM & 1 ∗ MMMMM MMM MMM MMM & quadrat x - 25 - Grundlagen der Programmierung 2 (1.A) Syntaxbaum: Beispiele Zwei Syntaxbäume zu 1 − @@ @@ @@ @@ 2 }} }} }} } ~} ~~ ~~ ~~ ~~ ~ 1 1-2-3: (1 − (2 − 3)) − ?? ?? ?? ?? 3 − ?? ?? ?? ?? − AA AA AA AA 3 ((1 − 2) − 3) 2 Nur einer ist ist gültig in Haskell. Grundlagen der Programmierung 2 (1.A) - 27 - Grundlagen der Programmierung 2 (1.A) qqq qqq qqq q q qx q − MMMM MMM MMM MMM & 1 - 26 -