Grundlagen der Programmierung 2 (1.A)

Ähnliche Dokumente
Haskell. Grundlagen der Programmierung 2. Grundlagen der Programmierung 2 (1.A) Bücher, Literatur, URLs. Haskell. Einführung

Grundlagen der Programmierung 2 (1.A)

Grundlagen der Programmierung 2 (1.A)

Haskell. Grundlagen der Programmierung 2. Grundlagen der Programmierung 2: Geplanter Inhalt der ersten Hälfte. Prof. Dr. Manfred Schmidt-Schauß

Grundlagen der Programmierung 2

Grundlagen der Programmierung 2

Grundlagen der Programmierung 2 (1.A)

Grundlagen der Programmierung 2 (1.A)

Haskell und Python. pures Programmieren, Auswerten von Ausdrücken rekursives Programmieren, Typsystem. Python: Eine prozedurale Programmiersprache

Grundlagen der Programmierung 3 A

Haskell, Typen, und Typberechnung. Grundlagen der Programmierung 3 A. Überladung und Konversion in Haskell. Typisierung in Haskell

Grundlagen der Programmierung 3 A

Haskell, Typen, und Typberechnung. Grundlagen der Programmierung 3 A. Einige andere Programmiersprachen. Typisierung in Haskell

Grundlegende Datentypen

Grundlegende Datentypen

Grundlegende Datentypen

Funktionale Programmierung Grundlegende Datentypen

Vorsemesterkurs Informatik

Die Definition eines Typen kann rekursiv sein, d.h. Typ-Konstruktoren dürfen Elemente des zu definierenden Typ erhalten.

Basiskonstrukte von Haskell

Gliederung. n Teil I: Einleitung und Grundbegriffe. n Teil II: Imperative und objektorientierte Programmierung

Gliederung. Algorithmen und Datenstrukturen I. Listen in Haskell: Listen in Haskell: Listen in Haskell. Datentyp Liste Strings Listenkomprehension

Einführung in die funktionale Programmierung

Grundlagen der Programmierung 2. Operationale Semantik

Haskell, Typen, und Objektorientierung

Algorithmen und Datenstrukturen I

Programmiersprachen: Klassifizierung und Methoden. Programmier-Paradigmen. Grundlagen der Programmierung 2 (1.C) - 1 -

Funktionale Programmierung

ALP I Einführung in Haskell

Crashkurs: Haskell. Mentoring FU Berlin Felix Droop

2.5 Listen. Kurzschreibweise: [42; 0; 16] Listen werden mithilfe von [] und :: konstruiert.

Programmiersprachen: rekursives Programmieren in Haskell

Grundlagen der Programmierung 2 A (Listen)

Listen und Listenfunktionen. Grundlagen der Programmierung 2 A (Listen) Listen und Listenfunktionen. Listen? Haskell: Listen

III.1 Prinzipien der funktionalen Programmierung - 1 -

Vorsemesterkurs Informatik Sommersemester Aufgabenblatt Nr. 5A. Lösung zu Aufgabe 1 (Fehler in Haskell-Quelltext: Parsefehler)

Haskell for Hackers... or why functional programming matters

Adressen. Praktikum Funktionale Programmierung Organisation und Überblick. Termine WWW

Programmiersprachen: rekursives Programmieren in Haskell

Praktikum Funktionale Programmierung Organisation und Überblick

Übung zu Algorithmen und Datenstrukturen (für ET/IT)

Werkzeuge zur Programmentwicklung

Übung zu Algorithmen und Datenstrukturen (für ET/IT)

Einführung in Haskell und seine Werkzeuge

Einführung in die funktionale Programmierung

Übungs- und Praktikumsaufgaben zur Systemprogrammierung Dipl.-Ing. H. Büchter (Lehrbeauftragter) FH-Dortmund WS 2001/2002 / SS 2002

Crashkurs Haskell Mentoring WiSe 2016/17. Anja Wolffgramm Freie Universität Berlin

Funktionale Programmierung

5.3 Auswertung von Ausdrücken

Praktische Informatik 3

Beschreibung von Werten: Beschreibung von Werten: (2) Begriffsklärung: (Ausdruck, expression) (2) Begriffsklärung: (Ausdruck, expression)

Grundlagen der Programmierung 2 (1.B)

Programmieren in Haskell Einführung

Workshop Einführung in die Sprache Haskell

Vorsicht bei redundanten und unvollständigen Matches!

Grundlagen der Programmierung 2 (2.A)

Informatik I - Programmierung Globalübung Hugs98 Currying. Hugs98 Currying

7. Einführung in C++ Programmieren / Algorithmen und Datenstrukturen 1 Prof. Dr. Bernhard Humm FB Informatik, Hochschule Darmstadt

