Grundlagen der Programmierung 2 Prof. Dr. Manfred Schmidt-Schauÿ Künstliche Intelligenz und Softwaretechnologie 15. April 2009 Grundlagen der Programmierung 2: Geplanter Inhalt der zweiten Hälfte • • • • • • • rekursives Programmieren in Haskell Auswertung in Haskell Programmieren mit Listen Ströme als unendliche Listen in Haskell Polymorphe Typen und Typklassen Compilerbau; Einführung Semantik; parallele Auswertung Grundlagen der Programmierung 2 (1.A) - 2 - Bücher, Literatur, URLs • http://www.cs.uni-frankfurt.de/˜prg2 • • www.haskell.org Haskell-Web-Seite http://haskell.org/onlinereport/ 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) • • • Grundlagen der Programmierung 2 (1.A) - 3 - Haskell rekursive Programmierung mit einer stark typisierten funktionalen Programmiersprache mit parametrischem Polymorphismus Haskell Grundlagen der Programmierung 2 (1.A) - 4 - Haskell Haskell ist eine moderne Programmiersprache; sehr weitgehende Konzepte werden erprobt und kombiniert strenge und statische Typisierung Nicht-strikte Auswertung =⇒ =⇒ viele korrekte Programmtransformationen korrekte automatische Parallelisierung Grundlagen der Programmierung 2 (1.A) - 5 - Haskell 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 Grundlagen der Programmierung 2 (1.A) - 6 - Public Relations für Funktionale Programmiersprachen OCaml: Variante von ML, analog zu Haskell Artikel von Yaron Minsky und Stephen Weeks: (JFP 2008) Einige Zitate: Most importantly, using OCaml helps us find, hire, and retain great ” programmers. . . . The density of bright people in the OCaml community is impressive and it shows up in hiring “ Grundlagen der Programmierung 2 (1.A) - 7 - Public Relations für Funktionale Programmiersprachen OCaml . . . . It has allowed us to develop code to very high standards ” of safety and correctness while rapidly adapting to changing markets. “ Immutability OCaml is not a pure language, but the default in ” OCaml is for immutability. ” Pattern Matching A great deal of what happens in many programs ” is case analysis. . . . a convenient syntax for data-directed case analysis, and a proof guaranteed by the compiler that the case analysis is exhaustive“ Grundlagen der Programmierung 2 (1.A) - 8 - Public Relations für Funktionale Programmiersprachen The current standard library is implemented well and provides ” reasonable coverage, but it is missing a lot of useful functionality and has a number of well-known pitfalls (perhaps the most commented upon is the fact that a number of the functions in the list module are not tail-recursive). “ (d.h. nicht endrekursions-optimiert: dazu kommen wir noch) Grundlagen der Programmierung 2 (1.A) - 9 - Programmierung in Haskell Grundprinzipien: des funktionalen Programmierens • • • • 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 - 10 - Interpreter / Compiler für Haskell Wir verwenden den Interpreter GHCi Im RBI verfügbar Einfacher Download und Installation Grundlagen der Programmierung 2 (1.A) - 11 - Umgang mit dem Interpreter Online-Report http://www.haskell.org/onlinereport Aufruf: >:h >:t Ausdruck >:set +t ... ghci (im richtigen Fenster) Hilfe druckt den Typ des Ausdrucks Optionen ändern Module im Interpreter verwenden: :m +Char +Numeric ... Grundlagen der Programmierung 2 (1.A) - 12 - Einfache Daten und Operatoren • ganze Zahlen • • • • • beliebig lange ganze Zahlen rationale Zahlen Gleitkommazahlen Zeichen Datenkonstruktoren Typ Int n mit |n| ≤ 231 − 1 = 2147483647 (vom 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) Grundlagen der Programmierung 2 (1.A) - 13 - Einfache Daten und Operatoren • Arithmetische Operatoren: (ein) Typ: Int → Int → Int +, −, ∗, /, • Arithmetische Vergleiche: (ein) Typ: Int → Int → Bool ==, <=, < . . . • Logische Operatoren: (ein) Typ: Bool → Bool → Bool &&, ||, not Grundlagen der Programmierung 2 (1.A) - 14 - Beispiel Definition eines Polynoms x2 + y 2: quadratsumme x y = quadrat x + quadrat y Auswertung: ... Main> quadratsumme 3 4 25 Grundlagen der Programmierung 2 (1.A) - 15 - Typen in Haskell Integer -> Integer -> Integer -> Integer -> Integer -> Int Integer Float Double Integer Integer Integer Typ (Typ von Argument 1) -> (Typ von Argument 2) -> Ergebnistyp Grundlagen der Programmierung 2 (1.A) 1,2,3,4,. . . 1,2,3,4,. . . 1.23e45 1.23e45 (+) quadrat quadratsumme Konstanten, Funktionen - 16 - Typen in Haskell Beispiel Die Ausgabe des Interpreters für die Addition (+) ist komplizierter: (+) :: (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) - 17 - (vereinfachte) Haskell-Syntax hFunktionsDefinitioni ::= hFunktionsnameihParameteri∗ = hAusdrucki hAusdrucki ::= hBezeichneri | hZahli | (hAusdrucki hAusdrucki) | (hAusdrucki) | (hAusdruckihBinInfixOpi hAusdrucki) hBezeichneri ::= hFunktionsnamei | hDatenkonstruktornamei | hParameteri | hBinInfixOpi hBinInfixOpi ::= ∗ | + | − | / Argumente einer Funktion: Anzahl der Argumente: Grundlagen der Programmierung 2 (1.A) formale Parameter. Stelligkeit der Funktion: (ar(f )) - 18 - Beispiel zur Grammatik quadratsumme x y = (quadrat x) + (quadrat y) Zeichenfolge im Programm quadratsumme x,y = (quadrat x) + (quadrat y) + quadrat x Grundlagen der Programmierung 2 (1.A) Name in der Grammatik (sog. Nichtterminal) Funktionsname formale Parameter = 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 - Programm Ein Haskell-Programm ist definiert als • Eine Menge von Funktionsdefinitionen • Eine davon ist die Definition der Konstanten main. Grundlagen der Programmierung 2 (1.A) - 20 - Haskell: Verschiedenes . . . 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! Weitere Trennzeichen: “{“,“}“ Semikolon “; “ Layout-sensibel: bewirkt Klammerung mit {, }. Grundlagen der Programmierung 2 (1.A) - 21 - Fallunterscheidung Syntax: if hAusdrucki then hAusdrucki else hAusdrucki if“, then“, else“ sind reservierte Schlüsselworte ” ” ” Der erste Ausdruck ist eine Bedingung (Typ Bool) Typisierung: if Bool . . . then typ else typ (if 1 then 1 else 2) ergibt einen Fehler Grundlagen der Programmierung 2 (1.A) - 22 - Bedingungen, Arithmetische Vergleiche Die Infixoperatoren ==, <, >, <=, >=, / = haben den Typ: Integer -> Integer -> Bool Achtung: = ist reserviert für Funktionsdefinitionen und let Boolesche Ausdrücke sind kombinierbar mit not, ||, && Konstanten sind True, False. (nicht, oder, und) Beispiel: 3.0 <= x && x < 5.0 Grundlagen der Programmierung 2 (1.A) - 23 - Darstellungen eines Programms sichtbare Syntax: vom Programmierer benutzt 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 (1.A) - 24 - Darstellungen eines Programms Syntaxbaum: Eindeutige Darstellung des Programms als markierter Baum. ermöglicht die eindeutige Definition der Ausführung des Programms. entspricht der Schachtelung des Programms. Grundlagen der Programmierung 2 (1.A) - 25 - Syntaxbaum: Beispiele if x <= 0 then 1 else x*(quadrat (x-1)) ifThenElse WWWWW W <= FF x x xx xx x x {x x hhhh hhhh h h h h hhhh h t hhh FF FF FF F# 0 1 WWWWW WWWWW WWWWW WWWWW + q q q qqq q q qqq xqqq x ∗ PPPPPP PPP PPP PP' ooo ooo o o ow oo appFF FF FF FF F# quadrat x Grundlagen der Programmierung 2 (1.A) x xx xx x xx x{ x − @@ @@ @@ @@ 1 - 26 - Syntaxbaum: Beispiele Zwei Syntaxbäume zu 1 − AA AA AA A }} }} } } ~} }} }} } } ~} @@ @@ @ 3 − ?? ?? ?? ?? − AA ~ 1 (1 − (2 − 3)) − @@ } 2 ~~ ~~ ~ ~ 1-2-3: AA AA AA 3 ((1 − 2) − 3) 2 Grundlagen der Programmierung 2 (1.A) - 27 -