Grundlagen der Programmierung 2 Geplanter Inhalt der ersten Hälfte: Grundlagen der Programmierung 2 (1.A) • Einführung Prof. Dr Manfred Schmidt-Schauß • Sommersemester 2014 1 Programmieren ◦ ◦ ◦ ◦ ◦ Compilerbau; ◦ ◦ ◦ ◦ ◦ ◦ in Haskell Definitionen; Rekursion Auswertung in Haskell Programmieren mit Listen Datenstrukturen: Bäume Polymorphe Typen und Typklassen Lexer Parser Kombinator-Parser Kode-Erzeugung; abstrakte Maschinen Shift-Reduce Parser und Compiler-Generatoren Compiler-Generatoren Grundlagen der Programmierung 2 (Intro-A) Bücher, Literatur, URLs – 2/26 – 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/ • • • • Haskell-Web-Seite rekursive Programmierung mit einer stark typisierten funktionalen Programmiersprache mit parametrischem Polymorphismus 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) Haskell Compiler: • J. D. Ullman, M. S. Lam, R. Sethi , A. V. Aho Compilers: Principles, Techniques, and Tools , 2nd Edition, Pearson 2006 DE: Compiler: Prinzipien, Techniken und Werkzeuge, Pearson Studium, 2008 • Niklaus Wirth, Grundlagen und Techniken des Compilerbaus, Oldenbourg 1997 Grundlagen der Programmierung 2 (Intro-A) – 3/26 – Grundlagen der Programmierung 2 (Intro-A) – 4/26 – Haskell Haskell Haskell ist eine moderne Programmiersprache; sehr weitgehende Konzepte werden erprobt und kombiniert: • strenge und statische Typisierung • 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 Nicht-strikte Auswertung ⇒ ⇒ • Wichtige Eigenschaften funktionaler Programmiersprachen viele korrekte Programmtransformationen korrekte automatische Parallelisierung Prozess-Programmierung und Konkurrente Auswertung ⇒ deklarative Programmierung Grundlagen der Programmierung 2 (Intro-A) – 5/26 – PR zu Funktionalen Programmiersprachen Grundlagen der Programmierung 2 (Intro-A) – 6/26 – Programmierung in Haskell Grundprinzipien: des funktionalen Programmierens OCaml: Variante von ML, eine Programmiersprache analog zu Haskell. Aus dem Artikel von Yaron Minsky und Stephen Weeks: (JFP 2008) Immutability wird gelobt: • Definition von Funktionen quadrat x = x*x • Aufbau von Ausdrücken: Anwendung der Funktion auf Argumente, die wieder Ausdrücke sein können. 3*(quadrat 5) entspricht Verzicht auf Zuweisungen Pattern Matching wird gelobt: entspricht Datentypen mit Konstruktoren und case-Expressions Tail-Rekursions-Optimierung wird vermisst. • Das gibt es in Haskell • Grundlagen der Programmierung 2 (Intro-A) – 7/26 – programminterne Kommunikation: Nur der Wert von Ausdrücken wird bei der Auswertung zurückgegeben. 75 Funktionen können Datenobjekte sein Grundlagen der Programmierung 2 (Intro-A) – 8/26 – Standards zu Folien und Skript Interpreter / Compiler für Haskell Darstellung von Quell-Code (Source-code) auf den Folien und Skript: Wir verwenden den Interpreter GHCi www.haskell.org quadrat x = x*x Einfacher Download und Installation Darstellung von Benutzereingabe und Interpreterausgabe auf Folien und im Skript: *Main> 2+2 ←4 Grundlagen der Programmierung 2 (Intro-A) – 9/26 – Umgang mit dem Interpreter Online-Report Aufruf: Siehe Hilfestellungen auf der Professur-Webseite. Simon Peyton Jones und Simon Marlow ( Microsoft Research) die wichtigsten Forscher und Weiterentwickler des GHC: (Glasgow Haskell Compiler). (Simon Marlow: bis März 2013: ) Grundlagen der Programmierung 2 (Intro-A) – 10/26 – 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 Prelude> :set +s ←- • > (druckt den Typ des Ausdrucks True) (Option s für Statistik gesetzt) ganze Zahlen 0,1,-3 Typ: Int n mit |n| ≤ 231 − 1 = 2147483647 • beliebig lange ganze Zahlen 11122399387141 Typ: Integer, • rationale Zahlen 3%7 Typ: Ratio • Gleitkommazahlen 3.456e+10 Typ: Floating • Zeichen ’a’ Typ: Char • Datenkonstruktoren True, False Typ: Bool Diese nennen wir auch Basiswerte (bis auf Floating) Module im Interpreter verwenden: Prelude> :m +Data.Char +Numeric ←Grundlagen der Programmierung 2 (Intro-A) – 11/26 – Grundlagen der Programmierung 2 (Intro-A) – 12/26 – Einfache Daten und Operatoren • • • Beispiel 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: Grundlagen der Programmierung 2 (Intro-A) – 13/26 – Typen in Haskell TYP Int Integer Float Double Integer -> Integer -> Integer Integer -> Integer Integer -> Integer -> Integer Typ ... *Main> quadratsumme 3 4 ←25 Grundlagen der Programmierung 2 (Intro-A) – 14/26 – Typen in Haskell Beispiel Die Ausgabe des Interpreters für die Addition (+) ist komplizierter: Ausdruck 3 123 1.23e45 1.23e45 (+) quadrat quadratsumme Konstanten 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 (Typ von Argument 1) -> (Typ von Argument 2) -> Ergebnistyp Zum Beispiel gilt: (+)::Integer -> Integer -> Integer (+)::Double -> Double -> Double Funktionen Grundlagen der Programmierung 2 (Intro-A) Definition eines Polynoms, z.B.: x2 + y 2 : – 15/26 – Grundlagen der Programmierung 2 (Intro-A) – 16/26 – Aus der Haskell-Dokumentation (ohne Farben) (vereinfachte) Haskell-Syntax http://www.hck.sk/users/peter/HaskellEx.htm http://www.haskell.org/onlinereport/exps.html#sect3.2 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“) ” Grundlagen der Programmierung 2 (Intro-A) – 17/26 – Beispiel zur Grammatik 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] ] (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 (Intro-A) – 18/26 – Programm quadratsumme x y = (quadrat x) + (quadrat y) Zeichenfolge im Programm quadratsumme x y = (quadrat x) + (quadrat y) + quadrat x Grundlagen der Programmierung 2 (Intro-A) Ein Haskell-Programm ist definiert als Name in der Grammatik (man sagt auch: Nichtterminal) Eine Menge von Funktionsdefinitionen 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/26 – Eine davon ist die Definition der Konstanten main. Ohne main: dann ist es ein Modul Grundlagen der Programmierung 2 (Intro-A) – 20/26 – Haskell: Verschiedenes . . . Fallunterscheidung: IF-THEN-ELSE Prelude: vordefinierte Funktionen, Typen und Datenkonstruktoren Präfix, Infix, Prioritäten: ist möglich für Operatoren Konventionen zur Klammerung: s1 s2 . . . sn ≡ ((. . . (s1 s2 ) s3 . . .) sn ) Funktionsdefinitionen: • formale Parameter müssen verschiedenen sein; • keine undefinierten Variablen im Rumpf! Typisierung: if Bool . . . then typ else typ (if 1 then 1 else 2) Weitere Trennzeichen: “{“,“}“ Semikolon “; “ Layout-sensibel: bewirkt Klammerung mit {, }. Grundlagen der Programmierung 2 (Intro-A) Syntax: if hAusdrucki then hAusdrucki else hAusdrucki if“, then“, else“ sind reservierte Schlüsselworte ” ” ” Der erste Ausdruck ist eine Bedingung (Typ Bool) ergibt einen (Typ-)Fehler – 21/26 – Bedingungen, Arithmetische Vergleiche Grundlagen der Programmierung 2 (Intro-A) – 22/26 – Kalender und Schaltjahre Die Infixoperatoren ==, <, >, <=, >=, / = haben den Haskell-Typ: Integer -> Integer -> Bool Aufgabe: Berechne ob n ein Schaltjahr ist: Bedingungen: Wenn n durch 4 teilbar, dann ist es ein Schaltjahr, aber wenn es auch durch 100 teilbar ist, dann nicht aber wenn es auch durch 400 teilbar ist, dann ist es doch ein Schaltjahr. Erweiterung: Gilt erst nach dem jahr 1582 Achtung: = ist reserviert für Funktionsdefinitionen und let Boolesche Ausdrücke sind kombinierbar mit not, ||, && (nicht, oder, und) Konstanten sind True, False. Beispiel: 3.0 <= x && x < 5.0 Grundlagen der Programmierung 2 (Intro-A) – 23/26 – Grundlagen der Programmierung 2 (Intro-A) – 24/26 – Darstellungen eines Programms Darstellungen eines Programms Syntaxbaum: sichtbare Syntax: vom Programmierer benutzt Eindeutige Darstellung des Programms als markierter Baum. Wird vom Compiler/Interpreter (Parser) intern erzeugt. Ermöglicht die eindeutige Definition der Ausführung des Programms. Interne Syntax: “Linearisierung“; entzuckerte Version; voll geklammert; alle Operatoren sind Präfix; kein Layout Ableitungsbaum (Herleitungsbaum): Interne Darstellung; Vom Kompiler erzeugt Grundlagen der Programmierung 2 (Intro-A) Entspricht der hierarchischen Schachtelung des Programms. Z.B. Klammerstruktur. – 25/26 – Grundlagen der Programmierung 2 (Intro-A) – 26/26 –