Grundlagen der Programmierung 2

Werbung
Grundlagen der Programmierung 2
Prof. Dr. Manfred Schmidt-Schauÿ
Künstliche Intelligenz und Softwaretechnologie
14. April 2011
Grundlagen der Programmierung 2:
Geplanter Inhalt der ersten 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-stud.informatik.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 -
PR zu Funktionalen 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 -
PR 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 -
PR 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 -
Standards zu Folien und Skript
Darstellung von Quell-Code (Source-code) auf den Folien und Skript:
quadrat x = x*x
Darstellung von Interpreteraktionen auf Folien und Skript:
*Main> 2+2 ←4
Grundlagen der Programmierung 2 (1.A)
- 11 -
Interpreter / Compiler für Haskell
Wir verwenden den Interpreter GHCi
Im RBI verfügbar.
Einfacher Download und Installation
Grundlagen der Programmierung 2 (1.A)
- 12 -
Umgang mit dem Interpreter
Online-Report
Aufruf:
http://www.haskell.org/onlinereport
ghci (im richtigen Fenster)
prompt > ghci ←< several lines >
Prelude> :h ←< Hilfe-Menu >
Prelude> :t True ←True :: Bool
(druckt den Typ des Ausdrucks
(Option s für Statistik gesetzt)
Prelude> :set +s ←-
Module im Interpreter verwenden:
Prelude> :m +Char +Numeric ←Grundlagen der Programmierung 2 (1.A)
- 13 -
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)
- 14 -
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)
- 15 -
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)
- 16 -
Typen in Haskell
TYP
Integer ->
Integer ->
Ausdruck
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)
3
123
1.23e45
1.23e45
(+)
quadrat
quadratsumme
Konstanten,
Funktionen
- 17 -
Typen in Haskell
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)
- 18 -
(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:
formale Parameter.
Stelligkeit der Funktion: (ar(f ))
Die Nichtterminale
hFunktionsnamei, hParameteri, hBezeichneri, hDatenkonstruktornamei
sind Namen (z.b. quadrat“)
”
Grundlagen der Programmierung 2 (1.A)
- 19 -
Aus der Haskell-Dokumentation
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] ]
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)
- 20 -
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)
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
- 21 -
Programm
Ein Haskell-Programm ist definiert als
• 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)
- 22 -
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)
- 23 -
Fallunterscheidung: IF-THEN-ELSE
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 (Typ-)Fehler
Grundlagen der Programmierung 2 (1.A)
- 24 -
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)
- 25 -
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)
- 26 -
Darstellungen eines Programms
Syntaxbaum:
Eindeutige Darstellung des Programms als markierter Baum.
Wird vom Compiler/Interpreter intern erzeugt.
Ermöglicht die eindeutige Definition
der Ausführung des Programms.
Entspricht der hierarchischen Schachtelung des Programms.
Grundlagen der Programmierung 2 (1.A)
- 27 -
Syntaxbaum: Beispiele
if x <= 0 then 1 else x*(quadrat (x-1))
ifThenElse
WWWWW
W
<=
FF
x
x
xx
xx
x
x
{x
x
hhh
hhhh
h
h
h
hh
hhhh
h
t hhh
FF
FF
FF
F#
1
0
WWWWW
WWWWW
WWWWW
WWWWW
+
q
q
q
qq
qqq
q
q
q
xqqq
∗ PPPPPP
x
PPP
PPP
PP'
oo
ooo
o
o
o
ow oo
appFF
FF
FF
FF
F#
quadrat
x
Und zu x*(quadrat (x-1))
x
p
ppp
p
p
pp
ppp
px pp
xx
xx
x
x
xx
x{ x
− @@
@@
@@
@@
∗ PPPPPP
PPP
PPP
PP(
ooo
ooo
o
o
ow oo
appFF
FF
FF
FF
F#
quadrat
x
Grundlagen der Programmierung 2 (1.A)
1
x
xx
xx
x
xx
x{ x
− @@
- 28 -
@@
@@
@@
1
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)
- 29 -
Herunterladen