Prof. Dr. Gerhard Goos Höhere Programmiersprachen SS 2001 (01) 1 Höhere Programmiersprachen Sommersemester 2001 Prof. Dr. Gerhard Goos Universität Karlsruhe Institut für Programmstrukturen und Datenorganisation Ort: -101 neue Informatik Zeit: Dienstag, 14:00 - 15:30 Sprechstunde: Mittwoch 14:00 - 15:00 Vorlesungsunterlagen: 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
14
Embed
Übersicht - info.uni-karlsruhe.deJ. E. Sammet: Programming Languages: History and Fundamentals. Prentice-Hall, 1969. Sprachbeschreibungen und Standards siehe Liste im Netz Pro f.
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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
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
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
� 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
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
� 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!
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,
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)