Nächste Seite:
Einleitung
Prinzipien von Programmiersprachen
Vorlesung
Wintersemester 2006
Johannes Waldmann, HTWK Leipzig
Einleitung
Inhalt
Organisation
Literatur
Übungen
Ausführungsarten
Struktur eines Übersetzers
Übung: Beispiele für Übersetzer
Syntax von Programmiersprachen
Daten-Repräsentation im Compiler
Token-Typen
Formale Sprachen
Grammatiken
Wort-Ersetzungs-Systeme
Reguläre Sprachen/Ausdrücke
Beispiele/Aufgaben zu regulären Ausdrücken
Übungen Reg. Ausdr.
Kontextfreie Sprachen
(erweiterte) Backus-Naur-Form
Ableitungsbäume für CF-Sprachen
Ableitungsbäume (II)
Eindeutigkeit
Assoziativität
Präzedenzen
Übungen
Semantik von Programmiersprachen
Statische und dynamische Semantik
Attributgrammatiken
Attributgrammatiken-Beispiele
Regeln zur Typprüfung
Ausdrücke
Kellermaschine
Dynamische Semantik
Bsp: Operationale Semantik
Axiomatische Semantik
Denotationale Semantik
Übungen
Bezeichner, Bindungen, Bereiche
Variablen
Namen
Typen für Variablen
Konstanten
Lebensort und -Dauer von Variablen
Sichtbarkeit von Namen
Überdeckungen
Statische und dynamische Sichtbarkeit
Sichtbarkeit und Lebensdauer
Typen
Warum Typen?
Historische Entwicklung
Überblick
Aufzählungstypen
Keine Aufzählungstypen
Aufzählungstypen in C
Aufzählungstypen in Java
Teilbereichstypen in Ada
Abgeleitete Typen in Ada
Zusammengesetzte Typen
Produkttypen (Records)
Summen-Typen
Potenz-Typen
Felder (Arrays)
Felder in C
Felder in Java
Dynamische Feldgrößen
Zeiger- und Verweistypen
Zeiger (pointer) in C
Verweise (references) in C++
Zeiger/Verweise in Java?
Probleme mit Zeigern
Aliasing
Automatische Freigabe
Verweiszähler
Markierende Kollektoren
Kopieren/Kompaktieren
Generationen usw.
Übung GC
Ausdrücke
Definitionen
Designfragen für Ausdrücke
Syntax von Konstanten
Der Plus-Operator in Java
Implizite/Explizite Typumwandlungen
Explizite Typumwandlungen
Der Verzweigungs-Operator
Verzweigungs-Operator(II)
Der Zuweisungs-Operator
Ausdrücke mit Nebenwirkungen
Reihenfolge von Nebenwirkungen
Relationale Operatoren
Logische (Boolesche) Ausdrücke
Noch mehr Quizfragen
Anweisungen
Programm-Ablauf-Steuerung
Blöcke
Verzweigungen (zweifach)
Mehrfach-Verzweigung
Switch/break
Kompilation
Wiederholungen
Schleifen steuern durch...
Zählschleifen
Schleifen mit Bedingungen
Abarbeitung von Schleifen
Geschachtelte Schleifen
Sprünge
Sprünge und Schleifen
Sprünge und Schleifen (Beweis)
Schleifen und Unterprogramme
setjmp/longjmp in C
Was ist hier los?
Unterprogramme
Grundsätzliches
Beispiele für Unterprogramme (Funktionen)
Argumente/Parameter
Positionelle/benannte Argumente
Default-Werte
Variable Argumentanzahl (C)
Variable Argumentanzahl (Java)
Semantik von Unterprogrammen
Typprüfungen
Generische Polymorphie
Das Überladen von Namen
Parameter-Übergabe (Semantik)
Parameter-Übergabe (Implementierungen)
Parameterübergabe
Aufgaben zu Parameter-Modi (I)
Aufgaben zu Parameter-Modi (II)
Resultate der Umfrage zur Vorlesung
Aspekte Funktionaler Programmierung
Warum sind Funktionen wichtig?
Übersicht
Funktionen als Daten
Funktionen als Daten (II)
Typsysteme
Deklarative Programmierung
Eifrige (eager) Auswertung
Bedarfs-Auswertung (faul, lazy)
Unendliche Datenstrukturen
Producer/Transformer/Consumer
Programmtransformationen
Fktl. Modellierg. von Zustandsänderungen
Zusammenfassung
Nebenläufige Programme
Einleitung
Nebenläufige Unterprogramme
Shop-Simulation
Shop-Simulation (II)
Ziele der Synchronisation
Synchronisation durch Semaphore
Semaphore (II)
Fünf Philosophen
Gefahr 1: Deadlock (Verklemmen)
Gefahr 2: Unfairness (Verhungern)
Deadlock?
Eine Gabel (im Prinzip)
Ein Philosoph (im Prinzip)
Das Hauptprogramm
Eine Gabel (genauer)
Eine Gabel (wait/notify)
Synchrone Kommunikation (Rendezvous)
Rendezvous (II)
Datentransport durch Kanäle
Kanäle (Beispiel)
Abstraktion und Kapselung
Einleitung
Information verstecken
Attribute in C#
Klassen, Interfaces
Polymorphie
Eingeschränkte Polymorphie
Strategie-Muster
Interfaces benutzen
Sichtbarkeiten
Namen (Designfragen)
Über dieses Dokument ...
Johannes Waldmann 2007-01-23