Gliederung

Werbung
Gliederung
n Teil I: Einleitung und Grundbegriffe
l 1. Organisatorisches
l 2. Grundlagen von Programmiersprachen
n Teil II: Imperative und objektorientierte Programmierung
l
l
l
l
1. Grundelemente der Programmierung
2. Objekte, Klassen und Methoden
3. Rekursion und dynamische Datenstrukturen
4. Erweiterung von Klassen und fortgeschrittene Konzepte
n Teil III: Funktionale Programmierung: Haskell
n Teil IV: Logische Programmierung: Prolog
III.1 Prinzipien der funktionalen Programmierung- 1 -
Populäre Programmiersprachen
Quelle: www.tiobe.com, Oct. 2015
III.1 Prinzipien der funktionalen Programmierung- 2 -
Populäre Programmiersprachen
1. Java
....
32. Prolog
...
39. Haskell
Quelle: www.tiobe.com, Jan. 2016
III.1 Prinzipien der funktionalen Programmierung- 3 -
Kenntnis verschiedener Sprachen
n Eigene Ideen bei der Software-Entwicklung
können besser ausgedrückt werden
n Nötig, um in konkreten Projekten geeignete
Sprache auszuwählen
n Erleichtert das Erlernen weiterer
Programmiersprachen
n Nötig für den Entwurf neuer
Programmiersprachen
III.1 Prinzipien der funktionalen Programmierung- 4 -
Übersicht
Imperative Sprachen
l Folge von nacheinander
ausgeführten Anweisungen
n Prozedurale Sprachen
l Variablen, Zuweisungen,
Kontrollstrukturen
n Objektorientierte Sprachen
l Objekte und Klassen
l Abstrakte Datentypen und
Vererbung
Deklarative Sprachen
l Spezifikation dessen, was
berechnet werden soll
l Compiler legt fest, wie
Berechnung verläuft
n Funktionale Sprachen
l keine Seiteneffekte
l Rekursion
n Logische Sprachen
l Regeln zur Definition von
Relationen
III.1 Prinzipien der funktionalen Programmierung- 5 -
Wichtige Programmiersprachen
1950
Fortran
1960
Cobol
Algol 60
PL/1
1970
Lisp
Simula
Algol 68
Pascal
Smalltalk
C
1980
Scheme
Prolog
ML
Ada
C++
Eiffel
Modula-3
1990
Ada-95
Miranda
Java
2000
Python
Haskell
Scala
prozedural
objektorientiert
funktional
logisch
I.2. Grundlagen von Programmiersprachen - 6 -
n 1. Prinzipien der funktionalen Programmierung
n 2. Deklarationen
n 3. Ausdrücke
n 4. Muster (Patterns)
n 5. Typen und Datenstrukturen
n 6. Funktionale Programmiertechniken
I.2. Grundlagen von Programmiersprachen - 7 -
Imperative Programmierung (Java)
Eingabe: Eine Liste x
Ausgabe: Länge der Liste x
Algorithmus:
class Element
Vergleichbar wert;
Element next; ...
1. Setze n = 0.
public class Liste
{
Element kopf;
...
static int len (Liste x) {
int n = 0;
while (x.kopf != null) {
x.kopf = x.kopf.next;
n = n + 1;
}
2. Falls x nicht die
leere Liste ist, dann:
2a. Lösche das erste
Element von x.
2b. Erhöhe n um 1.
2c. Gehe zu Schritt 2.
3. Liefere n zurück.
{
}
return n;
}
III.1 Prinzipien der funktionalen Programmierung- 8 -
Kennzeichen imperativer Programmierung
n Programm besteht aus einzelnen Anweisungen,
die nacheinander abgearbeitet werden.
n Verschiedene Kontrollstrukturen, um
Programmablauf zu steuern.
n Abarbeitung einer Anweisung ändert Werte der
Variablen.
n Seiteneffekte
n Programmierer muss Speicherorganisation
bedenken
III.1 Prinzipien der funktionalen Programmierung- 9 -
Funktionale Programmierung (Haskell)
A.
Falls die Liste x leer ist, so ist len(x) = 0.
B.
Falls die Liste x nicht leer ist und
"rest" die Liste x ohne ihr erstes Element ist,
so ist len(x) = 1 + len(rest).
Programm in Haskell:
len []
=
0
len (kopf : rest)
=
1 + len rest
III.1 Prinzipien der funktionalen Programmierung- 10 -
Ausführung funktionaler Programme
len []
=
0
len (kopf : rest)
=
1 + len rest
len [15, 70, 36]
=
1 + len [70, 36]
=
1 + 1 + len [36]
=
1 + 1 + 1 + len []
=
1 + 1 + 1 + 0
=
3
III.1 Prinzipien der funktionalen Programmierung- 11 -
Kennzeichen funktionaler Programme
n Rekursion statt Schleifen
n Keine Seiteneffekte (referentielle Transparenz)
n Funktionen als gleichberechtigte Datenobjekte
(Funktionen höherer Ordnung)
n Verwendung von einer Funktions-Implementierung für verschiedene Typen (Polymorphismus)
n Programme sind kürzer, klarer, besser zu warten,
zuverlässiger, schneller zu erstellen
III.1 Prinzipien der funktionalen Programmierung- 12 -
Seiteneffekte
n Seiteneffekt: Veränderung des (Speicher-)Zustands
n Fehlende Seiteffekte in Funktionalen
Programmiersprachen:
l Verzicht auf Variablen und Wertzuweisungen
l Ausschließlich Verwendung von Ausdrücken
n Referenzielle Transparenz:
l Wert eines Ausdrucks hängt nicht vom Zeitpunkt oder der Reihenfolge
der Auswertung ab.
III.1 Prinzipien der funktionalen Programmierung- 13 -
Funktionale Programmierung (Haskell)
n Interaktiver Modus des Glasgow Haskell
Compilers (GHCi)
l Eingabe: Auszuwertender Ausdruck
l Ausgabe: Ergebnis des ausgewerteten Ausdrucks
n Bsp:
l Eingabe: len [15, 36, 70]
l Ausgabe: 3
n Interpreter
l führen jede Zeile des Programms nacheinander aus.
l Vorteil: Keine vorherige Übersetzung nötig, gut zur
Programmentwicklung geeignet.
l Nachteil: Ineffizienter als Compiler.
III.1 Prinzipien der funktionalen Programmierung- 14 -
n 1. Prinzipien der funktionalen Programmierung
n 2. Deklarationen
n 3. Ausdrücke
n 4. Muster (Patterns)
n 5. Typen und Datenstrukturen
n 6. Funktionale Programmiertechniken
III.1 Prinzipien der funktionalen Programmierung- 15 -
Deklarationen
len :: [Int] -> Int
len []
len (kopf : rest)
=
=
0
1 + len rest
square :: Int -> Int
square x = x * x
Typdeklarationen
Programm in Haskell:
Funktionsdeklarationen
Folge von linksbündig untereinander stehenden Deklarationen
III.1 Prinzipien der funktionalen Programmierung- 16 -
Deklarationen
len :: [Int] -> Int
len []
len (kopf : rest)
=
=
0
1 + len rest
::
type
square :: Int -> Int
square x = x * x
var
,
decl
var
pat
=
exp
III.1 Prinzipien der funktionalen Programmierung- 17 -
Auswertungsstrategie
square :: Int -> Int
square x = x * x
square (12 - 1)
square 11
(12 - 1) * (12 - 1)
11 * (12 - 1)
(12 - 1) * 11
11 * 11
121
strikte Auswertung (call-by-value), innen links
nicht-strikte Auswertg. (call-by-name), außen links
III.1 Prinzipien der funktionalen Programmierung- 18 -
Bedingte definierende Gleichungen
maxi :: (Int, Int) -> Int
maxi (x, y)
| x >= y
= x
| otherwise
var
= y
type
::
,
decl
var
pat
|
exp
=
exp
=
exp
III.1 Prinzipien der funktionalen Programmierung- 19 -
Currying
plus :: (Int, Int) -> Int
plus (x, y) = x + y
Currying
plus :: Int -> Int -> Int
plus x y = x + y
var
type
::
,
decl
var
pat
|
exp
=
exp
=
exp
III.1 Prinzipien der funktionalen Programmierung- 20 -
Pattern Matching
und :: Bool -> Bool -> Bool
und True y= y
und False y
= False
x
var
type
::
,
decl
var
pat
|
exp
=
exp
=
exp
III.1 Prinzipien der funktionalen Programmierung- 21 -
Pattern Matching
und :: Bool -> Bool -> Bool
und True y= y
und
y
= False
x
len :: [Int] -> Int
len []
= 0
len (x : xs)
= 1 + len xs
Bool = "True" | "False"
Liste = "[]" |
Element ":" Liste
III.1 Prinzipien der funktionalen Programmierung- 22 -
Lokale Deklarationen
roots :: Float -> Float -> Float -> (Float, Float)
roots a b c = ((-b - d)/e, (-b + d)/e)
where {d = sqrt (b*b - 4*a*c);
e = 2*a}
where
d = sqrt b*b - 4*a*c
e = 2*a
locdecls
{
var
decl
::
,
;
type
}
decl
var
pat
|
exp
=
exp
=
exp
where locdecls
III.1 Prinzipien der funktionalen Programmierung- 23 -
Herunterladen