Programmieren in Haskell Das Haskell Typsystem

Einführung in die funktionale Programmierung

Hallo Haskell. (Funktionale Programmierung) Prof. Dr. Oliver Braun. Letzte Änderung: :08. Hallo Haskell 1/23

Haskell. (Compiler) Prof. Dr. Oliver Braun. Letzte Änderung: :58. Haskell 1/28

Vorsemesterkurs Informatik

Einführung in Funktionale Programmierung. Klassifizierung von Programmierparadigmen und -sprachen. Einleitung & Motivation

Übersicht. Einführung in die Funktionale Programmierung: Einleitung & Motivation. Klassifizierung von Programmiersprachen (1)

Stratego/XT und ASF+SDF Meta-Environment. Paul Weder Seminar Transformationen Datum:

Was bisher geschah. deklarative Programmierung. funktionale Programmierung (Haskell):

Praktische Informatik 3: Funktionale Programmierung Vorlesung 2 vom : Funktionen und Datentypen

Programmierparadigmen

Hallo Haskell. Funktionale Programmierung. Prof. Dr. Oliver Braun Letzte Änderung: :06. Hallo Haskell 1/23

Funktionale Programmierung. Das Funktionale Quiz. Das Funktionale Quiz. Das Funktionale Quiz

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 12/13. Kapitel 3. Grunddatentypen, Ausdrücke und Variable

Grundlagen der Programmierung 2 (1.B)

Typ-Polymorphismus. November 12, 2014

Compilerbau. Martin Plümicke WS 2018/19

Algorithmische Abstraktion

Programmiersprachen: rekursives Programmieren in Haskell

Vorsemesterkurs Informatik

Kapitel 6: Typprüfung

Gliederung. Funktionale Programmierung. Pattern matching in Haskell. Pattern matching in ERLANG. Materialien zur Vorlesung

Grundlagen der Programmierung 2 (1.C)

Operationale Semantik: Haskell

Haskell, Typen und Typberechnung

Transkript:

Grundlagen der Programmierung 2 (1.A) Einführung Prof. Dr. Manfred Schmidt-Schauß Sommersemester 2017

Grundlagen der Programmierung 2 Geplanter Inhalt der ersten Hälfte: Programmieren in Haskell Definitionen; Rekursion 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 Grundlagen der Programmierung 2 (Intro-A) 2/26

Bücher, Literatur, URLs Haskell und funktionale Programmierung: http://www-stud.informatik.uni-frankfurt.de/~prg2 insbesondere das Skript zur Vorlesung 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) 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

Haskell rekursive Programmierung mit einer stark typisierten funktionalen Programmiersprache mit parametrischem Polymorphismus Haskell Grundlagen der Programmierung 2 (Intro-A) 4/26

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 Prozess-Programmierung und Konkurrente Auswertung deklarative Programmierung Grundlagen der Programmierung 2 (Intro-A) 5/26

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 (Intro-A) 6/26

PR zu Funktionalen Programmiersprachen OCaml: Variante von ML, eine Programmiersprache analog zu Haskell. 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. Das gibt es in Haskell Grundlagen der Programmierung 2 (Intro-A) 7/26

PR zu Haskell: Facebook Facebook benutzt Haskell zur Abwehr von Spam, Hackern und Missbrauch Aus einem Artikel von Simon Marlow 2016 https://code.facebook.com/posts/745068642270222/fighting-spam-with-haskell/ Methode: Schnittstelle zum Regelbasierten Programmieren: Sogenannte policies, die oft geändert werden. Vorteile: Pur funktional und streng getypt Concurrency (Nebenläufigkeit) automatisch in Concurrent Haskell Leichte Code-Aktivierung (nach Änderungen) Performanz Grundlagen der Programmierung 2 (Intro-A) 8/26

Programmierung in Haskell Grundprinzipien: des funktionalen Programmierens Definition von Funktionen quadrat x = x*x Aufbau von Ausdrücken: Anwendung der Funktion auf Argumente, 3*(quadrat 5) die wieder Ausdrücke sein können. programminterne Kommunikation: Nur der Wert von Ausdrücken wird bei der 75 Auswertung zurückgegeben. Funktionen können Datenobjekte sein Grundlagen der Programmierung 2 (Intro-A) 9/26

Standards zu Folien und Skript Darstellung von Quell-Code (Source-code) auf den Folien und Skript: quadrat x = x*x Darstellung von Benutzereingabe und Interpreterausgabe auf Folien und im Skript: *Main> 2+2 4 Grundlagen der Programmierung 2 (Intro-A) 10/26

Interpreter / Compiler für Haskell Wir verwenden den Interpreter GHCi www.haskell.org Einfacher Download und Installation Siehe Hilfestellungen auf der Professur-Webseite. und die zahlreichen Informationen auf Blatt Nr. 0. 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) 11/26

