Höhere Programmiersprachen
Inhalt
- Einleitung und Überblick
- Syntax und Semantik
- Datentypen
- Kontrollstrukturen
- Modularität und Programmieren im Großen
- Objektorientierte Programmiersprachen
- Funktionale Programmiersprachen
Ziele
Die Teilnehmer sollen einen Überblick über alle wichtigen Konzepte von
Programmiersprachen bekommen. Insbesondere sollen die Teilnehmer in die Lage
versetzt werden, die Stärken und Schwächen einer Programmiersprache zu
erkennen und die Sprache optimal zu nutzen. Der Schwerpunkt liegt auf
imperativen und objektorientierten Sprachen, grundlegende Konzepte
funktionaler Sprachen werden aber auch behandelt.
Voraussetzungen
Grundlegende Kenntnisse zumindest einer Programmiersprache werden vorausgesetzt.
Kenntnisse von C++ sind hilfreich, aber nicht notwendig.
Lehrbehelfe
Die Vorlesung beruht auf dem Buch
"Programming Language Concepts"
von Carlo Ghezzi und Mehdi Jazayeri, 3. Auflage, ISBN 0-471-10426-4, erschienen
1998 bei John Wiley & Sons (in Englisch).
Folien zur Vorlesung sind großteils im Internet verfügbar (Postscript,
jeweils vier Folien auf einer Seite, sortiert nach Kapiteln im Buch):
Achtung:
Neben diesen Folien werden in der Vorlesung auch Abbildungen im Buch als
Folien verwendet.
Auch diese sind "online"
verfügbar.
Typische Prüfungsfragen
- Nennen Sie 5 verschiedene Paradigmen von Programiersprachen.
- Nennen Sie 3 wichtige Eigenschaften von Variablen.
- Beschreiben Sie die 3 Arten von formaler Semantik.
- Gegeben ist ein kleines Programmstück in C-ähnlicher Syntax mit
Zuweisungen. Geben Sie den Wert der Variablen in der letzten
Zuweisung a) bei statischem Scoping, b) bei dynamischen Scoping an.
- Erklären Sie Überladen und Aliasing.
- Gegeben ist ein kleines Programmstück in C-ähnlicher Syntax mit
Zuweisungen und Unterprogrammaufrufen. Geben Sie den Wert der
Variablen in der letzten Zuweisung bei a) call by reference, b) call
by value, c) call by result, d) call by name an.
- Geben Sie einen Aufzähltyp für die sieben Wochentage in einer
Programmiersprache Ihrer Wahl an.
- Erklären Sie was assoziative Datenstrukturen sind.
- Welche Probleme gibt es mit Zeigern?
- Erklären Sie Namensgleichheit und Strukturgleichheit.
- Implementieren Sie eine generische Funktion in einer Programmiersprache
Ihrer Wahl.
- Erklären Sie die Vor- und Nachteile von Kontra- bzw. Kovarianten
Paramentertypen.
- Reduzieren Sie folgenden Lamdaausdruck.
- Was ist das Ergebnis des Aufrufs folgender ML-Funktion?
- Geben Sie alle möglichen Variablenbelegungen folgenden Prologprogramms an.
Beispiele mit Lösungen
Lambdakalkül
Für Browser, die Probleme mit griechischen Buchstaben haben, gibt es den
folgenden Text auch in einer Postscriptversion.
In folgendem Beispiel sind aus Gründen der Lesbarkeit runde Klammern
teilweise durch eckige "[]" und geschwungene "{}" Klammern ersetzt worden.
Reduzieren Sie folgenden Lambdaausdruck:
(λp.[λq.{λp.p(pq)}(λr.p+r)](p+4))2
Als erstes wird Renaming des innersten λp angewendet, da sonst
Probleme durch den gleichen Namen auftreten, und p wird durch z
ersetzt:
(λp.[λq.{λz.z(zq)}(λr.p+r)](p+4))2
Im nächsten Schritt wird q durch (p+4) ersetzt:
(λp.{λz.z(z(p+4))}(λr.p+r))2
p wird durch 2 ersetzt:
{λz.z(z(2+4))}(λr.2+r)
2+4 wird ausgerechnet:
{λz.z(z6)}(λr.2+r)
z wird durch (λr.2+r) ersetzt:
(λr.2+r)((λr.2+r)6)
r wird durch ((λr.2+r)6) ersetzt:
2+((λr.2+r)6)
r wird durch 6 ersetzt:
2+(2+6)
und das Ergebnis ist:
10
Reduzieren Sie folgenden Lambdaausdruck:
(λx.(xx))(λx.(xx)).
Was ist an folgenddem Lambdaausdruck besonders?
ML
Was ist das Ergebnis des Aufrufs folgender ML-Funktion:
len([]) = 0
| len(_::l) = len(l) + 1.
Aufruf: len([1,2,3])
Lösung: 3
Prolog
Geben Sie alle Lösungen folgender Prologprogramme an:
a)
len([], 0).
len([H|T], N) :- len(T, M), N is M + 1.
?- len([1,2,3]), X).
Lösung: X = 3
b)
person(John, Backus).
person(John, McCarthy).
person(James, Gosling).
?- (X, Gosling).
?- (John, Y).
Lösung (X, Gosling): X = James
Lösungen (John, Y): Y = Backus
und Y = McCarthy.