Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 1
Höhere ProgrammiersprachenSommersemester 2001
Prof. Dr. Gerhard GoosUniversität Karlsruhe
Institut für Programmstrukturen und Datenorganisation
Ort: -101 neue InformatikZeit: Dienstag, 14:00 - 15:30
Sprechstunde: Mittwoch 14:00 - 15:00Vorlesungsunterlagen: http://i44www.info.uni-karlsruhe.de/...
Post: [email protected]
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 2
Lernziele
� Sprachübergreifende Konzepte� lernen und verstehen,� wiederfinden in einzelnen konkreten Sprachen
� Überblick über höhere Sprachen� Vorteile und Nachteile� Wann welche Sprache sinnvoll einsetzbar
� Vorgestellte Sprachen� Programme lesen und verstehen können,� Sprache leicht lernen können
� Kein Programmierkurs
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 3
Übersicht
Allgemeine Literatur: Goos, Zimmermann: Programmiersprachen. In Rechenberg, Pomberger (Hrsg.):Handbuch der Informatik, Kap. D2. Hanser, 1997.E. Horowitz (Hrsg.): Programming Languages. A Grand Tour. Springer-Verlag, 1983.J. Loeckx, K. Mehlhorn und R. Wilhelm: Grundlagen der Programmiersprachen. B.G. Teubner, 1986.R. Sethi: Programming Languages - Concepts and Constructs. Addison-Wesley,1996.R. L. Wexelblat: History of Programming Languages. Academic Press, 1981.P. H. Schmitt: Theorie der logischen Programmierung. Springer, 1992.R. Bird, P. Wadler: Einführung in die funktionale Programmierung. Hanser, 1992.G. Goos: Vorl. über Informatik, Band 1. Dritte Aufl., Springer, 2000.G. Goos: Vorl. über Informatik, Band 2. Dritte Aufl., Springer, 2001.J. W. Lloyd: Foundations of Logic Programming. Springer, 1984.B. Meyer: Object-oriented Software Construction. Prentice Hall, 1988.
Th. J. Bergin, R. G. Gibson: History of Programming Languages. Addison-Wesley 1996.J. E. Sammet: Programming Languages: History and Fundamentals. Prentice-Hall, 1969.
Sprachbeschreibungen und Standards siehe Liste im Netz
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 4
1. Grundlagen
Geschichte von Programmiersprachen
Paradigmen
Syntax, Semantik, Pragmatik
Statische und dynamische Eigenschaften
λ - Kalkül, Bindungen,
Lebensdauer, Gültigkeitsbereich
Abstrakter Datentyp
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 5
2. Konzepte imperativer Sprachen
� Typen
� Ausdrücke
� Ablaufsteuerung
� Prozeduren, Module, Klassen
� Generizität und Polymorphie
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 6
3. Standardparadigmen
� Funktionales Programmieren (LISP)
� Logisches Programmieren (Prolog, Datalog)
� Wissenschaftliches Rechen (Fortran)
� Wirtschaftsanwendung (COBOL, ABAP/4)
� Objektorientiertes Programmieren (Java, Small Talk, Cecil, Sather, Eiffel, CLOS und C++ im Vergleich)
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 7
4. Skript-Sprachen
� Steuerung
� Kopplung
� Konfiguration
� Prototyping
� Web-Anwendungen
� Beispielsprachen:JavaScript, Perl, Tcl/Tk, Python, Visual Basic for Applications
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 8
Teil 1
Grundlagen
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 9
Programmiersprachen
� Programmiersprache:
� Notation um Berechnungen in maschinen- undmenschenlesbarer Form zu beschreiben
� Abstraktion von Maschineneigenschaften
� Programmiersprachen sind Spezifikationssprachen
� Programm:
� Algorithmus: Funktion Eingangsdaten → Ausgangsdaten
� Reaktives System:Strom von Eingabedaten → Strom von Ausgabedaten
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 10
Geschichte
1944: Zuse's Plankalkül (erst um 1970 bekannt geworden)40er: Maschinensprache (sedezimal)50er: Maschinensprache (symbolisch, symbolisch adressiert)1954-: Fortran: Formeln, Parameterübergabe1958/60: Algol 60: Ablaufstruktur, Blockstruktur, Kellerverwaltung, Namensaufruf, 1959: Lisp: Listenorganisation, Speicherbereinigung, ,,Programm ist Liste``1959/60: Cobol: Verbunde, Fallunterscheidung, Trennung der E/A1962/65: APL: interaktive Sprache~1964: Snobol: Textverarbeitung, Muster auf Texte anwenden, Suchbäume1967: Algol-W: Halde, Verweise, benutzerdeklarierte Typen1967: Simula 67: Objektorientierung1971: Pascal: Vereinfachung von Algol1972ff: Prolog: Unifikation, Termersetzung1974ff: Smalltalk: alles sind Objekte1975: Modula, CLU: Modulbegriff1976ff: Scheme, ML: funktionales Programmieren1980ff: SQL: ,,Sprachen der vierten Generation``
Geschichte II1955
1960
1965
1970
1975
1980
1985
1990
1995
2000
Fortran I (1954)
Algol 60
Algol 68Pascal
Modula 2
Ada 83
Oberon
Ada 95
Simula 67
Smalltalk 74
Smalltalk 80
Lisp
Prolog
ML
Haskell
C
BCPL
CPL
C++
Java
Scheme
Common Lisp
Gofer
Cobol
PL/1
ABAP4
CLOS
SML
Eiffel
Sather
Fortan IV
Fortran 77
Fortran 90
HPF
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 12
Sprachtypen
� Imperativ (prozedural, operational)
� Zustände
� Zustandsübergänge (Zuweisung)
� Funktional
� geschachtelte Funktionsauswertung
� Funktionen als Werte (Funktionale)
� applikativ: Kopplung imperativ+funktional
� Logisch
� Hornklauseln (Resolution, Unifikation)
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 13
Was ist ein Programm
� Algorithmus: Funktion: Eingangsdaten � Ausgangsdaten� Reaktives System: Strom v. Eingangsdaten � Strom v. Ausgangsdaten
� Programmiersprache legt fest, � Syntax : Was ist ein wohlgeformtes Programm?� Semantik: Welche abstrakte Bedeutung hat ein wohlgeformtes
Programm?� Pragmatik: Welche konkrete Bedeutung hat ein wohlgeformtes
Programm?
� Unterscheide� Semantik: Bedeutung im formalen System (Selbstbezug)� Pragmatik: Bedeutung in der Umwelt (und auf dem Rechner)
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 14
Gemeinsame Eigenschaften
� Gliederung in Syntax, Semantik, Pragmatik
� Typen
� Bindungen von Namen
� an Deklarationen (von Typ, Funktion und Variablen)
� an Typen und Werte
� Ablaufsteuerung
� Beispiel: λ - Kalkül
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 15
Syntax
� Lexik:
� Bedeutungstragende Sprachelemente
� Beschrieben durch reguläre Ausdrücke
� Syntax*:
� Obermenge der gültigen Programme
� Beschrieben durch kontextfreie Grammatik
� Statische Semantik*:
� Definiert gültige Programme
*: eigentlich Syntax = kontextfreie Syntax + statische Semantik
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 16
Semantik und Pragmatik
� Semantik:
� dynamische Semantik
� Ordnet syntaktischen Sprachelementen Bedeutung zu
� Definiert die Ausführung des Programms
� Pragmatik:
� setzt Sprachelemente zu Konzepten außerhalb der Sprache in Beziehung
� Beispiel: Arithmetik der Zielmaschine
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 17
λλλλ-Kalkül
� einfachste algorithmische Sprache� entwickelt von ALONZO CHURCH
� Eigenschaften:� einfache Termalgebra mit Variablen� Programm ist Folge von Termen� Daten sind Terme� einfache Syntax� nur drei semantische Regeln� keine E/A
� Grundlage von� LISP� Beschreibung von Programmiersprachen
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 18
λλλλ -Kalkül
� (Variable) v
� (λ-Abstraktion) λv.t
� (Anwendung) ( t t´ )
Termalgebra Λ:
� gegeben abzählbare Variablenmenge V:
� v V ist ein Term
� λv.t ist ein Term für v V, t � Λ
� ( t t´ ) ist ein Term für t, t´ � Λ
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 19
Programm im λ -Kalkül
� Funktionsdefinitionen:Folge von Definitionen ( v=t ) mit v V und t Λ
� Funktionsanwendung:( t t´ ), Terme t, t´ Λ
( f = ( λ v . v ) ) ( f t )
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 20
Syntax des λλλλ-Kalküls
� Grundsymbole:
� Bezeichner (Namen) für Variable, . , λ, ( , ) , =
� Syntax*:
� siehe vorangehenden Folien
� Statische Semantik:
� (noch) keine Einschränkungen
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 21
Substitutionen im λλλλ -Kalkül
� Freie Variable:
� Zulässige Substitution:
t [ t´/ v ] zulässig: freie Variable in t` dürfen durch die Ersetzung nicht gebunden werden: ¬∃ v: v ∈ frei (t`) ∧ v ∉frei (t[t'/v])
frei (v) = {v}frei (λv.t) = frei (t) \ {v}frei (t t´) = frei (t) ∪ frei (t´)
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 22
Programmlauf im λλλλ -Kalkül
� Programmlauf durch drei Konversionen definiert:
(α) λv.t → λv´.t[v´/ v], falls zulässig(β) ((λv.t) t´ ) → t[t´/ v], falls zulässig(η) (λv.(t v)) → t, falls v ∉ frei(t)
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 23
Beispiel: Programmlauf
1. ( f = ( λ v . v ) )( f t )
3. (( λv . v ) t )
4. (( λ v´. v[v´/ v]) t ) = (( λv´. v´ ) t ) (α), falls erforderlich
5. ( v' [ t / v' ] ) = t (β)
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 24
Semantik des λλλλ-Kalküls
� Bindung
� von Variablen in Termen (Bindung der Bedeutung)
� von Funktionsnamen an Terme (Bindung des Werts)
� Ausführung: Folge von Transformationen
� Pragmatik
� (noch) keine Beziehung zu anderen Konzepten
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 29
Bedingte Anweisung
λ x y ... z . t =def λ x . ( λ y . ( ... (λ z . t) ...))
wahr = λ x y . x
falsch = λ x y . y
if-then-else = λ b t t´. ( b t t´)
b Funktion mit Ergebnis wahr oder falsch
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 30
Eigenschaften von Termen
� Im Beispiel:
� Kontext if-then-else erfordert: b muß wahr oder falsch liefern
� Allgemein:
� Kontext erzwingt Einschränkung potentiell an einen Namen gebundener Terme
� Typisierung der Terme:
� Partitionierung der Terme bezüglich anwendbarer FunktionenÜbung: Die ganzen Zahlen sind Funktionale
0 = (λ f x . x)n = (λf x . (fn x)), n = 1,2,... und (fn x) = (f (...(f x) ...x) x)
add = (λ m n.(m n)), usw.
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 31
Typ eines Terms
� Typ T entspricht einer Menge von Termen
� Induktiv definiert über
� Konstruktoren
� Operationen
� Axiome
� Beispiel:Abstrakte Datentypen (ADTs) ADT INT:
Konstruktoren:..., -2, -1, 0, 1, 2, ... : INT
Operatoren:+, × , div, mod : INT INT INT==, < , > : INT INT { wahr, falsch }
Axiome:+ 0 t = t ... ×1 t = t ...
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 32
Rekursive Programme
� Beispiel: Größter gemeinsamer Teiler ggT
ggT a b = ( if-then-else (== a b) a
( if-then-else (< a b) ( ggT b a) ( ggT b (+ a (× (-1) b)))
))
if-then-else und Rekursion zusammen erlauben Formulierung beliebiger sequentieller Abläufe.
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 33
Zusammenfassung λλλλ-Kalkül
� Einfache Sprache über Termen
� nur drei Regeln definieren die Semantik
� Ausführungsreihenfolge beliebig: Church-Rosser-Eigenschaft
� Turing-mächtig: nicht abbrechende Berechnungen, Fixpunkte
� Programme sind Daten, Daten sind Programmstücke(Grundlage der Metaprogrammierung)Grundlage von LISP
� Grundlage vieler formaler Sprachbeschreibungen
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 34
Bindung
Zwei Formen der Bindung:� Bedeutung: Zuordnung (freie) Variable (Bezeichner) zu
Definition (λ, Quantor, Vereinbarung, ...)� Wert: Zuordnung: (gebundene) Variable (Name) zu Wert
� Im λ-Kalkül: Zuordnung Bezeichner - Term� entspricht Bedeutungszuordnung
� Name: Bezeichner, oft auch komplizierterer Zugriffspfad
Grundregel: In einem korrekten Programm sind alle Bezeichner gebunden(durch Vordefinition, explizit, oder implizit).� potentielle Fehler: nicht vereinbarter Bezeichner, polymorpher Aufruf
einer nicht-existenten Methode (z.B. in Smalltalk)
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 35
Gültigkeitsbereiche
Unterscheide
� Definition (defining occurrence) eines Namens
� Anwendung (applied occurrence) eines Namens
Bindung ordnet der Anwendung eine sichtbare Definition zu.
Gültigkeitsbereich einer Definition: Teil des Programms, in dem die Definition sichtbar ist.
� Gültigkeitsbereiche statisch definiert durch:
� Blockschachtelung (entspricht α-Regel im λ-Kalkül/LISP)
� lokale Sichtbarkeit in Moduln/Klassen/Verbundtypen
� alternativ: Gültigkeit dynamisch definiert: LISP, APL, polymorphe SprachenProf. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 36
Bindezeitpunkte
� Bedeutungsbindung:� statisch: fest zur Übersetzungszeit� beim Programmstart� dynamisch: abhängig von Aufrufhierarchie
� Wertbindung:� statisch: fest zur Übersetzungszeit� polymorph: abhängig von Operandentypen� beim Programmbinden� beim Programmstart� bei Vereinbarung des Namens (dynamische Konstante)� dynamisch: Zuweisung
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 37
Statische Bindung
Bedeutungsbindung:
� Gültigkeitsbereich statisch definiert
� eventuell zusätzlich: bezeichnetes Objekt statisch definiert
� alle Objekte in COBOL, FORTRAN, ...
� Modulattribute in Modula, Ada, ...
� „static“ Variable/Konstante in C, C++, Java
� „shared“ oder Klassen-Attribute in oo Sprachen
Wertbindung:
� Name bezeichnet stets den gleichen Term (statische Konstante)
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 38
Dynamisches Binden
Bedeutungsbindung:� Sichtbarkeitsregeln dynamisch:
� Auswertungsfolge, nicht Programmstruktur (Syntax) definiert Zuordnung Anwendung - Definition:
� Zuletzt ausgeführte Definition ist sichtbar.� Verwendung in interpretiertem LISP, APL� Für den Programmierer schwierig zu überprüfen
Wertbindung:� Zur Laufzeit: unterschiedliche Terme an gleichen Bezeichner gebunden� Zu jedem Zeitpunkt: nur ein Term
Kopplung Wert-Bedeutung bei Polymorphie (siehe später)
� Achtung: interpretiertes/übersetztes LISP verhalten sich unterschiedlich!
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 39
Beispiele: statischer vs. dynamischer Gültigkeitsbereich
mit Pascal-Syntax:...var a: INT;
procedure q; begin writeln(a) end;procedure p; var a: INT; begin a := 1; q end;begin (* Hauptprogramm*) a := 2; pend;
Ergebnis 2 bei statischer Bindung, 1 bei dynamischer Bindung
im λ-Kalkül (mit Funktional):(a = 2)(f = (λ b. a))(g = λ a. ((f 3) a))(g 1)
dynamisch: (g 1) = ((λ a. ((f 3) a)) 1) = ((λ b. 1) 2) = 1statisch: (g 1) = ((λ a. ((f 3) a)) 1) = ((λ b. 2) 2) = 2Ergebnis 2 bei statischer Bindung, 1 bei dynamischer Bindung
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 40
Binden beim Programmbinden
Einzelne (getrennt übersetzte) Module definieren Namensräume.
Binder bindet Anwendung und Definition von Namen aus verschiedenen Moduln.
Beispiele:
� Zuordnung externer Funktionen,
� Überlagerung von COMMON-Zonen in Fortran
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 41
Binden beim Programmstart
Bedeutungsbindung:� Bindung dynamischer Bibliotheken
Wertbindung� COBOL bindet logische Dateinamen
aus der Umgebungssektion an physikalische Dateien� Initialisierung statischer Variabler
Unterschied Wertbindung beim Startzu statischer Bindung/Bindung beim Programmbinden:
� Speicherbereiche werden bei jedem Programmstart neu initialisiert.
� Daher kein Neuladen initialisierter Variablenbereiche erforderlich (eintrittsinvarianter Code, reentrant code)
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 42
Binden zur Ausführungszeit
Bedeutungsbindung:
� Dynamisches Nachladen von Moduln
� Java Klassen werden zur Laufzeit geladen, wenn sie benötigt werden.
Wertbindung:
� Bindung konstanter Werte bei Vereinbarung des Namens (dynamische Konstante)
� Zuweisung
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 43
Typen in Programmiersprachen
Typ: Klassifikation möglicher Werte nach zulässigen Operationen� 0-stellige Operation � Konstante� gegeben durch Termalgebra� Typ bestimmt Semantik der Operationen und Speicherzuweisung
Abstrakter Datentyp: Spezifikation einer Termalgebra durch� Signatur, Konstruktoren, Axiome
Typbindungen:� typfrei: nur Speicherumfang bekannt,
Semantik der Operationen selbstidentifizierend (Maschinensprachen, niedrige Programmiersprachen)
� uniform: nur Werte eines Typs (λ-Kalkül, elementares LISP, Prolog)� typisiert mit mehreren Typen: alle anderen Sprachen
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 44
Typisierte SprachenTypisierte SprachenTypisierte SprachenTypisierte Sprachen
� schwache Typbindung: Mischung mit Eigenschaften typloser Sprachen (C, Fortran, ...), Typen nicht disjunkt
� starke Typbindung: Typen disjunkt, alle Variable/Objekte/Werte haben eindeutigen Typ� statisch typisiert: Typisierung zur Übersetzungszeit bestimmbar.� polymorph: Zur Übersetzungszeit Bestimmung von Typmengen
(Obertyp), zur Laufzeit Auswahl des endgültigen Typs.� dynamisch typisiert: Typ wird zur Laufzeit bestimmt (Smalltalk).
� Nur wenige Sprachen wirklich stark typgebunden: funktionale Sprachen, Ada, Sather, Java� Gegenbeispiel Pascal, Modula-2: Typbindung verletzt beim Umgang mit
Verbunden mit Varianten (Variantenzeiger wird nicht geprüft).� Problem starker Typisierung: Sprache nicht für explizites
Speichermanagements geeignet (Typwechsel von Speicherzellen notwendig)� starke und dynamische Typisierung sind kein Widerspruch!
(Übersetzerentscheidung, Preis: Speicheraufwand, Laufzeit)
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 45
Typen von Namen
Was ist der Typ von a oder b ?
Typ bestimmt aus Vereinbarungen (hier nicht vorhanden)
� Typinferenz bestimmt Obertyp (� Menge möglicher Typen): alle vorkommenden Operationen (hier: ==, <, +, ×, -) und Konstante müssen zulässig sein.
Vorsicht bei Typinferenz: semantische Bedeutung von ==, <, usw. bleibt offen!
ggT a b = ( if-then-else (== a b) a
( if-then-else (< a b) ( ggT b a) ( ggT b (+ a (× (-1) b)))
))
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 46
Klassifikation
� typisierte vs. typfreie Sprachen
� starke vs. schwache Typisierung
� statische vs. dynamische Typisierung
� inferierte vs. deklarierte Typisierung
� Die meisten realen Programmiersprachen bieten Mischformen.
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 47
Untertypen
Ein Untertyp t' von Typ t ist ein Typ so, daß alle Werte und Operationen des Typs t' anstelle von Werten bzw. Operationen des Typs t benutzt werden können.
� gewöhnlich sind die Operationen von t', t identisch,Ausnahme oo Sprachen
Beispiele:� Ausschnitte [a..b] von integer in Pascal, Modula-2� array[a..b] of S von offenen Reihungen array[ ] of S in Pascal, Modula-2� Untertyp t' definiert durch (konforme) Vererbung des Obertyps t in oo
Sprachen� in der Mathematik: Z ⊆ Q ⊆ R ⊆ C, Quadrate ⊆ Rechtecke
� in der Informatik gelten diese Inklusionen nicht!
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 48
Statische Typen
Statischer Typ TS(n) eines Namen n ist mindestens die Vereinigung der statische Typen TS(t) der potentiell zur Laufzeit an n gebundenen Terme t.
� Wenn t an n gebunden, gilt TS (t) ⊆ TS (n)
� Statische Typisierung wird definiert durch
� explizite Vereinbarung
� Typinferenz
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 49
Dynamische Typen
� Annahme: Grundterme sind stark typisiert
� Grundterme: Konstante und Ausdrücke mit Werten als Operanden
� Dynamischer Typ TD(n) eines Namen n zu einem Zeitpunkt zur Laufzeit ist der Typ des Grundterms, der zu diesem Zeitpunkt an n gebunden ist (undefiniert, wenn nicht vorhanden)
� TD(n) ist Untertyp des statischen Typs TS(t) des Terms t der momentan an n gebunden ist.
� Statischer Typ TS(n) eines Namen n der dynamisch gebunden wird?
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 50
Typvereinbarungen
� Definition der speziellen Typen von Namen und Funktionen
� zum Ableiten der Typen von Ausdrücken
� zum Konsistenztest im Ausdruckskontext
� In vielen imperativen und funktionalen Sprachen
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 51
Typverband
� Gegeben: Menge T aller disjunkten Typen. � Werte (� Grundterme in Termalgebren) sind immer eindeutig typisiert.� Menge aller Werte ist partitioniert: jeder Wert w hat eindeutigen Typ t ∈T.
� Potenzmenge �(T) bildet Verband mit � als Ordnung.� = T größtes Element����
= Ø kleinstes Element
� Variable und Funktionen (Prozeduren, Methoden) haben� monomorphen Typ t ∈T, oder� polymorphen Typ t ∈�(T), t Vereinigung monomorpher Typen
� Beispiele:� funktionale Sprachen: alle Bezeichner (log. Variable, Funktionen) polymorph� C++, Java: polymorphe Variable definierbar, virtuelle Methoden polymorph� Sather: polymorphe Variable definierbar, alle Methoden polymorph� Smalltalk: alle Variablen und Methoden polymorph
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 52
Typinferenz
Gegeben: Variable v vom Typ t ∈�(T), eventuell t = T, und Aufruf f(v).
� In funktionalen Sprachen: Schränke Typ t ein unter Kenntnis der Aufrufe f(v).� Schränke mögliche Def. von f und mögliche Ergebnistypen von f(v)� mit Kenntnis des Typs von v ein.� alles zur Übersetzungszeit.
� In oo Sprachen: Zur Laufzeit wähle aufgrund des Typs des Werts von v unter mehreren Definitionen f1, f2, ..., fn von f aus (dynamic dispatch).� muß zur Übersetzungszeit geschehen, wenn f nicht polymorph, sondern
überladen.
� kann zur Übersetzungszeit geschehen, wenn durch Datenflußanalyse die Typen der Werte von v bereits genauer bekannt sind (Optimierungsmaßnahme).
� Analog für Funktionen/Methoden mit mehreren Parametern.
Typinferenz auch zur Konsistenzprüfung einsetzbar.
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 53
Kopplung Wert-Bedeutung bei Polymorphie
� zugeordnete Definition eine Prozedur (oder Operation) kann vom Typ des Werts der Operanden abhängen� wird prinzipiell zur Laufzeit berechnet� bei polymorphem Aufruf in oo Sprachen zählt nur der erste Operand (das
Objekt der Methode, Ausnahme CLOS)� bei Überladen zählen alle Operanden� statischer Typ der Operanden ist Obermenge aller zur Laufzeit möglichen
Typen� unterscheide:
� Überladen von Operationen/Prozeduren: Typen zur Übersetzungszeit bekannt� generische Polymorphie: Operandentyp von Typparametern des Moduls (Klasse,
Funktion) abhängig� statische/dynamische Auflösung implementierungsabhängig
(Ada, C++, Eiffel, Sather, Pizza,..., alle funktionalen Sprachen)
� Vererbungspolymorphie: nur dynamisch auflösbar (alle oo Sprachen), statisch berechenbare Auswahlfunktion
Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 54
Parametrisierte oder generische Typen
� Beispiel: Behältertyp liste(v) ∈�(T) von Elementen eines Typs v ∈�(T).� Jede Spezialisierung v � t ∈T der Typvariablen v liefert konkreten Typ
liste(t) ∈T.� liste(v) heißt generischer Typ mit Typparameter v.
� Vorsicht: Alle Operationen des Typs t, die zur Implementierung der Operationen von liste(v) erforderlich sind, müssen auch tatsächlich (mit der gewünschten Semantik) verfügbar sein!
� Daher in oo Sprachen: liste(v < t`) mit Typschranke t': Nur Typen t, die alle Operationen des Typs t' aufweisen, dürfen für v eingesetzt werden.
Anwendung:� alle funktionale Sprachen� C++ (templates), Eiffel, Sather, Pizza (Java-Erweiterung), generic Java
(mit Einschränkungen, zukünftiges Java), Ada (aber leicht anders)
� Generizität ist leistungsfähiger als Vererbung!