Modul Prinzipien von Programmiersprachen

Sommersemester 2020

Arbeitsgruppe Programmiersprachen und Übersetzerkonstruktion

Nr. Art Termine Raum Veranstalter
080083 V4 Mo 10:15 - 11:45 CAP3 - HS1 Hanus
    Do 08:15 - 09:45 LMS2 - R.Ü1  
080082 Ü2 Di 16:15-17:45 LMS2 - R.Ü1 Hanus, Teegen

Organisatorisches

Die Vorlesung beginnt wie geplant am Montag, 6.4.2020, 10:15 Uhr. Wegen der Corona-Krise wird die Vorlesung zunächst virtuell stattfinden. Dies bedeutet, dass rechtzeitig zu jeder Vorlesungsstunde Videos zum jeweiligen Vorlesungsinhalt bereitgestellt werden (s.u.). Die Übung findet dagegen zum Übungstermin interaktiv als Videokonferenz statt. Die Zugangsdaten werden den Teilnehmern per Email mitgeteilt. Zur Kommunikation sollten sich daher alle Teilnehmer sowohl in der StudiDB als auch im iLearn zu der Vorlesung anmelden. Für Rückfragen, Anmerkungen, Verbesserungsvorschläge u.ä. können die Veranstalter gerne per Email kontaktiert werden.

Vorlesungen

Nachfolgend sind Verweise zu den Videos (im mp4-Format), Skriptteile (als PDF) und weitere Materialen (Folien, Programme) der jeweiligen Vorlesung zu finden. Das gesamte Skript in der aktuellen Fassung (es wird während der Vorlesung fortlaufend überarbeitet) ist weiter unten zu finden.

Datum Videos Skriptteile Folien, Programme
6.4.2020 Begrüßung Einführung Kapitel 1 Einführungsfolien
9.4.2020 Syntax, SOS Kapitel 2.1f
16.4.2020 Natürliche Semantik Denotationelle Semantik Kapitel 2.2.[3-5] SOS in Prolog Semantik von Ausdrücken ...und Anweisungen
20.4.2020 Abstrakte Datentypen Bindung und Blockstruktur Kapitel 2.2.6/2.3
23.4.2020 Variablen / Zuweisung Kontrollabstraktionen Kapitel 3.1 und 3.2
27.4.2020 Datentypen Kapitel 3.3
30.4.2020 Zeiger Prozeduren Zeiger Prozeduren
4.5.2020 Speicherverwaltung Ausnahmebehandlung Speicherverwaltung Ausnahmebehandlung
7.5.2020 Module/Schnittstellen Klassen/Objekte Module/Schnittstellen Klassen/Objekte Point.java
11.5.2020 Vererbung Schnittstellen etc Vererbung Schnittstellen etc
14.5.2020 Funktionale Programmierung: Einführung Funktionale Programmierung: Einführung Einfache Haskell-Beispiele
18.5.2020 Operationale Semantik funktionaler Programme Operationale Semantik funktionaler Programme
25.5.2020 Black Holes Typsysteme Typsysteme funsum (Rank2-Typen)
28.5.2020 Typinferenz Scala Prolog-Einführung Scala Prolog-Einführung Grenzen der Typinferenz Scala-Beispiele Case-Klassen (Scala) Einfache Prolog-Prädikate
4.6.2020 Operationale Semantik von Prolog Operationale Semantik von Prolog
8.6.2020 Prolog-Erweiterungen Prolog-Erweiterungen CLP(R): Hypothekenberechnung CLP(FD): Kryptarithmetisches Puzzle
11.6.2020 CLP-Resolution Nebenläufige Programmierung CLP-Resolution Nebenläufige Programmierung Fakultät mit FD-Constraints
15.6.2020 Sprachkonstrukte für Nebenläufigkeit Sprachkonstrukte für Nebenläufigkeit Pythagoreische Tripel (Go)
18.6.2020 Nebenläufigkeit in Java Tupelräume Nebenläufigkeit in Java Tupelräume Puffer in Java
22.6.2020 CCP Nebenläufige funktionale Programmierung CCP Nebenläufige funktionale Programmierung Prozesserzeugung in Haskell Synchrone Wertübergabe in Haskell Ping-Ping-Prozesse in Erlang
25.6.2020 Aktoren, Futures STM Ausblick Aktoren, Futures STM Datenbankserver in Erlang Futures in Java Software Transactional Memory in Haskell

Zielgruppe

Studierende in den Masterstudiengängen Informatik und Wirtschaftsinformatik

Voraussetzungen

Grundstudium (1.-4. Semester) in Informatik, insbesondere Fortgeschrittene Programmierung

Inhalt

