Modul Prinzipien von Programmiersprachen

Wintersemester 2023/24

Arbeitsgruppe Programmiersprachen und Übersetzerkonstruktion

Nr. Art Termine Raum Veranstalter
080031 V4 Mo 10:15 - 11:45 CAP3 - HS. 1 Hanus
    Di 16:15 - 17:45 LMS8 - R.EG.016  
080029 Ü2 Do 14:15-15:45 LMS8 - R.EG.016 Hanus, Bunkenburg

Vorlesungsbeginn

Montag, 30.10.2023(!), 10:15 Uhr, CAP3 - HS. 1

Zielgruppe

Studierende in den Bachelor- und Masterstudiengängen Informatik und im Masterstudiengang Wirtschaftsinformatik sowie mit Nebenfach Informatik

Voraussetzungen

Grundstudium (1.-4. Semester) in Informatik, insbesondere Deklarative oder 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 Deklarative Programmierung oder 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.

Folien und Programme:

30.10.2023: Einführungsfolien (PDF) Diskriminierungsfreies IfI (PDF)
6.11.2023: Syntax: BNF, EBNF (PDF)
7.11.2023: SOS in Prolog
13.11.2023: Semantik von Ausdrücken ...und Anweisungen
27.11.2023: Vereinigungstyp in Rust
4.12.2023: Beispiele zu Besitzerprinzip von Rust
5.12.2023: Klasse Point in Java Klasse Integer und Autoboxing in Java
11.12.2023: Unterklasse Pixel von Point in Java Overloading in Java Abstrakte Klassen in Java
12.12.2023: Quicksort: imperativ vs. funktional Einfache Haskell-Beispiele
19.12.2023: Balck hole detection in Haskell
8.1.2024: funsum (Rank2-Typen) Grenzen der Typinferenz List-Klasse in Scala Case-Klassen in Scala
9.1.2024: Einfache Prolog-Prädikate
15.1.2024: Hypothekenberechnung mit CLP(R) Kryptarithmetisches Puzzle
16.1.2024: Fakultät mit FD-Constraints
22.1.2024: Puffer in Concurrent-Pascal Puffer in Ada Pythagoreische Tripel in Go
23.1.2024: Puffer in Java Beispiele zur Synchronisation mit Linda
29.1.2024: Prozesserzeugung in Haskell Synchrone Wertübergabe in Haskell Echo-Prozesse in Erlang Ping-Ping-Prozesse in Erlang Datenbankserver in Erlang
30.1..2024: Futures in Java Software Transactional Memory in Haskell

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