konzepte der programmiersprachen ss 2004 dipl.-inf. christoph
TRANSCRIPT
![Page 1: Konzepte der Programmiersprachen SS 2004 Dipl.-Inf. Christoph](https://reader035.vdocuments.site/reader035/viewer/2022062404/55204d6149795902118b50d4/html5/thumbnails/1.jpg)
Konzepte der Programmiersprachen SS 2004http://www.st.informatik.tu-darmstadt.de/static/pages/lectures/pl/ss04/assignments/index.html
Dipl.-Inf. Christoph [email protected]
Darmstadt University of Technology
Übung
Einführung in Objective Caml
![Page 2: Konzepte der Programmiersprachen SS 2004 Dipl.-Inf. Christoph](https://reader035.vdocuments.site/reader035/viewer/2022062404/55204d6149795902118b50d4/html5/thumbnails/2.jpg)
PL SS04 Übung Christoph Bockisch
2
Übersicht
• ML: Meta-Language– Funktionale Programmiersprache– Automatische Speicherverwaltung– Statische Typsicherheit– (Fast) keine Seiteneffekte– Pattern-Matching– …
• Caml: Categorical Abstract Machine Language– Gehört zur Sprachfamilie ML– Basiert auf der Categorical Abstract Machine
(CAM)– Entwickelt seit 1987 am INRIA Institut, Frankreich
• Objective Caml (O‘Caml) seit 1996– Objekt-orientierte Features
![Page 3: Konzepte der Programmiersprachen SS 2004 Dipl.-Inf. Christoph](https://reader035.vdocuments.site/reader035/viewer/2022062404/55204d6149795902118b50d4/html5/thumbnails/3.jpg)
PL SS04 Übung Christoph Bockisch
3
Programmieren in O‘Caml
• O‘Caml System– Zum Ausprobieren– Read-Evaluate-Print– Toplevel mit „ocaml“ aus Kommandozeile
starten– Oder O‘Caml Windows– „Mysteriöse Fehler“ bei Copy & Paste
wegen falscher Zeilenumbrüche
• O‘Caml Compiler– Programm mit Editor schreiben– Endung .ml– Compiler „ocamlc“ aufrufen– Programm „camlprog“ ausführen
![Page 4: Konzepte der Programmiersprachen SS 2004 Dipl.-Inf. Christoph](https://reader035.vdocuments.site/reader035/viewer/2022062404/55204d6149795902118b50d4/html5/thumbnails/4.jpg)
PL SS04 Übung Christoph Bockisch
4
O‘Caml Programmiersprache
• Kommentare eingeschlossen von (* und *)– Kommentare können verschachtelt sein
• Bezeichner bestehen aus Zahlen, Buchstaben und _– Beginnen mit einem Kleinbuchstaben– O‘Caml ist case-sensitiv
• Mit let können Konstanten definiert werden
• Funktionen sind Werte!• Ein Ausdruck wird mit ;; beendet
![Page 5: Konzepte der Programmiersprachen SS 2004 Dipl.-Inf. Christoph](https://reader035.vdocuments.site/reader035/viewer/2022062404/55204d6149795902118b50d4/html5/thumbnails/5.jpg)
PL SS04 Übung Christoph Bockisch
5
Erste Gehversuche(O‘Caml System)
# 1 + 1 ;;- : int = 2
Eingabe
Name
Typ
Wert
# let five = 5 ;;val five : int = 5 Ein benannter
Wert
# let succ n = n + 1 ;;val succ : int -> int = <fun>
# succ five ;;- : int = 6
Funktionstyp
Funktion als Wert
![Page 6: Konzepte der Programmiersprachen SS 2004 Dipl.-Inf. Christoph](https://reader035.vdocuments.site/reader035/viewer/2022062404/55204d6149795902118b50d4/html5/thumbnails/6.jpg)
PL SS04 Übung Christoph Bockisch
6
Erste Gehversuche(O‘Caml Compiler)
• Programm in Datei mit Endung .ml• Nur Definitionen sichtbar, die weiter oben
stehen• Sequenz von Ausrücken:expr1; … ; exprn
– Wertet alle Ausdrücke der Reihenfolge nach aus
– Hat den Wert des letzten Ausdrucks– expr1 bis exprn-1 sollten Typ unit haben
– ; nur zwischen zwei Ausdrücken (nicht danach)
• ;; beendet Ausdruck– Nur benötigt, wenn von Compiler nicht
feststellbar
![Page 7: Konzepte der Programmiersprachen SS 2004 Dipl.-Inf. Christoph](https://reader035.vdocuments.site/reader035/viewer/2022062404/55204d6149795902118b50d4/html5/thumbnails/7.jpg)
PL SS04 Übung Christoph Bockisch
7
Erste Gehversuche(O‘Caml Compiler)
let succ n = n + 1
let rec add (a, b) = if a = 0 then b else succ (add (a - 1, b));;
print_string "5 + 6 = ";print_int (add (5, 6)) Sequenz
Compiler erkennt neuen Ausdruck
wegen let
Compiler erkennt neuen Ausdruck
nicht selbst
Compiler erkennt neuen Ausdruck wegen
Dateiende
![Page 8: Konzepte der Programmiersprachen SS 2004 Dipl.-Inf. Christoph](https://reader035.vdocuments.site/reader035/viewer/2022062404/55204d6149795902118b50d4/html5/thumbnails/8.jpg)
PL SS04 Übung Christoph Bockisch
8
Primitive Typen
• int0, 5, 42, -17, 0x00FF– Negative ints müssen (oft) eingeklammert
werden: (-1)• float0.0, -5.3, 1.7e14, 1e-10– Dürfen nicht mit . anfangen
• booltrue, false
• string"", "One\nTwo\nThree"
• char'a', '\n'
![Page 9: Konzepte der Programmiersprachen SS 2004 Dipl.-Inf. Christoph](https://reader035.vdocuments.site/reader035/viewer/2022062404/55204d6149795902118b50d4/html5/thumbnails/9.jpg)
PL SS04 Übung Christoph Bockisch
9
Operatoren
• Arithmetische operatoren für ints:+ - * /
• Arithmetische operatoren für floats:+. -. *. /.
• Es gibt keine implizite Typkonvertierung– float_of_int– int_of_char– int_of_string (konvertiert "10" zu 10)– …
• Vergleichoperatoren für Primitive:< <= = <> >= >
• Boole’sche Operatoren (shortcut Evaluierung):&& || not
![Page 10: Konzepte der Programmiersprachen SS 2004 Dipl.-Inf. Christoph](https://reader035.vdocuments.site/reader035/viewer/2022062404/55204d6149795902118b50d4/html5/thumbnails/10.jpg)
PL SS04 Übung Christoph Bockisch
10
Operationen für string / char
• Konkatenation:^
• Das Modul String enthält weitere Funktionen zur Behandlung von strings– String.length s– String.index s c– String.sub s p n– String.uppercase s– String.capitalize s
![Page 11: Konzepte der Programmiersprachen SS 2004 Dipl.-Inf. Christoph](https://reader035.vdocuments.site/reader035/viewer/2022062404/55204d6149795902118b50d4/html5/thumbnails/11.jpg)
PL SS04 Übung Christoph Bockisch
11
Listentypen
• In [ ] eingeschlossen• Einzelne Elemente durch ; getrennt• Alle Elemente müssen denselben Typ
haben• Leere Liste:[]
• Beispiele:– int list– float list– 'a list (wenn der Elementtyp unbekannt
ist)
![Page 12: Konzepte der Programmiersprachen SS 2004 Dipl.-Inf. Christoph](https://reader035.vdocuments.site/reader035/viewer/2022062404/55204d6149795902118b50d4/html5/thumbnails/12.jpg)
PL SS04 Übung Christoph Bockisch
12
Operationen für Listen
• Element vorne an Liste anfügen:::
• Zwei Listen verbinden:@
• Das Modul List enthält weiter Funktionen– List.hd l– List.tl l– List.length l– List.nth l n
![Page 13: Konzepte der Programmiersprachen SS 2004 Dipl.-Inf. Christoph](https://reader035.vdocuments.site/reader035/viewer/2022062404/55204d6149795902118b50d4/html5/thumbnails/13.jpg)
PL SS04 Übung Christoph Bockisch
13
Tupeltypen
• Durch ( ) eingeschlossen• Die Elemente durch , getrennt• Elemente können verschiedene Typen
haben• Anzahl der Elemente fest• Beispiele:
– (int * int)– (string * float * int list)
• Spezialfall Paare (pair)– Funktionen fst und snd zum Zugriff auf erstes /
zweites Element
• Weitere Funktionen durch Pattern-Matching• Leeres Tupel: () oder unit
![Page 14: Konzepte der Programmiersprachen SS 2004 Dipl.-Inf. Christoph](https://reader035.vdocuments.site/reader035/viewer/2022062404/55204d6149795902118b50d4/html5/thumbnails/14.jpg)
PL SS04 Übung Christoph Bockisch
14
Recordtypen
• Definition:type {name1:typ1;…;namen:typn}
• Erzeugung von Records:let const={name1=val1;…;namen=valn}
• Zugriff auf Records:const.name1
• Allgemein:expression.name
![Page 15: Konzepte der Programmiersprachen SS 2004 Dipl.-Inf. Christoph](https://reader035.vdocuments.site/reader035/viewer/2022062404/55204d6149795902118b50d4/html5/thumbnails/15.jpg)
PL SS04 Übung Christoph Bockisch
15
Parametrisierte Typen
• Definition:type ('a1 … 'an) name = typedef
• Beliebige Anzahl von Typvariablen als Tupel• Typvariablen fangen mit ' an• Ansonsten wie andere Bezeichner• Typvariablen können in Typdefinition
verwendet werden• Beipiele:
– type 'param paired_with_int=int*'param;;– 'a list
![Page 16: Konzepte der Programmiersprachen SS 2004 Dipl.-Inf. Christoph](https://reader035.vdocuments.site/reader035/viewer/2022062404/55204d6149795902118b50d4/html5/thumbnails/16.jpg)
PL SS04 Übung Christoph Bockisch
16
if … then … else Ausdruck
• Schreibweise:if boolean-expression then expression1 else expression2
• Else-Teil wird benötigt, damit der Ausdruck immer einen Wert hat
• Then- und Else-Teil müssen denselben Typ haben
• Then-Teil wird nur ausgewertet, wenn die Bedingung true ist (umgekehrt für Else-Teil)
![Page 17: Konzepte der Programmiersprachen SS 2004 Dipl.-Inf. Christoph](https://reader035.vdocuments.site/reader035/viewer/2022062404/55204d6149795902118b50d4/html5/thumbnails/17.jpg)
PL SS04 Übung Christoph Bockisch
17
Definition von Funktionen
• Übernehmen ein Argument• Geben einen Wert zurück• Argument und Rückgabewert
– Können Tupel sein (mehrere Werte)– Können unit sein (kein Wert)
• Mit let rec werden rekursive Funktionen definiert
• and verknüpft let Definitionen– Können sich gegenseitig sehen
• Auswerten einer Funktion:function_name argument
![Page 18: Konzepte der Programmiersprachen SS 2004 Dipl.-Inf. Christoph](https://reader035.vdocuments.site/reader035/viewer/2022062404/55204d6149795902118b50d4/html5/thumbnails/18.jpg)
PL SS04 Übung Christoph Bockisch
18
let / let rec / and
let factorial n = if n = 0 then 1 else n*(factorial n–1);;
let rec factorial n = if n = 0 then 1 else n*(factorial n–1)
let ping n = if n > 0 then pong n–1; else ()
let pong n = if n > 0 then ping n–1; else ();;
let rec ping n = if n > 0 then pong (n - 1) else ()and pong n = if n > 0 then ping (n - 1) else ();;
![Page 19: Konzepte der Programmiersprachen SS 2004 Dipl.-Inf. Christoph](https://reader035.vdocuments.site/reader035/viewer/2022062404/55204d6149795902118b50d4/html5/thumbnails/19.jpg)
PL SS04 Übung Christoph Bockisch
19
Anonyme Funktionen
• Definition:(fun argument -> expression)
![Page 20: Konzepte der Programmiersprachen SS 2004 Dipl.-Inf. Christoph](https://reader035.vdocuments.site/reader035/viewer/2022062404/55204d6149795902118b50d4/html5/thumbnails/20.jpg)
PL SS04 Übung Christoph Bockisch
20
match
• match Ausdruck:match expr with pattern1 -> expr1
| …| patternn -> exprn
• Die Ausdrücke expr1 bis exprn müssen denselben Typ haben
• Die Patterns sollten alle möglichen Fälle abdecken– Sonst Warung vom Compiler
• Die Patterns werden in angegebener Reihenfolge getestet
![Page 21: Konzepte der Programmiersprachen SS 2004 Dipl.-Inf. Christoph](https://reader035.vdocuments.site/reader035/viewer/2022062404/55204d6149795902118b50d4/html5/thumbnails/21.jpg)
PL SS04 Übung Christoph Bockisch
21
Generalized Assignment
# let (a, b, c) = (8, 3, 6);;
val a : int = 8
val b : int = 3
val c : int = 6
# let (x::xs) = [1;2;3;4];;
(* Non-exhaustive match warning deleted *)
val x : int = 1
val xs : int list = [2; 3; 4]
![Page 22: Konzepte der Programmiersprachen SS 2004 Dipl.-Inf. Christoph](https://reader035.vdocuments.site/reader035/viewer/2022062404/55204d6149795902118b50d4/html5/thumbnails/22.jpg)
PL SS04 Übung Christoph Bockisch
22
Pattern-Matching
• Generalized Assignment auch in Patterns
• Das Pattern (x :: xs) entspricht einer nicht leeren Liste
# let rec listSize the_list =
match the_list with
[] -> 0
| (x::xs) -> 1 + listSize xs;;
![Page 23: Konzepte der Programmiersprachen SS 2004 Dipl.-Inf. Christoph](https://reader035.vdocuments.site/reader035/viewer/2022062404/55204d6149795902118b50d4/html5/thumbnails/23.jpg)
PL SS04 Übung Christoph Bockisch
23
Higher-Order Funktionen
• Eine First-Order Funktion ist eine Funktion, deren Argument und Wert “Daten” sind
• Bei einer Second-Order Funktion ist Argument oder Wert eine First-Order Funktion
• Eine Higher-Order Funktion hat beliebige Funktionen als Argument oder Wert
• O’Caml unterstützt Higher-Order Funktionen
![Page 24: Konzepte der Programmiersprachen SS 2004 Dipl.-Inf. Christoph](https://reader035.vdocuments.site/reader035/viewer/2022062404/55204d6149795902118b50d4/html5/thumbnails/24.jpg)
PL SS04 Übung Christoph Bockisch
24
Typinferenz
• Der O‘Caml Compiler kann an Funktionsdefinitionen erkennen, welchen Typ Argument und Ergebnis haben
• Wenn der Typ nicht bestimmbar ist, wird Typvariable eingesetzt– Die Funktion heißt dann „polymorph“– Nicht zu verwechseln mit Polymorphie bei
OO Sprachen
![Page 25: Konzepte der Programmiersprachen SS 2004 Dipl.-Inf. Christoph](https://reader035.vdocuments.site/reader035/viewer/2022062404/55204d6149795902118b50d4/html5/thumbnails/25.jpg)
PL SS04 Übung Christoph Bockisch
25
Typinferenz
# let add (a, b) = a + b;;val add : int * int -> int = <fun>
Integeraddition: Operanden und Ergebnis müssen ints
sein
# let rec reverse the_list = match the_list with [] -> [] | h :: t -> reverse t @ [h];;val reverse : 'a list -> 'a list = <fun>
Listenoperationen: Operanden und Ergebnis müssen Listen
sein
Elementtypen sind gleich
![Page 26: Konzepte der Programmiersprachen SS 2004 Dipl.-Inf. Christoph](https://reader035.vdocuments.site/reader035/viewer/2022062404/55204d6149795902118b50d4/html5/thumbnails/26.jpg)
PL SS04 Übung Christoph Bockisch
26
Ein- / Ausgabe
• Funktionen, die auf die Konsole schreiben– print_int arg– print_string arg– …– print_newline ()
• Funktionen, die von Tastatur lesen– read_line
Hat einen string als Rückgabewert
• Modul Printf
# print_newline () ;;
- : unit = ()
Erwartet Wert von Typ unit. Nur unit
selbst hat den Wert.
![Page 27: Konzepte der Programmiersprachen SS 2004 Dipl.-Inf. Christoph](https://reader035.vdocuments.site/reader035/viewer/2022062404/55204d6149795902118b50d4/html5/thumbnails/27.jpg)
PL SS04 Übung Christoph Bockisch
27
Referenzen
• Objective Caml Homepage: http://www.ocaml.org/
• Komplette Dokumentation und Referenz: „Developing Applications with Objective Caml“, E. Chailloux, P. Manoury, B. Pagano, O’Reilly:http://caml.inria.fr/oreilly-book/html/
• Kurze Einführung und Zusammenfassung: „A Concise Introduction to Objective Caml“, D. Matuszek: http://www.csc.vill.edu/~dmatusze/resources/ocaml/ocaml.html
• Tutorial: „A C++/Java Programmer’s introduction to Objective Caml“, S. Houben: http://caml.inria.fr/FAQ/stephan.html
• Geschichte von Caml: http://www.pps.jussieu.fr/~cousinea/Caml/caml_history.html
![Page 28: Konzepte der Programmiersprachen SS 2004 Dipl.-Inf. Christoph](https://reader035.vdocuments.site/reader035/viewer/2022062404/55204d6149795902118b50d4/html5/thumbnails/28.jpg)
PL SS04 Übung Christoph Bockisch
28
Übung 1
• Aufgabe 1 (Bearbeitung bis 30.4.):– O‘Caml Dokumentation lesen– Übungsaufgaben daraus bearbeiten– Können Sie Muster formulieren, wie
bestimmte Problemstellungen gelöst werden?
– Oder Coding-Styles?
![Page 29: Konzepte der Programmiersprachen SS 2004 Dipl.-Inf. Christoph](https://reader035.vdocuments.site/reader035/viewer/2022062404/55204d6149795902118b50d4/html5/thumbnails/29.jpg)
PL SS04 Übung Christoph Bockisch
29
Übung 1
• Aufgabe 2 (Bearbeitung bis 30.4.):– O‘Caml wertet Ausdrücke „eager“ aus:
– Das Gegenteil ist eine „lazy“ Auswertung:
– Beweisen Sie dass O‘Caml eager auswertet– Verwenden Sie nach Möglichkeit keine
Seiteneffekte
let mult (x, y) = x * y;;mult (1 + 2, 3 + 4) mult (3, 3 + 4) mult (3, 7) 3 * 7 21
mult (1 + 2, 3 + 4) (1 + 2) * (3 + 4) 3 * (3 + 4) 3 * 7 21
![Page 30: Konzepte der Programmiersprachen SS 2004 Dipl.-Inf. Christoph](https://reader035.vdocuments.site/reader035/viewer/2022062404/55204d6149795902118b50d4/html5/thumbnails/30.jpg)
PL SS04 Übung Christoph Bockisch
30
Übung 1
• Aufgabe 2.a)– Wie kann „lazy“ Auswertung dennoch
erzwungen werden?– Benutzen Sie nicht das Schlüsselwort lazy
und Modul Lazy– Funktion und Argument dürfen angepasst
werden– Bonusaufgabe: Ein Bonus-Prozentpunkt
für• Korrekte Bearbeitung• Kurze (5 – 10 Min.) Präsentation• Eingereicht bis 29.4.• An [email protected]
![Page 31: Konzepte der Programmiersprachen SS 2004 Dipl.-Inf. Christoph](https://reader035.vdocuments.site/reader035/viewer/2022062404/55204d6149795902118b50d4/html5/thumbnails/31.jpg)
PL SS04 Übung Christoph Bockisch
31
Übung 1
• Aufgabe 3 (Bearbeitung bis 30.4.):– Gegeben sind Funktionsdefinitionen– Bestimmen Sie den Typ der Funktionen– Bestimmen Sie, welche Funktionen partiell
sind– Geben Sie für partielle Funktionen ein
Beispiel an, das nicht akzeptiert wird.
![Page 32: Konzepte der Programmiersprachen SS 2004 Dipl.-Inf. Christoph](https://reader035.vdocuments.site/reader035/viewer/2022062404/55204d6149795902118b50d4/html5/thumbnails/32.jpg)
PL SS04 Übung Christoph Bockisch
32
Übung 1
• Aufgabe 4 (Bearbeitung bis 7.5.):– Programmieren Sie ein Mancala Spiel
S1F0
S1F1
S1F2
S1F3
S1F4
S1F5
S1G
S2G
S2F5
S2F4
S2F3
S2F2
S2F1
S2F0
![Page 33: Konzepte der Programmiersprachen SS 2004 Dipl.-Inf. Christoph](https://reader035.vdocuments.site/reader035/viewer/2022062404/55204d6149795902118b50d4/html5/thumbnails/33.jpg)
PL SS04 Übung Christoph Bockisch
33
Übung 1
• Aufgabe 4, Zusatzaufgabe:– Intelligenter Computerspieler– Implementierung des Negamax-
Algorithmus vorgegeben
![Page 34: Konzepte der Programmiersprachen SS 2004 Dipl.-Inf. Christoph](https://reader035.vdocuments.site/reader035/viewer/2022062404/55204d6149795902118b50d4/html5/thumbnails/34.jpg)
PL SS04 Übung Christoph Bockisch
34
Übung 1
• Das Übungsblatt mit weiteren Quellen und weitere Materialien können heruntergeladen werden:
http://www.st.informatik.tu-darmstadt.de/static/pages/lectures/pl/ss04/assignments/
index.html