Höhere Programmiersprachen

Inhalt

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

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.