In dieser Vorlesung werden grundlegende Prinzipien heutiger Programmiersprachen vorgestellt. Dabei steht die praktische Anwendung von Sprachkonzepten zur Lösung von Softwareproblemen im Vordergrund.

Bei der Programmierung kommt es weniger darauf an, irgendein Programm zu schreiben, das eine gegebene Aufgabe löst. Vielmehr muss das Programm so geschrieben sein, dass es verständlich und damit wartbar ist, und es muss auch an neue Anforderungen leicht anpassbar sein. Daher ist es wichtig, die für die Problemstellung geeigneten Programmiersprachen und Sprachkonstrukte zu verwenden. Leider gibt es nicht die für alle Probleme gleich gut geeignete universelle Programmiersprache. Daher ist es wichtig zu wissen, welche Sprachkonzepte für welche Problemstellungen geeignet sind. Diese Vorlesung soll hierzu einen Beitrag leisten, indem ein Überblick über wichtige Sprachkonzepte moderner Programmiersprachen gegeben wird. Dadurch werden die Studierenden in die Lage versetzt, sich einerseits schnell in unbekannte Programmiersprachen einzuarbeiten (da viele Konzepte in den verschiedenen Sprachen immer wieder vorkommen), andererseits sollen sie verschiedene Sprachen und Sprachkonzepte aufgrund ihrer Eignung für ein Softwareproblem kritisch beurteilen können.

Kurzübersicht

  1. Grundlagen (Syntax- und Semantikbeschreibung, abstrakte Datentypen, Ausdrücke, Deklarationen, Bindungen, Blockstruktur)
  2. Imperative Sprachen (Variablen, Datentypen, Kontrollabstraktion, Ausnahmebehandlung, Prozeduren)
  3. Sprachmechanismen zur Programmierung im Großen (Module, Schnittstellen, Objekte, Vererbung, Generizität)
  4. Funktionale Programmiersprachen (referentielle Transparenz, Funktionen höherer Ordnung, Auswertungsstrategien, Typsysteme)
  5. Logische Programmiersprachen (Resolution, Unifikation, Constraints, Datenbanksprachen)
  6. Sprachkonzepte zur nebenläufigen und parallelen Programmierung (Synchronisationskonzepte, Semaphore, Monitore, Message passing, Linda, CCP)

Übungen

Die begleitenden praktischen Übungen werden in verschiedenen Programmiersprachen wie z.B. Java, Haskell und Prolog durchgeführt. Hinweise auf die Benutzung dieser Sprachen findet man im Modul Fortgeschrittene Programmierung.

Modulprüfung

Am Ende der Vorlesung findet eine mündliche Abschlussprüfung statt. Die Zeiten werden später individuell vereinbart.

Ergänzende Materialien zur Vorlesung

Es gibt ein Skript zur Vorlesung, das nur innerhalb der CAU Kiel zugreifbar ist. Dieses Skript ist kein Ersatz für die Vorlesungsteilnahme, es beinhaltet aber den ungefähren Vorlesungsverlauf und ist hoffentlich eine gute Unterstützung. Dieses wird im Verlauf der Vorlesung überarbeitet. Wer darin keine Fehler entdeckt, hat bestimmt nicht ordentlich gelesen. Es wäre es schön, wenn Fehler an Michael Hanus mitgeteilt werden.

Literatur

Die folgende Liste enthält einige Vorschläge zur Vertiefung der Themengebiete der Vorlesung.

  • Mitchell: Concepts in Programming Languages. Cambridge University Press, 2003
  • Appleby/VandeKopple: Programming Languages: Paradigm and Practice. McGraw-Hill, 1997
  • Sethi: Programming Languages: Concepts and Constructs. Addison-Wesley, 2nd ed., 1996
  • Sebesta: Concepts of Programming Languages. Addison-Wesley, 5th ed., 2002
  • Ghezzi/Jazayeri: Programming Language Concepts 2/E. John Wiley & Sons, 1987
  • Arnold/Gosling: The Java Programming Language. Addison-Wesley, 1996
  • Flanagan: Java in Nutshell. O'Reilly, 1999
  • Meyer: Object-oriented Software Construction. Prentice Hall, 1997
  • Bird: Introduction to Functional Programming using Haskell. Prentice Hall, 1998
  • Hutton: Programming in Haskell. 2nd Ed., Cambridge University Press, 2016
  • Thompson: Haskell - The Craft of Functional Programming. Addison-Wesley, 1996
  • Sterling/Shapiro: The Art of Prolog. MIT Press, 1994
  • Hanus: Problemlösen mit Prolog. Teubner, 1987
  • Lloyd: Foundations of Logic Programming, 2nd Ed., Springer 1987
  • Armstrong et al: Concurrent Programming in Erlang, Prentice Hall, 1996