Grundlagen der Programmierung 2 (1.A) [1.5ex] Einführung [1.5ex

Werbung
Grundlagen der Programmierung 2
Geplanter Inhalt der ersten Hälfte:
Grundlagen der Programmierung 2 (1.A)
•
Einführung
Prof. Dr. Manfred Schmidt-Schauß
•
Sommersemester 2016
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
Grundlagen der Programmierung 2 (Intro-A)
1
Bücher, Literatur, URLs
– 2/27 –
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/27 –
Grundlagen der Programmierung 2 (Intro-A)
– 4/27 –
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/27 –
PR zu Funktionalen Programmiersprachen
Grundlagen der Programmierung 2 (Intro-A)
– 6/27 –
PR zu Haskell: Facebook
Facebook benutzt Haskell
zur Abwehr von Spam, Hackern und Missbrauch
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.
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:
Das gibt es in Haskell
Pur funktional und streng getypt
Concurrency (Nebenläufigkeit)
automatisch in Concurrent Haskell
Leichte Code-Aktivierung (nach Änderungen)
Performanz
Grundlagen der Programmierung 2 (Intro-A)
– 7/27 –
Grundlagen der Programmierung 2 (Intro-A)
– 8/27 –
Programmierung in Haskell
Standards zu Folien und Skript
Darstellung von Quell-Code (Source-code) auf den Folien und
Skript:
Grundprinzipien: des funktionalen Programmierens
•
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)
•
•
quadrat x = x*x
programminterne Kommunikation:
Nur der Wert von Ausdrücken wird bei der
Auswertung zurückgegeben.
Darstellung von Benutzereingabe und Interpreterausgabe auf Folien
und im Skript:
75
*Main> 2+2 ←4
Funktionen können Datenobjekte sein
Grundlagen der Programmierung 2 (Intro-A)
– 9/27 –
Interpreter / Compiler für Haskell
Grundlagen der Programmierung 2 (Intro-A)
– 10/27 –
Umgang mit dem Interpreter
Online-Report
Aufruf:
Wir verwenden den Interpreter GHCi
http://www.haskell.org/onlinereport
ghci
prompt > ghci ←< Einige Zeilen Infos
Prelude> :h ←< Hilfe-Menu >
Prelude> :t True ←True :: Bool
Prelude> :set +s ←-
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: )
>
(druckt den Typ des Ausdrucks True)
(Option s für Statistik gesetzt)
Module im Interpreter verwenden:
Prelude> :m +Data.Char +Numeric ←-
Grundlagen der Programmierung 2 (Intro-A)
– 11/27 –
Grundlagen der Programmierung 2 (Intro-A)
– 12/27 –
Einfache Daten und Operatoren
•
Einfache Daten und Operatoren
ganze Zahlen
0,1,-3
Typ: Int
n mit |n| ≤ 231 − 1 = 2147483647
• beliebig lange ganze Zahlen 11122399387141 Typ: Integer,
3%7
Typ: Ratio
• rationale Zahlen
• 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/27 –
Beispiel
•
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 (Intro-A)
– 14/27 –
Typen in Haskell, Beispiele
TYP
Beispiel-Ausdruck
Definition eines Polynoms, z.B.: x2 + y 2 :
Int
Integer
Float
Double
Integer -> Integer -> Integer
Integer -> Integer
Integer -> Integer -> Integer
quadratsumme x y = quadrat x + quadrat y
Auswertung:
... *Main> quadratsumme 3 4 ←25
3
123
1.23e45
1.23e45
(+)
quadrat
quadratsumme
Funktions-Typen:
(Typ von Argument 1) -> (Typ von Argument 2) -> . . . -> Ergebnistyp
Grundlagen der Programmierung 2 (Intro-A)
– 15/27 –
Grundlagen der Programmierung 2 (Intro-A)
– 16/27 –
Typen in Haskell
(vereinfachte) Haskell-Syntax
Beispiel
Die Ausgabe des Typs für die Addition (+):
hFunktionsDefinitioni ::= hFunktionsnameihParameteri∗ = hFunktionsrumpfi
hFunktionsrumpfi
::= hAusdrucki
hAusdrucki
::= hBezeichneri | hZahli
| (hAusdrucki hAusdrucki)
| (hAusdrucki)
| (hAusdruckihBinInfixOpi hAusdrucki)
hBezeichneri
::= hFunktionsnamei | hDatenkonstruktornamei
| hParameteri | hBinInfixOpi
hBinInfixOpi
::= ∗ | + | − | /
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
Argumente einer Funktion:
Anzahl der Argumente:
Zum Beispiel gilt:
(+)::Integer -> Integer -> Integer
(+)::Double -> Double -> Double
Die Nichtterminale
hFunktionsnamei, hParameteri, hBezeichneri, hDatenkonstruktornamei
sind Namen (z.b. quadrat“)
”
Grundlagen der Programmierung 2 (Intro-A)
– 17/27 –
Aus der Haskell-Dokumentation (ohne Farben)
Grundlagen der Programmierung 2 (Intro-A)
Grundlagen der Programmierung 2 (Intro-A)
– 18/27 –
Beispiel zur Grammatik
http://www.hck.sk/users/peter/HaskellEx.htm
http://www.haskell.org/onlinereport/exps.html#sect3.2
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] ]
formale Parameter.
Stelligkeit der Funktion: (ar(f ))
(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)
– 19/27 –
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)
Name in der Grammatik
(man sagt auch: Nichtterminal)
hFunktionsnamei
hParameteri
hParameteri
=
gleiches Zeichen wie in Grammatik
hFunktionsrumpfi
hier hAusdrucki der Form
hAusdrucki + hAusdrucki
binärer Infix-Operator
Anwendung: quadrat ist ein Ausdruck
und x ist ein Ausdruck
– 20/27 –
Programm
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:
s1 s2 . . . sn ≡ ((. . . (s1 s2 ) s3 . . .) sn )
Ein Haskell-Programm ist definiert als
Eine Menge von Funktionsdefinitionen
Eine davon ist die Definition der Konstanten main.
Funktionsdefinitionen:
• formale Parameter müssen verschiedenen sein;
• keine undefinierten Variablen im Rumpf!
Ohne main: dann ist es ein Modul
Weitere Trennzeichen: “{“,“}“ Semikolon “; “
Layout-sensibel: bewirkt Klammerung mit {, }.
Grundlagen der Programmierung 2 (Intro-A)
– 21/27 –
Fallunterscheidung: IF-THEN-ELSE
Grundlagen der Programmierung 2 (Intro-A)
– 22/27 –
Bedingungen, Arithmetische Vergleiche
Die Infixoperatoren
Syntax: if hAusdrucki then hAusdrucki else hAusdrucki
if“, then“, else“ sind reservierte Schlüsselworte
”
”
”
Der erste Ausdruck ist eine Bedingung (Typ Bool)
==, <, >, <=, >=, / =
haben den Haskell-Typ: Integer -> Integer -> Bool
Typisierung: if Bool . . . then typ else typ
Achtung: = ist reserviert für Funktionsdefinitionen und let
(if 1 then 1 else 2)
Boolesche Ausdrücke
sind kombinierbar mit
ergibt einen (Typ-)Fehler
Grundlagen der Programmierung 2 (Intro-A)
not, ||, &&
(nicht, oder, und)
Konstanten sind True, False.
Beispiel: 3.0 <= x && x < 5.0
– 23/27 –
Grundlagen der Programmierung 2 (Intro-A)
– 24/27 –
Kalender und Schaltjahre
Darstellungen eines Programms
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.
Wenn n ≤ 1582, dann Abbruch.
Grundlagen der Programmierung 2 (Intro-A)
– 25/27 –
Darstellungen eines Programms
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.
Entspricht der hierarchischen Schachtelung des Programms.
Z.B. Klammerstruktur.
Grundlagen der Programmierung 2 (Intro-A)
– 27/27 –
sichtbare Syntax: vom Programmierer benutzt
Interne Syntax: “Linearisierung“; entzuckerte Version;
voll geklammert; alle Operatoren sind Präfix;
kein Layout
Ableitungsbaum (Herleitungsbaum, Syntaxbaum): Interne
Darstellung;
Vom Kompiler erzeugt
Grundlagen der Programmierung 2 (Intro-A)
– 26/27 –
Herunterladen