Theorie und Implementation objektorientierter Programmiersprachen

Zeitplan

Datum Vorlesung oder Übung Folien/Skript Buch [Pierce]
Di16.04.VL 1Einführungoverview.pdf1, 18.1
Mo22.04.Ü 1Wiederholung: JAVA   
Di23.04.VL 2Ungetypte arithmetische Ausdrücke arith.ps.gz 3
Mo29.04.Ü 2Besprechung Blatt 1   
Di30.04.VL 3Algebraische Datentypen in JAVA arith-1.java arith-2.java 
Mo06.05.Ü 3Parsen   
Di07.05.VL 4Getypte arithmetische AusdrückeTypes.ps.gz Arith.hs8
Mo13.05.Ü 4Besprechung Blatt 3  
Di14.05.VL 5Ungetypter Lambda-Kalkül ILambda.ps.gz5
Mo20.05.Ü 5entfälltPfingsten 
Di21.05.VL 6Ungetypter Lambda-Kalkül IIlambda.ps.gz 5
Mo27.05.Ü 6de Bruijn Repräsentation deBruijn.pdf (Cyril)6
Di28.05.VL 7entfällt (statt 21.05.)   
Mo03.06.Ü 7Small-step Semantik für Lambda-Kalkül  
Di04.06.VL 8Einfach getypter Lambda-Kalkül I Getypter-Lambda-Kalkuel.pdf (Cyril)9
Mo10.06.Ü 8Besprechung Blatt 6   
Di11.06.VL 9Einfach getypter Lambda-Kalkül II  9, 11
Mo17.06.Ü 9Einführung und Beseitigung  9.4
Di18.06.VL 10Erweiterungen des Einfach Getypten Lambda-Kalküls extensions.ps.gz11
Mo24.06.Ü 10Typerhaltung und Fortschritt für fix (Rekursion) infer.java 
Di25.06.VL 11Referenzen  13
Mo01.07.Ü 11Besprechung Blatt 8  
Di02.07.VL 12Untertypen subtyping.ps.gz15
Mo08.07.Ü 12Besprechung Blatt 9  
Di09.07.VL 13Objekt-orientierte ProgrammierungOOProgramming.pdf (Cyril)18
Mo15.07.Ü 13Verbesserung Blatt 10sol10.sml 
Di16.07.VL 14Featherweight JavaFolien19


Vorlesung 1: Einführung

Die Geschichte und wesentliche Konzepte der objekt-orientierten Programmierung werden kurz wiederholt. Sicherheitskonzepte wie Datenkapselung und Subtyping werden durch Typsysteme realisiert, die wir grob definieren und in statische und dynamische Systeme einteilen. Anhand von drei Beispielen, die Schwächen von JAVA's Typsystem aufzeigen, betonen wir die Schwierigkeit, intuitive und korrekte Typsysteme zu entwerfen. Die Spezifikation und Implementierung von Typsystemen für objekt-orientierte Programmiersprachen wird den Schwerpunkt der Vorlesung darstellen.

Material:

Nach oben.


Vorlesung 2: Ungetypte arithmetische Ausdrücke

Anhand einer rudimentären Teilsprache der Ausdrücke von JAVA führen wir folgende Begriffe ein:

  • Externe Syntax
  • Interne Syntax, als Grammatik oder induktiv definierte Menge
  • Inferenzregeln
  • Strukturelle Induktion und strukturelle Rekursion
  • Operationale Semantik (small-step)
  • Normalformen und Werte

Material:

Nach oben.


Vorlesung 3: Algebraische Datentypen in JAVA

Zuerst beweisen wir ausführlich, dass die in Vorlesung 2 vorgestellte Einzelschritt-Semantik deterministisch ist. Dieser Beweis dient als Modell für Beweise über induktiv definierte Relationen. Sodann stellen wir eine Methode vor, algebraische Datentypen und strukturell rekursive Funktionen in JAVA zu simulieren.

Material:

Eine kurze Diskussion verschiedener Stile für die Repräsentation algebraischer Datentypen in JAVA findet sich in dem Artikel Why Visitors? von Jens Parlsberg.

