Modul Fortgeschrittene Programmierung

Wintersemester 2020/21

Arbeitsgruppe Programmiersprachen und Übersetzerkonstruktion

Nr. Art Termine Raum Veranstalter
080038 V4 Mo 10:15 - 11:45 Online Hanus
    Di 14:15 - 15:45 Online  
080037 Ü2 Mi 10-12/16-18, Do 8-10, 10-12, 14-16 Online Bunkenburg, Prott, Teegen
080061 PÜ1 1.3. - 12.3. (oder 8.-19.3.) HRS3 - R.501-503 Teegen

Organisatorisches

Die Vorlesung beginnt am Montag, 2.11.2020, 10:15 Uhr. Wegen der Corona-Krise wird die Vorlesung virtuell stattfinden. Die erste Vorlesung wird live als Videokonferenz stattfinden. Die Zugangsdaten erhalten alle Teilnehmer per Email. Dazu ist es notwendig, dass alle Teilnehmer dieses Modul in der StudiDB bis zum 31.10.2020 belegen! Für alle weiteren Vorlesungen werden 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.

Alle Teilnehmer müssen dieses Modul in der StudiDB belegen, damit sie nachher eine Prüfung ablegen können. Außerdem sollten sich alle Teilnehmer dieses Moduls auch im iLearn anmelden (erst nach der ersten Vorlesungsstunde!). Weitere Informationen hierzu werden zur ersten Vorlesungsstunde bereit gestellt. Eine frühere Anmeldung ist nicht erforderlich. 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 Folien, Programme
2.11.2020 Nebenläufigkeit Einführungsfolien ProducerConsumer.txt Philosophers.txt
3.11.2020 Threads Thread-Zustand Synchronisation ConcurrentPrintThread.java ConcurrentPrint.java Account.java State.java Storage.java SynchCollections.java PrintState.java
9.11.2020 Kommunikation Interrupts PrintAllStates.java Buffer1.java Buffer1Synch.java
10.11.2020 Verteilte Programmierung ObjectStreamDemo.java FlipServer Interface FlipServer Implementierung FlipServer Client FlipServer Client mit Synchronisation
16.11.2020 Funktionale Programmierung: Einführung Einfache Haskell-Funktionen
17.11.2020 Lokale Deklarationen und Datantypen Lokale Deklarationen Datentypen
23.11.2020 Polymorphismus Polymorphe Funktionen und Datentypen
24.11.2020 Muster Funktionen höherer Ordnung Muster Funktionen höherer Ordnung
30.11.2020 Generische Programmierung Funktionen höherer Ordnung auf Listen
1.12.2020 Funktionen als Daten HO in Ruby HO in Java Feld als Funktion Kombinatoren für Funktionen Funktionen höherer Ordnung in Ruby Map in Java Feld von Funktionen in Java
7.12.2020 Typklassen Map in JavaScript Typklassen
8.12.2020 Reduktionsstrategien
14.12.2020 Rechnen mit unendlichen Strukturen Unendliche Datenstrukturen
15.12.2020 List Comprehensions, Ein/Ausgabe List comprehensions I/O-Aktionen
4.1.2021 Dateien und Module Functor-Struktur Dateioperationen Nats-Modul Main Hauptmodul Functor-Struktur
5.1.2021 Applicative-Strukturen Monaden Applicative-Struktur Monadische Strukturen
11.1.2021 Eigenschaftsbasiertes Testen Testen mit QuickCheck Fallstudie: Peano-Arithmetik
12.1.2021 Datenabstraktion Rationale Zahlen Test für ADT Rationale Zahlen Mengen als Funktionen Testen der Mengengesetze Mengen als Listen
18.1.2021 Einführung in die Logikprogrammierung Mengen als geordnete Listen Verwandtschaftsbeispiel in Haskell Verwandtschaftsbeispiel in Prolog
19.1.2021 Prolog-Syntax und erste Programmiertechniken Listenelement Landkartenfärbung Sortieren durch Permutieren
25.1.2021 Relationen und Resolution Listenkonkatenationen Peano-Zahlen
26.1.2021 Unifikation und Resolution
1.2.2021 Backtracking, Negation, Arithmetik Verwandtschaftsbeispiel mit Negation Endlosschleifen Cut-Operator Fakultät
2.2.2021 Constraint-Programmierung Schaltkreisanalyse Hypotheken SEND+MORE=MONEY n-Damen-Problem
8.2.2021 Meta-Programmierung Prädikate höherer Ordnung Verwandschaftsbeispiel mit Kapselung Meta-Interpretierer für Prolog Verwandschaftsbeispiel mit Ein/Ausgabe
9.2.2021 Tracing, Differenzlisten, Curry Meta-Interpretierer mit Tracing Differenzlisten Grammatiken in Prolog Verwandschaftsbeispiel (Curry) Curry-Beispiele

