Überblick über die Veranstaltung

Werbung
Technische Universität Braunschweig
Institut für Programmierung und Reaktive Systeme
Dr. Werner Struckmann
6. Februar 2015
Programmieren für Fortgeschrittene
Übersicht
Art der Veranstaltung: Wintersemester, Bachelor, 5 LP, 2 VL + 2 UE + Rechnerübungen
In dieser Veranstaltung werden grundlegende Konzepte und Paradigmen heutiger
Programmiersprachen betrachtet. Solide Kenntnisse der objektorientierten und
imperativen Programmierung sowie der Programmiersprache Java werden vorausgesetzt.
Kurzbeschreibung: Gegenstand der Programmierausbildung in den ersten Semestern ist
das Programmieren in der objektorientierten Sprache Java. Es existieren aber viele weitere
Programmiersprachen und auch andere Programmierparadigmen. In dieser Vorlesung wird
hierüber zunächst ein Überblick gegeben, anschließend werden grundlegende Konzepte
der Programmiersprachen aus einer allgemeinen Sichtweise behandelt. In den Übungen
werden die allgemeinen Konzepte an konkreten Programmiersprachen verdeutlicht. Das
Schwergewicht in den Übungen liegt auf der funktionalen Programmierung. Insbesondere
besteht die Möglichkeit, die Programmiersprache Haskell zu erlernen.
Stichwörter: Sprachen der Informatik, Programmiersprachen, Programmierparadigmen,
Konzepte höherer Programmiersprachen, funktionale Programmierung, Haskell.
Termine:
Beginn: Di.
Vorlesung Di.
Übung: Do.
Sprechstunde: Mi.
21. Oktober 2014
15:00–16:30 Uhr
13:15–14:45 Uhr
10:30–11:30 Uhr
IZ 161
IZ 161
IZ 244
Diese Datei wird im Laufe des Semesters wöchentlich aktualisiert!
Gliederung der Veranstaltung
1 Einführung
1.1 Sprachen und Paradigmen
1.2 Definition von Programmiersprachen
1.3 Implementierung von Programmiersprachen
2 Datenstrukturen und Anweisungen
2.1 Semantische Grundbegriffe
2.1.1 Namen und Attribute
2.1.2 Deklarationen, Blöcke und Gültigkeits- und Sichtbarkeitsbereiche
2.1.3 Überladung und Auflösung von Namen
2.1.4 Umgebung und Speicherzuweisung
2.1.5 Variable und Konstante
2.1.6 Alias-Namen und Garbage-Collection
2.2 Datentypen und Typsysteme
2.2.1 Grundbegriffe
2.2.2 Einfache Datentypen
2.2.3 Typkonstruktoren
2.2.4 Typkompabilität und Typäquivalenz
2.2.5 Typüberprüfung und -berechnung
2.2.6 Typkonversion
2.2.7 Polymorphismus
2.3 Ausdrücke und Anweisungen
2.3.1 Ausdrücke
2.3.2 Primitive Anweisungen
2.3.3 Strukturierte Anweisungen
2.3.4 Selektionsanweisungen
2.3.5 Iterationsanweisungen
2.3.6 Sprunganweisungen
2.3.7 Ausnahmebehandlung
3 Unterprogramme, Programme und Module
3.1 Unterprogramme
3.1.1 Grundbegriffe
3.1.2 Semantik von Unterprogrammen, Closure
3.1.3 Parameterübergabemechanismen
A Übungen
A.1 Funktionale Programmierung
A.1.1 Das funktionale Paradigma
A.1.2 Scheme
A.1.3 Rekursive Spezifikationen
A.1.4 Der λ-Kalkül
A.1.5 Das Komprehensionsprinzip
–2–
A.1.6 Currying, strikte Funktionen, Funktionen höherer Ordnung
A.1.7 Komplexität rekursiver Algorithmen
A.1.8 Korrektheit rekursiver Algorithmen
A.1.9 Kategorien, Funktoren und Monaden
A.2 Gastvorträge
B Übungsaufgaben
B.1 1. Übungsblatt
B.2 2. Übungsblatt
–3–
1 Einführung
1.1 Sprachen und Paradigmen
Natürliche, künstliche und formale Sprachen; Sprachklassen der Informatik (GPL, DSL);
Sprachen der Informatik (Beispiele); Paradigmen der Programmiersprachen; imperatives,
funktionales, objektorientiertes und prädikatives Paradigma; grundlegende Programmierkonzepte; prozedurales und deklaratives Paradigma; hybrides Paradigma; Entwicklung der
Programmiersprachen; Sprachgenerationen; hybride Paradigmen: imperativ-basierte objektorientierte Programmierung; Skriptsprachen; Datenstrukturen; Typsysteme; paradigmenübergreifende Konzepte; Prinzipien des Sprachentwurfs.
1.2 Definition von Programmiersprachen
Lexik; Lexem; Token; Syntax; kontextfreie Grammatik; Syntaxdiagramm; Backus-NaurForm; operationelle Semantik; Pragmatik; Hinweis auf denotationale, axiomatische, algebraische Semantik; Beispielsprache und Beispielprogramm; Sprachreport.
1.3 Implementierung von Programmiersprachen
Klassifikation der Programmiersprachen; Interpreter; Compiler; Mischverfahren: Interpretation von Zwischen- bzw. Bytecode; virtuelle Maschine; Just-in-Time-Compiler.
2 Datenstrukturen und Anweisungen
2.1 Semantische Grundbegriffe
2.1.1 Namen und Attribute
Name; Speicherstelle; Wert; statische und dynamische Attribute; Deklaration; Bindung;
Bindungszeit; statische und dynamische Bindung; semantische Funktionen: Symboltabelle;
Umgebung; Speicher.
2.1.2 Deklarationen, Blöcke und Gültigkeits- und Sichtbarkeitsbereiche
Deklaration und Definition; Verbundanweisung; Block; explizite und implizite Deklarationen; globale, lokale und nichtlokale Deklarationen; Gruppen von Deklarationen; Bindung; Bindungszeit; statische und dynamische Bindungen; explizite und implizite Bindungen; Gültigkeitsbereich (Scope) einer Bindung bzw. einer Deklaration; Lücke im Gültigkeitsbereich; Sichtbarkeit; statischer (lexikalischer) Scope; die Regeln „Deklaration-vorBenutzung“ und „kleinster umfassender Block“; Blockstruktur; lokale, nichtlokale und globale Deklarationen; Blöcke mit Namen; Scope-Resolution-Operator; visibility by selection;
externe Deklarationen; Gültigkeitsbereiche bei Rekursionen; wechselseitige Rekursion; Attributdeklaration; Prototyp; Forward-Deklaration; Aufbau einer Symboltabelle; dynamischer Scope.
–4–
2.1.3 Überladung und Auflösung von Namen
Wiederverwendung von Funktionsnamen und Operatoren; Überladung (Overloading) von
Namen; explizite und implizite Typumwandlung; Auflösung von mehrdeutigen Namen
(Overload resolution); Redefinition von Operatoren; Beispiel in Haskell; Überladung allgemeiner Namen.
2.1.4 Umgebung und Speicherzuweisung
Umgebung; Speicherzuweisung; Speicherzuweisung bei blockstrukturierten Sprachen; Aktivierung einer Prozedur, Aktivierungssegment; Speicherobjekt; Lebenszeit (extent) eines
Objekts; Zeiger (Pointer); new- und delete-Operationen; Heap; Belegung (Alloziierung)
und Freigabe (Dealloziierung) von Speicher; automatische bzw. kellerbasierte Speicherbelegung; dynamische bzw. manuelle Speicherbelegung; Aufbau des Speichers zur Laufzeit;
Speicherklassen; Zuordnung zu den Speicherklassen.
2.1.5 Variable und Konstante
Variable; Speichermodell; Zuweisung; L- und R-Wert einer Variablen; Storage-Semantik;
Pointer-Semantik: assignment by sharing; assignment by cloning; assignment by sharing of
references; Konstante; Wertsemantik; Übersetzungszeitkonstante; Manifest-Konstante; dynamische Konstante; statische Laufzeitkonstante; Funktionskonstante und -variable; Funktionsliterale.
2.1.6 Alias-Namen und Garbage-Collection
Alias-Name; Seiteneffekt; Beispiele für Auftreten von Alias-Namen; hängende Referenzen;
Garbage; Garbage Collection.
2.2 Datentypen und Typsysteme
2.2.1 Grundbegriffe
Abstraktion; Maschinenabhängigkeit; Datentyp; Wertemenge und Operationen; Typüberprüfung; Typberechnung; Typkonstruktor; Typdeklaration; Typäquivalenz; Typkompabilität; Typanpassung; Typsystem; starke/schwache Typisierung; dynamische Typisierung.
2.2.2 Einfache Datentypen
Vordefinierter Typ; einfacher Datentyp; arithmetischer Datentyp; char; boolean; Aufzählungstyp; Unterbereichstyp; Ordinaltyp; Realtyp; Mengentyp; Speicherung ganzer Zahlen;
Subtraktion ganzer Zahlen; Dualzahldarstellung rationaler Zahlen; Speicherung von Gleitkommazahlen; IEEE-754; geometrische Reihe; Rundungsfehlerproblematik.
2.2.3 Typkonstruktoren
Mengentheoretische Operationen; kartesisches Produkt; Selektor; Record-Struktur; Vereinigung; disjunkte Vereinigung; variante Record-Struktur; Tag; discriminated/undiscriman-
–5–
ted union; Teilmenge; subtype; Arrays; assoziative Arrays; Funktionen; Indextyp; Wertetyp; mehrdimensionale Typen; allgemeine Funktionstypen; Listen; Tupel; Zeigertypen
(pointer); Referenztypen; rekursive Datentypen und Zeigertypen; Konkrete Beispiele aus
C: Funktionstypen, Pointer, Parameter. Bezeichnungen für Typen.
2.2.4 Typkompabilität und Typäquivalenz
Typkompabilität: Begriff an Beispielen in Java; Typäquivalenz; Strukturäquivalenz; Typnamen; anonyme Datentypen; Namensäquivalenz; Deklarationsäquivalenz.
2.2.5 Typüberprüfung und -berechnung
Statische und dynamische Typüberprüfung; Typberechnung (type inference); Typkompabilität; Zuweisungskompabilität; implizite Datentypen; überlappende Datentypen; Werte,
die zu mehreren Datentypen gehören; überladene Operationen.
2.2.6 Typkonversion
Implizite Typkonversion (coercion); explizite Typkonversion (cast); widening und narrowing.
2.2.7 Polymorphismus
Polymorphismus; Überladen von Operatoren; Vererbung; Monomorphismus; explizite und
implizite Typisierung; polymorphe Typüberprüfung; Prinzip der Hindley-Milner-Typüberprüfung; Grundlagen der Unifikation; Formen des Polymorphismus: impliziter parametrischer Polymorphismus, Ad-Hoc-Polymorphismus, reiner Polymorphismus.
2.3 Ausdrücke und Anweisungen
2.3.1 Ausdrücke
Ausdruck vs. Anweisung; ausdrucksorientierte Sprache; primitive und zusammengesetzte
Ausdrücke; Operand; Operator; Überladen von Operatoren; Operator vs. Funktion; Stelligkeit; Prioritätsregel; Assoziativitätsregel; Funktionsaufruf; Klammerung; strikte Auswertung eines Ausdrucks (applicative order evaluation); Seiteneffekt; Sequenzoperator; unvollständige Auswertung von Ausdrücken; short circuit evaluation; If- und Case-Operator;
Typanpassungen; Ausdrücke und Zuweisungen gemischten Typs; nichtstrikte Auswertung
eines Ausdrucks (verzögerte Auswertung, delayed evaluation); Ersetzungsregel; normal order evaluation (lazy evaluation).
2.3.2 Primitive Anweisungen
Leere Anweisung; Deklaration; Ausdrucksanweisung; Zuweisung; Prozedur-, Funktionsund Methodenaufruf.
–6–
2.3.3 Strukturierte Anweisungen
Strukturierte Anweisungen; die Begriffe „single-entry“, „single-exit“ und „multiple-exit“;
Sequenz; Verbundanweisung; Block.
2.3.4 Selektionsanweisungen
Selektion; bewachte Auswahl (guarded if); Wächter; Nichtdeterminismus; If-Anweisung;
Dangling-Else-Problem und Lösungen; Typ des Kontrollausdrucks; Case- bzw. SwitchAnweisung.
2.3.5 Iterationsanweisungen
Iteration; bewachte Schleife (guarded do); while-Schleife; do-Schleife; repeat-Schleife;
Ausstiegspunkte; break-, continue- und exit-Anweisung; for-Schleife; Varianten der forSchleife; Iterator.
2.3.6 Sprunganweisungen
goto-Anweisung; Problematik; Ergebnis von C. Böhm und G. Jacopini.
2.3.7 Ausnahmebehandlung
Explizite und implizite Kontrollsteuerung; Ausnahmebehandlung; Beispiele; robuste Programme; synchrone und asynchrone Ausnahmen; Definition von Ausnahmen; vordefinierte und benutzerdefinierte Ausnahmen; Behandlung und Weiterreichen von Ausnahmen;
try-catch-Anweisung; Auslösen von Ausnahmen; catch-or-throw-Regel; Resumptionund Termination-Modell.
3 Unterprogramme, Programme und Module
3.1 Unterprogramme
3.1.1 Grundbegriffe
Unterprogramm; Abstraktion; Prozedur vs. Funktion vs. Methode; Prozedurspezifikation; Parameter; Deklaration; Definition; Prototyp; variable Parameterzahl; Prozedurrumpf;
Prozeduraufruf; Aktivierung; Rufer und Gerufener; Return-Anweisung; Prozedur/Funktion als Konstante; Funktionsliterale; Unterprogramme und Objekte als Parameter.
3.1.2 Semantik von Unterprogrammen, Closure
Unterprogramme und Umgebungen; activation record; definierende (statische) und rufende
(dynamische) Umgebung; formale und aktuelle Parameter; lokale und nichtlokale Referenzen in einem Prozedurrumpf; geschlossene Form einer Prozedur; Abschluss, Closure.
–7–
3.1.3 Parameterübergabemechanismen
Pass by value (2 Sichtweisen); pass by reference; pass by value-result; pass by result; pass
by name; Seiteneffekte; Jensens device; Parameterüberprüfung.
–8–
A Übungen
A.1 Funktionale Programmierung
A.1.1 Das funktionale Paradigma
Partielle und totale Funktionen; Definition von Funktionen durch Tabellen und Ausdrücke;
Wiederholung: Rekursion, Formen der Rekursion; Funktionen höherer Ordnung; undefinierte Funktionswerte. Grundideen des funktionalen Paradigmas; funktionale Programmiersprachen; Grundfunktionen; primitive Datentypen; Konstante; Variable; Terme; Signatur; Funktionsdefinitionen; Wächter; Anwendung und Auswertung; applikative Algorithmen; Gültigkeits- und Sichtbarkeitsbereich; generische und spezifische Datentypen; Listen und ihre Operationen; Beispiele applikativer Algorithmen; Sortieren durch Einfügen;
Sortieren durch Auswählen; extensionale und intensionale Beschreibungen; Texte; Tupel;
Currying; Funktionen als Datentyp.
A.1.2 Scheme
Einige Aspekte und Beispiele der Sprache Scheme: Ausdrücke, Auswertung, Listenkomprehension, Currying, Rekursion, Funktionen höherer Ordnung.
A.1.3 Rekursive Spezifikationen
Rekursive Spezifikationen; Beispiele; algorithmische Sichtweise; Auswertungstrategien; algebraische Sichtweise; geordnete Mengen; Domain (cpo); monotone Abbildungen; stetige
Abbildungen; Fixpunkte; kleinster Fixpunkt; Fixpunktsatz; Produktdomain; kleenesche
Semantik; Semantik rekursiver Spezifikationen.
A.1.4 Der λ-Kalkül
Kalküle; freie und gebundene Vorkommen; Umbenennung; Alonzo Church; Church’sche
These; λ-Kalkül; λ-Term; Applikation; λ-Abstraktion; β-Regel; α-Konversion; anonyme
Funktionen; λ-Ausdrücke in Haskell; Sections in Haskell; Beispiele für Funktionen; natürliche Zahlen; Addition; Church-Rosser-Eigenschaft; Reduktionsstrategien; Problematik der
Semantik ungetypter λ-Terme; Variationen des λ-Kalküls; Bedeutung des λ-Kalküls.
A.1.5 Das Komprehensionsprinzip
Kurzwiederholung: Prädikatenlogik 1. Stufe mit Beispielen; ZFC-Axiome der Mengenlehre;
Kontinuumshypothese als Beispiel für eine Aussage, die in ZFC weder beweisbar noch
widerlegbar ist; Komprehensionsaxiom; das Komprehensionsaxiom in Haskell; Russellsches
Paradoxon.
A.1.6 Currying, strikte Funktionen, Funktionen höherer Ordnung
Totale Abbildungen der Form A × B → C und A → (B → C); Kardinalitätsbetrachtungen; Bijektion Φ : (A × B → C) → (A → (B → C)); die Haskell-Funktionen curry
–9–
und uncurry; Situation bei partiellen Funktionen; strikte und nichtstrikte Funktionen;
Funktionen höherer Ordnung; die Haskell-Funktionen map, filter, fold und unfold.
A.1.7 Komplexität rekursiver Algorithmen
Komplexität rekursiver Algorithmen; Beispielalgorithmen; Mastertheorem; Rekurrenzgleichungen; lineare (in)homogene Rekurrenzgleichungen mit konstanten Koeffizienten; nicht
lineare Rekurrenzgleichungen; Beispiele: Lösung linearer Rekurrenzgleichungen, Anzahl der
Binärbäume; erzeugende Funktionen; Erinnerung: landausche Symbole, Komplexitätsklassen; Beispielanalysen Fibonacci-Zahlen sowie Komplexität des Fibonacci-Algorithmus.
A.1.8 Korrektheit rekursiver Algorithmen
Wiederholung der Begriffe: Abstraktion, Spezifikation, Semantik, partielle und totale Korrektheit; Erinnerung: Hoare’scher Kalkul, Schleifeninvariante, natürliche und noethersche
Induktion; Korrektheit rekursiver Algorithmen: Berechnungsinduktion, strukturelle Induktion, Terminierung; Beispiele.
A.1.9 Kategorien, Funktoren und Monaden
Kategorie, Objekt, Morphismus; Beispiele: Set, Pfn, Rel, Strukturen, hybride Strukturen;
spezielle Morphismen: Epimorphismus, Monomorphismus, Isomorphismus, Beispiele; spezielle Objekte: Produkt, Coprodukt, Beispiele; Funktor; isomorphe Kategorien, Beispiel;
natürliche Transformation; Monade, Beispiel: Listen; Monaden in Haskell.
A.2 Gastvorträge
• Mike Becker: Pragmatik von Programmiersprachen
• Felix Geilert: Einige Scala-Aspekte
• Stephan Mielke: Ein-/Ausgabe in Haskell
B Übungsaufgaben
B.1 1. Übungsblatt
Aufgabe 1: Wiederholung: Programmierung rekursiver Methoden.
Aufgabe 2: McCarthy-Funktion: Korrektheit und Komplexität rekursiver Funktionen;
Abwärtsinduktion.
B.2 2. Übungsblatt
Aufgabe 3: Rekursive Spezifikationen, Fixpunkte, monotone, stetige Funktionale.
Aufgabe 4: Domaintheorie: Produktdomain.
– 10 –
Herunterladen