Nach oben.


Vorlesung 4: Getypte arithmetische Ausdrücke

Zur Klärung der Beziehung zwischen small-step und big-step-Semantik beweisen wir, dass eine Folge von Einzelschritt-Auswertungen, die in einem Wert endet, auch mit einem "Big-step" auf einmal erledigt werden kann.
Dann führen wir Typen und die Typisierungsrelation für arithmetische Ausdrücke ein und definieren die Begriffe Typsystem, entscheidbares Typsystem, deterministisches Typsystem, Typprüfung (type checking), Typinferenz und Typsicherheit ein. Von den zwei Eigenschaften Fortschritt und Typerhaltung, die Typsicherheit charakterisieren, zeigen wir die zweite für unsere Sprache der arithmetischen Ausdrücke.

Material:

Nach oben.


Vorlesung 5: Ungetypter Lambda-Kalkül I

Der Lambda-Kalkül wird eingeführt, der den Kern funktionaler Programmiersprachen darstellt und in dem sich alle Programmkonstruktionen repräsentieren lassen. Behandelt werden Variablen und Bindung, α-Gleichheit, β-Reduktion und verschiedene Auswertungsstrategien. Schliesslich wird anhand der Church'schen Booleans gezeigt, wie man im Lambda-Kalkül programmieren kann.

Material:

Nach oben.


Vorlesung 6: Ungetypter Lambda-Kalkül II

Wir studieren weitere Beispiele von kodierten Datentypen im Lambda-Kalkül: Paare und natürliche Zahlen. Wir definieren Nachfolger, Addition, Test auf Null und Vorgänger-Funktion durch Lambda-Terme. Schliesslich betrachten wir den Lambda-Kalkül als Objekttheorie und definieren Substitution formal als strukturell rekursive Funktion.

Material:

Nach oben.


Vorlesung 8: Einfach Getypter Lambda-Kalkül I

Zuerst definieren wir Typisierung und Auswertung für Booleans. Dann führen wir den einfach getypten Lambda-Kalküein. Für die Typisierungs der Variablen benötigen wir eine Typisierungskontext. Wir zeigen den ersten Teil der Typsicherheit: Fortschritt.

Material:

Nach oben.


Vorlesung 9: Einfach Getypter Lambda-Kalkül II

Wir zeigen Schwächungs- (Weakening), Stärkungs- (Strengthening) und Substitutionseigenschaft für Typherleitungen in einfach getypten Lambda-Kalkü und beweisen damit Typerhaltung unter Reduktion. Desweiteren führen wir Paare (Produkttyp), und den Singleton-Typ Unit ein.

Nach oben.


Vorlesung 10: Erweiterungen des Einfach Getypten Lambda-Kalküls

Wir behandeln Sequenzen, Let, Records, und Rekursion.

Material:

Nach oben.


Vorlesung 11: Referenzen

Wir führen die ersten nicht-funktionalen Konzepte ein: Referenzen und Wertzuweisung im Stil von SML. Die Auswertungssematik wird erweitert um den Zustand des Speichers, Typisierung um Speichertypen.

Nach oben.


Vorlesung 12: Untertypen

Wir führen das Konzept von Untertypen (Subtypes) ein beweisen, dass die Subtyp-Relation entscheidbar ist.

Material:

Nach oben.


Vorlesung 13: Objekt-orientiertes Programmieren

Wir demonstrieren, wie man in der vorgestellten funktionalen Sprache wesentliche Konzepte objekt-orientierter Programmierung simuliert: Dynamic dispatch, Kapselung, Schnittstellen und Untertypen, Vererbung und sp\"ate Bindung.

Material:

Nach oben.


Vorlesung 14: Featherweight Java

Wir stellen Featherweight Java vor, eine minimale objektorientierte Teilsprache von Java, die Vererbung und Subtyping modelliert. Dazu Typ- und Auswertungsregeln und Aussagen zur Typsicherheit.

Material:

Nach oben.


Übung 1: Wiederholung einiger Grundkonzepte von JAVA