Umgang mit dem Interpreter Online-Report http://www.haskell.org/onlinereport Aufruf: ghci prompt > ghci < Einige Zeilen Infos > Prelude> :h < Hilfe-Menu > Prelude> :t True True :: Bool (druckt den Typ des Ausdrucks True) Prelude> :set +s (Option s für Statistik gesetzt) Module im Interpreter verwenden: Prelude> :m +Data.Char +Numeric Grundlagen der Programmierung 2 (Intro-A) 12/26

Einfache Daten und Operatoren ganze Zahlen 0,1,-3 Typ: Int n mit n 2 31 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) Grundlagen der Programmierung 2 (Intro-A) 13/26

Einfache Daten und Operatoren Arithmetische Operatoren: +,,, /, (ein) Typ: Int Int Int Arithmetische Vergleiche: ==, <=, <... (ein) Typ: Int Int Bool Logische Operatoren: &&,, not (ein) Typ: Bool Bool Bool Grundlagen der Programmierung 2 (Intro-A) 14/26

Beispiel Definition eines Polynoms, z.b.: x 2 + y 2 : quadratsumme x y = quadrat x + quadrat y Auswertung:... *Main> quadratsumme 3 4 25 Grundlagen der Programmierung 2 (Intro-A) 15/26

Typen in Haskell, Beispiele TYP Beispiel-Ausdruck Int 3 Integer 123 Float 1.23e45 Double 1.23e45 Integer -> Integer -> Integer (+) Integer -> Integer quadrat Integer -> Integer -> Integer quadratsumme Funktions-Typen: (Typ von Argument 1) -> (Typ von Argument 2) ->... -> Ergebnistyp Grundlagen der Programmierung 2 (Intro-A) 16/26

Typen in Haskell Beispiel Die Ausgabe des Typs für die Addition (+): 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 Zum Beispiel gilt: (+)::Integer -> Integer -> Integer (+)::Double -> Double -> Double Grundlagen der Programmierung 2 (Intro-A) 17/26

(vereinfachte) Haskell-Syntax FunktionsDefinition ::= Funktionsname Parameter = Funktionsrumpf Funktionsrumpf ::= Ausdruck Ausdruck ::= Bezeichner Zahl ( Ausdruck Ausdruck ) ( Ausdruck ) ( Ausdruck BinInfixOp Ausdruck ) Bezeichner ::= Funktionsname Datenkonstruktorname Parameter BinInfixOp BinInfixOp ::= + / Argumente einer Funktion: Anzahl der Argumente: formale Parameter. Stelligkeit der Funktion: (ar(f)) Die Nichtterminale Funktionsname, Parameter, Bezeichner, Datenkonstruktorname sind Namen (z.b. quadrat ) Grundlagen der Programmierung 2 (Intro-A) 18/26

Aus der Haskell-Dokumentation (ohne Farben) http://www.hck.sk/users/peter/haskellex.htm http://www.haskell.org/onlinereport/exps.html#sect3.2 exp10 -> \ apat1... apatn -> exp (lambda abstraction, n>=1) let decls in exp (let expression) if exp then exp else exp (conditional) case exp of { alts } (case expression) do { stmts } (do expression) fexp fexp -> [fexp] aexp function application) aexp -> qvar (variable) gcon (general constructor) literal ( exp ) (parenthesized expression) ( exp1,..., expk ) (tuple, k>=2) [ exp1,..., expk ] (list, k>=1) [ exp1 [, exp2].. [exp3] ] (arithmetic sequence) Grundlagen der Programmierung 2 (Intro-A) 19/26

Beispiel zur Grammatik quadratsumme x y = (quadrat x) + (quadrat y) Zeichenfolge Name in der Grammatik (man sagt auch: Nichtterminal) im Programm quadratsumme Funktionsname x Parameter y Parameter = = gleiches Zeichen wie in Grammatik (quadrat x) + (quadrat y) Funktionsrumpf hier Ausdruck der Form Ausdruck + Ausdruck + binärer Infix-Operator quadrat x Anwendung: quadrat ist ein Ausdruck und x ist ein Ausdruck Grundlagen der Programmierung 2 (Intro-A) 20/26

Programm Ein Haskell-Programm ist definiert als Eine Menge von Funktionsdefinitionen Eine davon ist die Definition der Konstanten main. Ohne main: Sammlung von Funktionsdefinitionen oder ein Modul Grundlagen der Programmierung 2 (Intro-A) 21/26

