Grundlagen der Programmierung 2(1.A)
Prof. Dr. Manfred Schmidt-Schauÿ
Künstliche Intelligenz und Softwaretechnologie
20. April 2006
Grundlagen der Programmierung 2:Geplanter Inhalt der ersten Halfte
Grundlagen der Programmierung 2 (1.A) - 2 -
• Programmiersprachen: Paradigmen• rekursives Programmieren in Haskell• Strome als unendliche Listen in Haskell• Operationale Semantik: Haskell• Sortieren, Suchen und Baume• Polymorphe Typen und Typklassen• Parallele Berechnungen
Bucher, Literatur, URLs
Grundlagen der Programmierung 2 (1.A) - 3 -
• http://www.cs.uni-frankfurt.de/˜prg2• www.haskell.org Haskell-Website• Manuel Chakravarty und Gabriele Keller Einfuhrung in die Pro-
grammierung mit Haskell• Richard Bird: Introduction to Functional Programming Using
Haskell
Interpreter / Compiler
Grundlagen der Programmierung 2 (1.A) - 4 -
Interpreter fuhrt ein Programm aus,(bzw. wertet ein Programm aus),Grundlage: Text des ProgrammsJeder Programmbefehl wird einzeln eingelesenund dann ausgefuhrt.
Compiler (Ubersetzer) erzeugt aus Programm einen ausfuhrbaren Modul.Programmumstellungen, OptimierungenEffekt des Programms muss gleich bleiben.
Ablaufumgebung Hier erfolgt die Ausfuhrung des Programms
Laufzeit / Compilezeit
Grundlagen der Programmierung 2 (1.A) - 5 -
Compilezeit: Zeitraum der Analyse bzw. Ubersetzung des Programmsstatische Typuberprufung, Optimierung.
Laufzeit: Zeitraum der Ausfuhrung des ProgrammsZ.B. dynamische Typuberprufung, Ein-Ausgabe.
Programmiersprachen: wesentliche Merkmale
Grundlagen der Programmierung 2 (1.A) - 6 -
Syntax
Beschreibung der Programme als Texte
Semantik
Beschreibung der Aktionen / Bedeutung eines Programms
Programmiersprachen: wesentliche Merkmale
Grundlagen der Programmierung 2 (1.A) - 7 -
imperativ
Programm ist Folge von Befehlen
sukzessive Anderung des Speicherinhalts
Ergebnis: letzter Zustand
Ein imperatives Programm sagt prazise:was (welche Anweisung),wann (Reihenfolge der Anweisungen)womit (Speicherplatz/Variable) zu geschehen hat.
prozedural: Strukturierung in (imperativen) Programmiersprachen
Prozedur = Unterprogramm
Aufruf mit Argumenten im Programm
Ziel: Ubersichtlichkeit; Wiederverwendbarkeit
Programmiersprachen: Merkmale (2)
Grundlagen der Programmierung 2 (1.A) - 8 -
funktional: Programm ist strukturiert in FunktionsdefinitionenAusdrucke = Anwendung von Funktionen auf ArgumenteBerechnung = Auswertung von AusdruckenErgebnis = Nur der Return-Wert
Varianten von funktionalen Programmiersprachen:
nicht-strikt: Argumente werden so spat wie moglich ausgewertet
strikt: Argumente werden vor Funktionsaufruf ausgewertet
pur: Objekte haben nur einen Wert, keine Mutation moglich
nicht-pur: Objekte veranderbar, Seiteneffekte moglich
deklarativ:
Idealfall: Spezifikation = deklaratives Programm
Betonung auf Logik, weniger algorithmisch
Beispiele: logische Programmierung, Prolog
Programmiersprachen: Merkmale (3)
Grundlagen der Programmierung 2 (1.A) - 9 -
objektorientiert:
Verwendung in imperativen Programmiersprachen
Strukturierung des Programm in Klassen.
Ziel: Ubersichtlichkeit, Wiederverwendung
Ausfuhrung eines Programms:
Erzeugung von Objekten
Austausch von Nachrichten zwischen Objekten
Programmiersprachen: Merkmale (4)
Grundlagen der Programmierung 2 (1.A) - 10 -
typisiert
Alle Programmiersprachen haben eine Typisierung• statische Typisierung: Programmtext• dynamische Typisierung: Ausfuhrungszeit des Programms
• schwache Typisierung:Typfehler zur Laufzeit sind moglich
• starke Typisierung:Typfehler zur Laufzeit sind nicht moglich
Beispiele fur Programmiersprachen
Grundlagen der Programmierung 2 (1.A) - 11 -
Haskell: Eine funktionale Programmiersprache
funktional, nicht-strikt, hat ein polymorphes und starkes Typsystem,
flexible Datenstrukturen,
gute Abstraktionseigenschaften,
Ziele: pures Programmieren,Auswerten von Ausdruckenrekursives Programmieren,Typsystem
Python: Eine prozedurale Programmiersprache
prozedural; schwaches, dynamisches Typsystem,
flexible Datenstrukturen, Objektorientierung.
Java
Grundlagen der Programmierung 2 (1.A) - 12 -
zentrale Idee der Objektorientierten Programmiersprachen (OOP) :
Objekt als Strukturierungskonzept.
Objekte zusammengesetzte (Daten-)Einheitbelegt Speicherplatzhaben eine Identitat.sind gekapselt. Veranderungen von Objekten werden
stets mittels der definierten Methoden durchgefuhrt.gehoren zu einer Klasse – (Instanz einer Klasse)
Kommunikation durch Senden/Empfangen von Nachrichten.
Fahrzeugbeispiel: (1)
Grundlagen der Programmierung 2 (1.A) - 13 -
class Fahrzeug {
public double Hoechstgeschwindigkeit;
private String Eigentuemer;
private static long Anzahl;
static {
Anzahl = 0;
}
public static long Anzahl() {
return Anzahl;
}
public Fahrzeug() { // Konstruktor:
Anzahl = Anzahl + 1;
}
Java: Fahrzeugbeispiel
Grundlagen der Programmierung 2 (1.A) - 14 -
public Fahrzeug(double Hoechstgeschwindigkeit,
String Eigentuemer) {
Anzahl = Anzahl +1;
this.Eigentuemer = Eigentuemer;
this.Hoechstgeschwindigkeit = Hoechstgeschwindigkeit;
}
public double Hoechstgeschwindigkeit () {
return Hoechstgeschwindigkeit ;
}
public void loesche_Fahrzeug() {
Anzahl = Anzahl - 1;
}
public String Eigentuemer () {
return Eigentuemer;
}
}
Java: Fahrzeugbeispiel
Grundlagen der Programmierung 2 (1.A) - 15 -
Java: Fahrzeugbeispiel
Grundlagen der Programmierung 2 (1.A) - 16 -
class Auto extends Fahrzeug {
public String Autokennzeichen;
public Auto(double Hoechstgeschwindigkeit,
String Eigentuemer, String kennzeichen) {
super(Hoechstgeschwindigkeit, Eigentuemer);
this.Hoechstgeschwindigkeit = Hoechstgeschwindigkeit;
this.Autokennzeichen = kennzeichen;
}
}
OO: Klassen
Grundlagen der Programmierung 2 (1.A) - 17 -
Klassen entsprechen Typschablonen• werden in der OO-Programmiersprache definiert.• enthalten die Definition der Struktur der zugehorigen
Objekte und der Methoden, die auf Objekte dieser Klasse anwendbarsind.
• entsprechen einer Menge von Objekten mit gleichem Verhalten.• i.a. eine Realisierung eines abstrakten Datentyps• entsprechen einem Typ zur Compilezeit• sind in einer (Baum-)Hierarchie angeordnet (Ober- ; Unterklasse)• Die Klassenhierarchie wird verwendet, um allgemeine Aspekte von
Objekten in einer Oberklasse zu definieren und zu implementieren,und dann in Unterklassen die spezielleren Eigenschaften zu imple-mentieren.
• Elementare Datentypen (Zahlen, . . . ) sind keine Objekte• konnen zu Objekten gemacht werden, falls notig• Vereinfachte Handhabung in Java 5
Vergleich mit Haskell
Grundlagen der Programmierung 2 (1.A) - 18 -
Java | HaskellKlasse entspricht Typ bzw. einer TypklasseMethode entspricht Funktion (bzw. Prozedur)Objekt entspricht konstruiertem Datenobjekt.Senden von Nachrichten entspricht Funktionsaufruf
Seiteneffekte | Nur Kopieren moglichAliasing | unproblematisch: keine Seiteneffekte
Objekte und Methoden: Genauer
Grundlagen der Programmierung 2 (1.A) - 19 -
Objekt besteht aus Daten; bzw. Attributendas Innere eines Objektes ist nicht direkt sichtbar.Attribute sind nur uber erlaubte Methodenaufrufe anderbardas Innere des Objektes (seine Attribute) sichtbar und
anderbar.gehoren zu einer Klasse: ( Instanz einer Klasse)
Objekt analog zu einem Record, bei dem die einzelnen Attribute
mit Attributnamen ansprechbar sind.
Satz (Verbund) in einer Datenbank, bestehend aus At-
tributen.
n-Tupel in Haskell mit Attributnamen
Methoden
Grundlagen der Programmierung 2 (1.A) - 20 -
Methoden: auf Objekten ausfuhrbare Operationen,
analog zu Prozeduren.
Methodenaufruf: Senden einer Nachricht
Methode kann per Dot-Notation an ein Objekt gekoppelt
sein
bzw. wird auf ein Objekt angewendet.
Nachrichten: Argumente der Prozedur.
Spezifische Aufgaben von Methoden:
Grundlagen der Programmierung 2 (1.A) - 21 -
Konstruktion: Erzeugen und Initialisieren eines Objekts
Destruktion: Abschlussarbeiten und Loschen eines Objekts
Selektion: Lesen von internen Daten des Objekts
Modifikation: Andern der internen Daten des Objekts
Andere Verarbeitung allgemeine Prozedur
Logische Programmierung
Grundlagen der Programmierung 2 (1.A) - 22 -
Grundlegende Idee: Verwendung der Pradikatenlogik
Genauer: HornlogikProgramm besteht nur aus Formeln∀x1, . . . xn.A1 ∧ . . . ∧An ⇒ B(Hornklauseln)Schreibweise: B : −A1, . . . An
Logische Programmierung: Programm-ausfuhrung
Grundlagen der Programmierung 2 (1.A) - 23 -
Ausfuhrung = Beantwortung von Anfragen an das Programm
Anfrage ist eine Formel: ∃y1, . . . ym.C1 ∧ . . . ∧ Cm
entspricht einer negativen Hornklausel
Antwort die moglichen Tupel y1, . . . ym
bzw Ja / Nein
Ausfuhrung: Schlussfolgern
Logische Programmierung: Beispiel
Grundlagen der Programmierung 2 (1.A) - 24 -
vater(peter,maria).
mutter(susanne,maria).
vater(peter,monika).
frau(maria).
frau(susanne).
frau(monika).
mann(peter).
eltern(X,Y) :- vater(X,Y).
eltern(X,Y) :- mutter(X,Y).
Anfrage: eltern(peter,maria)?
Antwort: Ja
Anfrage: eltern(peter,X)?
Antwort 1: X = mariaAntwort 2: X = monika
Haskell
Grundlagen der Programmierung 2 (1.A) - 25 -
rekursive Programmierung
mit der streng typisierten,
funktionalen Programmiersprache
Haskell
Haskell
Grundlagen der Programmierung 2 (1.A) - 26 -
Wichtige Eigenschaften funktionaler Programmiersprachen
Referentielle TransparenzGleiche Funktion, gleiche Argumente =⇒ gleicher (Ruckgabe-)WertKeine Seiteneffekte! D.h. keine Anderung von Objekten
Verzogerte AuswertungNur die fur das Resultat notwendigen Unterausdrucke werden(so spat wie moglich) ausgewertet.
Polymorphes TypsystemNur Ausdrucke mit Typ sind erlaubt — es gibt Typvariablen.Das Typsystem garantiert: keine dynamischen Typfehler.
Automatische SpeicherverwaltungAnforderung und Freigabe von Speicher
Funktionen sind Datenobjektemogliche Verwendung: in Datenobjekten, als Argument, als Resultat.
Programmierung in Haskell
Grundlagen der Programmierung 2 (1.A) - 27 -
Interpreter Hugs 98 und GHCi
Grundprinzipien:
• Definition von Funktionenquadrat x = x*x
• Aufbau von Ausdrucken:Anwendung der Funktion auf Argumente,die wieder Ausdrucke sein konnen.3*(quadrat 5)
• Nur der Wert von Ausdrucken wird bei derAuswertung zuruckgegeben.
75
Umgang mit dem Interpreter
Grundlagen der Programmierung 2 (1.A) - 28 -
Aufruf: ghci (im richtigen Fenster)Online-Report http://www.haskell.org/onlinereport
>:h Hilfe>:t Ausdruck druckt den Typ des Ausdrucks>:set +t ... Optionen andern
Module im Interpreter verwenden:
:m +Char +Numeric ...
Einfache Daten und Operatoren
Grundlagen der Programmierung 2 (1.A) - 29 -
• ganze Zahlen Typ Int
mit |n| ≤ 231 − 1 = 2147483647• beliebig lange ganze Zahlen (vom Typ Integer),• rationale Zahlen 3%7 (Rational)• Gleitkommazahlen 3.456e+10 (Float)• Zeichen ’a’ Char
• Datenkonstruktoren True, False; Typ Bool
• Arithmetische Operatoren: +,−, ∗, /,• Arithmetische Vergleiche: ==, <=, < . . .• Logische Operatoren: &&, ||, not
Beispiel
Grundlagen der Programmierung 2 (1.A) - 30 -
Definition eines Polynoms x2 + y2:
quadratsumme x y = quadrat x + quadrat y
Auswertung:
...
Main> quadratsumme 3 4
25
Typen in Haskell
Grundlagen der Programmierung 2 (1.A) - 31 -
Typ Konstanten, FunktionenInt 1,2,3,4,. . .Integer 1,2,3,4,. . .Float 1.23e45Double 1.23e45Integer -> Integer -> Integer (+)Integer -> Integer quadrat
Integer -> Integer -> Integer quadratsumme
Typen in Haskell
Grundlagen der Programmierung 2 (1.A) - 32 -
Beispiel
Die Ausgabe des Interpreters fur die Addition (+) ist komplizierter:
(+) :: forall a. (Num a) => a -> a -> a
D.h.: Fur 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
(vereinfachte) Haskell-Syntax
Grundlagen der Programmierung 2 (1.A) - 33 -
〈FunktionsDefinition〉 ::= 〈Funktionsname〉〈Parameter〉∗ = 〈Ausdruck〉〈Ausdruck〉 ::= 〈Bezeichner〉 | 〈Zahl〉
| (〈Ausdruck〉 〈Ausdruck〉)| (〈Ausdruck〉)| (〈Ausdruck〉〈BinInfixOp〉 〈Ausdruck〉)
〈Bezeichner〉 ::= 〈Funktionsname〉 | 〈Datenkonstruktorname〉| 〈Parameter〉 | 〈BinInfixOp〉
〈BinInfixOp〉 ::= ∗ | + | − | /
Argumente einer Funktion: formale Parameter.Anzahl der Argumente: Stelligkeit der Funktion: (ar(f))
Beispiel zur Grammatik
Grundlagen der Programmierung 2 (1.A) - 34 -
quadratsumme x y = (quadrat x) + (quadrat y)
quadratsumme Funktionsnamex,y formale Parameter= gleiches Zeichen wie in Grammatik(quadrat x) + (quadrat y) 〈Ausdruck〉 der Form 〈Ausdruck〉+ 〈Ausdruck〉+ binarer Infix-Operatorquadrat x Anwendung: quadrat ist ein Ausdruck
und x ist ein Ausdruck
Haskell: Verschiedenes . . .
Grundlagen der Programmierung 2 (1.A) - 35 -
Prelude: vordefinierte Funktionen, Typen und Datenkonstruktoren
Prafix, Infix, Prioritaten ist moglich fur Operatoren
Konventionen zur Klammerung: s1 s2 . . . sn ≡ ((. . . (s1 s2) s3 . . .) sn)
Kontextbedingungen in Funktionsdefinitionen:
formale Parameter mussen verschiedenen sein;
Keine undefinierten Variablen im Rumpf!
Weitere Trennzeichen: “{“,“}“ Semikolon “; “
Layout-sensibel: bewirkt Klammerung mit {, }.
Fallunterscheidung
Grundlagen der Programmierung 2 (1.A) - 36 -
Syntax: if 〈Ausdruck〉 then 〈Ausdruck〉 else 〈Ausdruck〉
”if“,
”then“,
”else“ sind reservierte (Schlusselworte)
und durfen nicht als Funktionsnamen bzw. Parameternamen verwendet
werden.
Der erste Ausdruck ist eine Bedingung. Diese muss Typ Bool haben.
Typisierung: if Bool . . . then typ else typ
(if 1 then 1 else 2) ergibt einen Fehler
Bedingungen, Arithmetische Vergleiche
Grundlagen der Programmierung 2 (1.A) - 37 -
Die Infixoperatoren ==, <, >, <=, >=, /= haben den Typ:
Integer -> Integer -> Bool
Achtung: = ist reserviert fur Funktionsdefinitionen, und let
Boolesche Ausdrucke
sind kombinierbar mit not, ||, && (nicht, oder, und)
Konstanten sind True, False.
Eine kompliziertere Bedingung: 3.0 <= x && x < 5.0
Darstellungen eines Programms
Grundlagen der Programmierung 2 (1.A) - 38 -
Benutzer-Syntax: vom Programmierer benutzt
Interne Syntax: “Linearisierung“; entzuckerte Version;
voll geklammert; alle Operatoren sind Prafix; kein Layout
Ableitungsbaum (Herleitungsbaum): Vom Kompiler erzeugt
Syntaxbaum: Eindeutige Darstellung des Programms in einem mar-
kierten Baum.
Hierauf lasst sich eindeutig die Ausfuhrung des Programms definie-
ren.
Syntaxbaum: Beispiele
Grundlagen der Programmierung 2 (1.A) - 39 -
if x <= 0 then 1 else x*(quadrat (x-1))
ifThenElse
ttiiiiiiiiiiiiiiiiiiii
��,,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
<=
||yyyy
yyyy
y
""FFFF
FFFF
F 1 ∗wwoooooooooooooooo
��x 0 x app
wwppppppppppp
��
quadrat −
wwppppppppppppppp
��
x 1
Syntaxbaum: Beispiele
Grundlagen der Programmierung 2 (1.A) - 40 -
Zwei Syntaxbaume zu 1*2:
∗����
����
��
��>>>
>>>>
> app
yyttttttttt
""FFFF
FFFF
F
1 2 app
||yyyy
yyyy
y
%%JJJJJJJJJJJ 2
∗ 1
Aufrufhierarchie und Rekursive Definitionen
Grundlagen der Programmierung 2 (1.A) - 41 -
f, g, fi seien Haskell-definierte Funktionen.
f referenziert g direkt, wenn g im Rumpf von f vorkommt.f referenziert g (indirekt), wenn es Funktionen f1, . . . , fn gibt,
so dass gilt: f referenziert direkt f1,f1 referenziert direkt f2, . . . ,fn referenziert direkt g.
f ist direkt rekursiv, wenn f sich selbst direkt referenziert.f ist rekursiv, wenn f sich selbst (indirekt) referenziert.Verschrankte Rekursion: wenn f die Funktion g referenziert
und g die Funktion fauch fur allgemeinere Falle
Beispiel: Aufrufhierarchie
Grundlagen der Programmierung 2 (1.A) - 42 -
quadrat x = x*x
quadratsumme x y = (quadrat x) + (quadrat y)
quadratsumme ruft direkt die Funktion quadrat auf,
quadratsumme ruft direkt die (eingebaute) Funktion ∗ auf
Die Funktion quadratsumme ist somit nicht rekursiv
Top Related