Wir wiederholen einige Konzepte der objektorientierten Programmiersprache JAVA:

  • Statische Methoden und main
  • Kontrollstrukturen: for, if, try
  • Ausnahmebehandlung
  • Klassen und Instanzen
  • Shallow und Deep Cloning

Material:

Nach oben.


Übung 2: Besprechung Übungsblatt 1

Besonders eingegangen wird auf direkte Beweise durch Induktion, die ohne Widerspruch auskommen und daher konstruktiv sind. Ausserdem wird die deterministische Einzelschritt-Auswertungssemantik detailliert besprochen.

Nach oben.


Übung 3: Parsen

Die Übersetzung von externer in interne Syntax bezeichnet man als Parsen. Folgende Konzepte werden vorgestellt:
  • Ströme
  • Lexer (auch Scanner genannt)
  • Parser

Material:

Nach oben.


Übung 4: Besprechung Übungsblatt 3

Diskutiert wird subject expansion, d.h. ob Typerhaltung auch unter Expansion (im Gegensatz zu Reduktion) eines Terms gilt. Der Unterschied zwischen abgeleiteten Regeln (derived rules) und zulässigen Regeln (derived rules) wird besprochen.

Nach oben.


Übung 5: ausgefallen

Nach oben.


Übung 6: Namenlose Repräsentation von Lambda-Termen nach Nicolas de Brujin

Vorgestellt wird eine Repräsentation von Lambda-Termen, die das Problem der α-Äquivalenz und der Variablenumbennenung bei Substitution beseitigt. Zuerst beschrieben wurde diese Methode von Nicolas de Bruijn (1972) für sein Projekt AutoMATH.

Material:

Nach oben.


Übung 7: Small-step Semantik für den Lambda-Kalkül

Wir definieren call-by-name, call-by-value, normaler und applikativer Auswertung für den Lambda-Kalkül formal.

Nach oben.


Übung 8: Besprechung Blatt 6

Ausserdem diskutieren wir subject expansion für den getypten Lambda-Kalkül und zeigen Beispiele für Funktionen höherer Ordung.

Nach oben.


Übung 9: Einführung und Beseitigung

Wir untersuchen die Einteilung von Termen in Konstruktoren und Selektoren (Anwendungen). Daraus ergibt sich eine Klassifikation der Typregeln in Einführungs- (Introduction Rules) und Beseitigungs-Regeln (Elimination Rules). Berechnung ist die Entfernung von Konstruktor-Selektor-Paaren.

Nach oben.


Übung 10: Typerhaltung und Fortschritt für fix (Rekursion)

Wir wiederholen die Definition rekursiver Funktionen durch Fixpunkte und beweisen Typerhaltung und Fortschritt. Ausserdem besprechen wir Typinferenz für den Lambda-Kalkül mit Booleans.

Material:

Nach oben.


Übung 11: Besprechung Blatt 8

Wir besprechen die Aufgaben mit Referenzen von Blatt 8. Dabei geht es auch um Simulation von "OOP" im Lambda-Kalkül mit Referenzen und Records.

Material:

  • Teillösung der Aufgaben als SML-Code: ass8.sml
Nach oben.


Übung 12: Besprechung Blatt 9

Wir diskutieren ausserdem die Subtyping-Regel für Funktionstypen in JAVA und kommen zu dem Schluss, dass sie dort nicht vorhanden ist, da es sonst Probleme mit overloading geben würde.

Material:

  • Funktions-Untertypen in JAVA: testSubtypeArrow.java (kompiliert nicht!!)
  • Lösung der Aufgabe 2: Pierce, Aufgabe 15.2.3 (2) und (3) [ersetze "Top" durch "Bool"]
  • Lösung der Aufgaben 3 und 4 in Haskell: Subtyping.hs mit Test.hs, benutzt balancierte Bäume RedBlack.hs
Nach oben.


Übung 13: Besprechung Blatt 10

Wir verbessern Blatt 10: Objekt-orientierte Programmierung im getypten Lambda-Kalkuel mit Records, Rekursion und Subtyping.

Material:

Nach oben.


Valid HTML 4.01!
AndreasAbel
Last modified: Tue Jul 16 14:15:17 CEST 2002
Valid CSS!