Haskell: Verschiedenes... Prelude: vordefinierte Funktionen, Typen und Datenkonstruktoren Module / Bibliotheken: z.b. Data.List : siehe Dokumentation Präfix, Infix, Prioritäten: ist möglich für Operatoren Konventionen zur Klammerung: s 1 s 2... s n ((... (s 1 s 2 ) s 3...) s n ) Funktionsdefinitionen: formale Parameter müssen verschiedenen sein; keine undefinierten Variablen im Rumpf! Weitere Trennzeichen: {, } Semikolon ; Layout-sensibel: bewirkt Klammerung mit {, }. Grundlagen der Programmierung 2 (Intro-A) 22/26

Fallunterscheidung: IF-THEN-ELSE Syntax: if Ausdruck then Ausdruck else Ausdruck if, then, else sind reservierte Schlüsselworte Der erste Ausdruck ist eine Bedingung (Typ Bool) Typisierung: if Bool... then typ else typ Grundlagen der Programmierung 2 (Intro-A) 23/26

Fallunterscheidung: IF-THEN-ELSE Syntax: if Ausdruck then Ausdruck else Ausdruck 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 (Typ-)Fehler Grundlagen der Programmierung 2 (Intro-A) 23/26

Bedingungen, Arithmetische Vergleiche Die Infixoperatoren ==, <, >, <=, >=, /= haben u.a. den Haskell-Typ: Integer -> Integer -> Bool Achtung: = ist reserviert für Funktionsdefinitionen und let Grundlagen der Programmierung 2 (Intro-A) 24/26

Bedingungen, Arithmetische Vergleiche Die Infixoperatoren ==, <, >, <=, >=, /= haben u.a. den Haskell-Typ: Integer -> Integer -> Bool 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) 24/26

Kalender und Schaltjahre Aufgabe: Bedingungen: Berechne ob n ein Schaltjahr ist: Wenn n durch 4 teilbar, dann ist es ein Schaltjahr, ansonsten ist n kein Schaltjahr. Aber wenn es durch 100 teilbar ist, dann nicht. Aber wenn es durch 400 teilbar ist, dann ist es doch ein Schaltjahr. Grundlagen der Programmierung 2 (Intro-A) 25/26

Kalender und Schaltjahre Aufgabe: Bedingungen: Berechne ob n ein Schaltjahr ist: Wenn n durch 4 teilbar, dann ist es ein Schaltjahr, ansonsten ist n kein Schaltjahr. Aber wenn es durch 100 teilbar ist, dann nicht. Aber wenn es durch 400 teilbar ist, dann ist es doch ein Schaltjahr. Erweiterung: Gilt erst nach dem Jahr 1582. (Start des Gregorianischen Kalenders) Wenn n 1582, dann Abbruch. Grundlagen der Programmierung 2 (Intro-A) 25/26

Kalender und Schaltjahre Aufgabe: Bedingungen: Berechne ob n ein Schaltjahr ist: Wenn n durch 4 teilbar, dann ist es ein Schaltjahr, ansonsten ist n kein Schaltjahr. Aber wenn es durch 100 teilbar ist, dann nicht. Aber wenn es durch 400 teilbar ist, dann ist es doch ein Schaltjahr. Grundlagen der Programmierung 2 (Intro-A) 26/26

Kalender und Schaltjahre Aufgabe: Bedingungen: Berechne ob n ein Schaltjahr ist: Wenn n durch 4 teilbar, dann ist es ein Schaltjahr, ansonsten ist n kein Schaltjahr. Aber wenn es durch 100 teilbar ist, dann nicht. Aber wenn es durch 400 teilbar ist, dann ist es doch ein Schaltjahr. Als Ausdruck: n mod 4 == 0 Grundlagen der Programmierung 2 (Intro-A) 26/26

Kalender und Schaltjahre Aufgabe: Bedingungen: Berechne ob n ein Schaltjahr ist: Wenn n durch 4 teilbar, dann ist es ein Schaltjahr, ansonsten ist n kein Schaltjahr. Aber wenn es durch 100 teilbar ist, dann nicht. Aber wenn es durch 400 teilbar ist, dann ist es doch ein Schaltjahr. Als Ausdruck: n mod 4 == 0 && not (n mod 100 == 0) Grundlagen der Programmierung 2 (Intro-A) 26/26

Kalender und Schaltjahre Aufgabe: Bedingungen: Berechne ob n ein Schaltjahr ist: Wenn n durch 4 teilbar, dann ist es ein Schaltjahr, ansonsten ist n kein Schaltjahr. Aber wenn es durch 100 teilbar ist, dann nicht. Aber wenn es durch 400 teilbar ist, dann ist es doch ein Schaltjahr. Als Ausdruck: n mod 4 == 0 && not (n mod 100 == 0) (n mod 400 == 0) Grundlagen der Programmierung 2 (Intro-A) 26/26