Zielgruppe

Studierende im 1-Fach-Bachelorstudiengang Informatik, im 2-Fach-Masterstudiengang Informatik, im Masterstudiengang Wirtschaftsinformatik sowie Studierende mit Nebenfach Informatik

Dieses Modul beinhaltet auch das Modul Inf-FPKonz (Fortgeschrittene Programmierkonzepte). In diesem Fall muss der erste Teil zur nebenläufigen und verteilten Programmierung nicht gehört werden, sondern das Modul beginnt mit der funktionalen Programmierung am Montag, 16.11.2020!

Dieses Modul beinhaltet auch das Modul Inf-EinfFP (Einführung in die Funktionale Programmierung). In diesem Fall muss der erste Teil zur nebenläufigen und verteilten Programmierung ebenfalls nicht gehört werden, sondern das Modul beginnt mit der funktionalen Programmierung am Montag, 16.11.2020! Ebenso muss dann der Teil zur logischen Programmierung nicht gehört werden, sodass der Vorlesungsteil Anfang Januar endet. Die Klausur findet aber erst nach dem Praktikum (s.u.) statt.

Voraussetzungen

Solide Programmierkenntnisse einschließlich in der objektorientierten Programmierung mit Java, wie sie beispielsweise im Grundmodul Programmierung erworben werden können.

Inhalt

In dieser Vorlesung werden forgeschrittene Programmierkonzepte, die über die in den ersten Studiensemestern erlernte Programmierung hinausgehen, vorgestellt. Dabei wird anhand verschiedener Programmiersprachen der Umgang mit den Konzepten der wichtigsten Programmierparadigmen vermittelt. Konzepte zur nebenläufigen und verteilten Programmierung werden mit der Sprache Java vorgestellt und geübt. Moderne funktionale Programmierungtechniken werden am Beispiel der Sprache Haskell gezeigt. Logische und Constraint-orientierte Programmierung wird in der Sprache Prolog vermittelt.

Funktionale Programmierung in der Praxis

Ein Schwerpunkt der Vorlesung bildet die funktionale Programmierung. Dies liegt daran, dass funktionale Programmiertechniken und Sprachkonstrukte zu besser strukturierten Programmen führen und daher auch in zum Teil eingeschränkter Form in vielen modernen Programmiersprachen zu finden sind. Dies ist in einem kürzlich erschienen Artikel in der Zeitschrift CACM genauer erläutert. Allgemein gilt, dass die Verwendung funktionaler Programmierkonzepte zu kürzeren, besser strukturierten Programmen und insbesondere durch fortgeschrittene Typkonzepte zu zuverlässigeren Softwaresystemen führt.

Funktionale Programmiersprachen sind nicht nur vom akademischen Interesse, sondern sie werden auch in der Praxis immer stärker eingesetzt. Zum Beispiel verwendet Jane Street Capital, eine Finanzhandelsfirma mit Vertretungen in New York, London und Hong Kong, die funktionale Sprache OCaml für ihre Anwendungen (dazu gibt es auch einen Blog). Die Firma Galois mit Hauptsitz in Portland (Oregon, USA) verwendet funktionale Programmiersprachen und -konzepte zur Entwicklung sicherheitskritischer Systeme.

Warum gerade im Finanzbereich funktionale Programmierung eingesetzt wird, liegt auch daran, dass Fehler in einer Software existenzielle Probleme verursachen kann, wie man am Fall von Fall Knight Capital sehen kann.

Hier sind noch ein paar weitere Berichte über den industriellen Einsatz funktionaler Programmierung:

Forscher bei Microsoft fordern in einem Artikel der Zeitschrift CACM, dass Informatikstudierende so früh wie möglich funktionale Programmiersprachen erlernen sollten. Und es gibt natürlich auch Jobs für Haskell-Programmierer.

Praktikum

Bestandteil des Moduls Inf-FortProgP ist ein Praktikum. Dieses findet nach der Vorlesung und dem ersten Prüfungszeitraum in der Zeit vom 1.-12.3.2021 statt. Da die erfolgreiche Teilnahme am Praktikum eine Zulassungsvoraussetzung zur Klausur ist, besteht für dieses Praktikum prinzipiell Anwesenheitspflicht. Für das Praktikum ist eine separate Anmeldung erforderlich. Informationen dazu werden in der Vorbesprechung zum Praktikum mitgeteilt. Die Vorbesprechung und Einführung zum Praktikum findet am 1.3.2021 statt.

Modulprüfung

Am Ende der Vorlesung findet nach dem Praktikum eine schriftliche Abschlussprüfung statt. Voraussetzung zur Zulassung zur Klausur ist die regelmäßige Bearbeitung der Übungsaufgaben (s.u.) und die erfolgreiche Teilnahme am Praktikum.

Die erste Modulprüfung findet am Dienstag, 16. März 2021, als Online-Prüfung statt. Die zweite Modulprüfung findet voraussichtlich am Freitag, 16. April 2021, statt. Eine vorherige Anmeldung in der StudiDB ist zur Teilnahme erforderlich.

Ergänzende Materialien zur Vorlesung

Es gibt ein Skript zur Vorlesung (im PDF-Format, nur innerhalb der CAU Kiel zugreifbar!), welches parallel zur Vorlesung überarbeitet wird. Dieses Skript ist kein Lehrbuch, aber es beinhaltet den ungefähren Vorlesungsverlauf. Daher sollte neben dem Lesen des Skripts auch immer die Vorlesung besucht werden, um über den aktuellen Stand informiert zu sein!

Literatur

  • G. Hutton: Programming in Haskell, 2nd Ed., Cambridge University Press, 2016
  • R.. Bird: Thinking Functionally with Haskell, Cambridge University Press, 2015
  • S. Thompson: Haskell - The Craft of Functional Programming, 3rd Ed., Addison Wesley, 2012
  • L. Sterling, E. Shapiro: The Art of Prolog, 2nd Ed., MIT Press, 1994
  • T. Frühwirth, S. Abdennadher: Constraint-Programmierung, Springer, 1997
  • D. Lea: Concurrent Programming in Java, 2nd Ed., Addison Wesley, 2000
  • P. Hyde: Java Thread Programming, Sams Publishing, 1999

Übungen

Zur Teilnahme an der Modulprüfung müssen die Übungsaufgaben regelmäßig und sinnvoll bearbeitet werden. Hierzu wird für jede Aufgabe festgehalten, ob diese sinnvoll bearbeitet wurde ("Sinnpunkte"). Für eine Zulassung zur Klausur müssen in jedem der drei Bereiche nebenläufige/verteile Programmierung, funktionale Programmierung und logische Programmierung mindestens 50% der Sinnpunkte erreicht werden.

Die Abgabe der Übungen soll vornehmlich über das iLearn Übungssystem erfolgen.

Die in der Vorlesung behandelten Programmiersprachen sind auf den Institutsrechnern installiert und auch im Internet sind freie Implementierungen von Java, Haskell und Prolog verfügbar.

Anmerkung zur Verwendung von Prolog: Zur Lösung der Übungsaufgaben kann man das frei verfügbare SWI-Prolog-System verwenden. Um einen leichteren Einstieg in Prolog zu haben, sollte man in dieser Vorlesung zunächst eine Erweiterung für SWI-Prolog verwenden, die eine bessere Suchstrategie implementiert. Hierzu gibt es zwei Möglichkeiten (unter der Voraussetzung, das SWI-Prolog installiert ist und durch den Aufruf "swipl" gestartet werden kann):

  • Für Unix/Linux: Man kopiere dieses Bash-Skript in ein bin-Verzeichnis, das im eigenen Pfad liegt. Dann kann man durch das Kommando fortprog-swipl das erweiterte SWI-Prolog-System aufrufen. Alternativ kann man das Bash-Skript auch in das Verzeichnis legen, wo die Prolog-Programme sind, und dann das SWI-Prolog-System mit dem Kommando ./fortprog-swipl aufrufen.
  • Für andere Systeme: Man kopiere dieses Prolog-Programm in das Verzeichnis, wo sich die Prolog-Programme befinden, und starte das SWI-Prolog-System mit dem Kommando swipl -q -s fortprog.

Nach diesem Start von SWI-Prolog kann man wie üblich mit [myprog]. sein eigenes Programm laden und ausprobieren. Zu beachten ist, dass bei Benutzung dieser Erweiterung die Prolog-Programme keine Negation oder Cuts enthalten und auch keine anderen Module importieren, was aber am Anfang sowieso nicht verwendet wird.