Modul Fortgeschrittene Programmierung

Wintersemester 2017/18
Arbeitsgruppe Programmiersprachen und Übersetzerkonstruktion

Nr. Art Termine Raum Veranstalter
080038 V4 Mo 10:15 - 11:45 CAP3 - HS.2 Hanus
    Di 14:15 - 15:45 CAP3 - HS.2  
080037 Ü2 Mi 10-12/16-18, Do 8-10, 10-12   Dylus, Hanus, Teegen, Tikosvky
080002 PÜ1 26.2. - 9.3. 26.2., 9:00: CAP3 - LMS6 - R.11 Teegen, Tikosvky

Vorlesungsbeginn

Montag, 23.10.2017, 10:15 Uhr, CAP3 - HS.2

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, 6.11.2017!

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. 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 26.2.-9.3.2018 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. Eine Vorbesprechung und Einführung zum Praktikum findet am 26.2.2018, 9:00 Uhr im LMS6-Raum 11 statt.

Modulprüfung

Am Ende der Vorlesung findet nach dem Praktikum eine schriftliche Abschlussprüfung statt. Die erfolgreiche Teilnahme am Praktikum ist die Voraussetzung zur Zulassung zur Klausur.

Die erste Modulprüfung findet am Mittwoch, 14. März 2018, von 14:00 bis 17:00 Uhr in der Olshausenstraße 75 (Hörsäle 1, 2, 3) statt. (Einsichtnahme: Dienstag, 20.3.2017, 15-16 Uhr im Raum CAP4-715). Die zweite Modulprüfung findet am Freitag, 6. April 2018, von 12:00 bis 15:00 Uhr im Hörsaal OHP5 - [Chemie I] 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!

Folien und Programme:

23.10.2017: Einführung (PDF) ProducerConsumer
24.10.2017: Philosophers.txt ConcurrentPrintThread.java ConcurrentPrint.java
30.10.2017: PrintState.java Buffer1.java
6.11.2016: ObjectInputStreamDemo.java FlipServer Interface FlipServer Implementierung FlipServer Client FlipServer Client mit Synchronisation
7.11.2017: Einfache Haskell-Funktionen
13.11.2017: Lokale Deklarationen Datentypdeklarationen
14.11.2017: Polymorphe Daten und Funktionen
20.11.2017: Pattern Matching Funktionen höherer Ordnung
21.11.2017: Funktionen höherer Ordnung (Fortsetzung) Funktionen höherer Ordnung auf Listen Kontroll- und Datenstrukturen al Funktionen höherer Ordnung
27.11.2017: Kombinatoren für Funktionen Funktionen höherer Ordnung in Ruby Map in Java Feld von Funktionen in Java Element einer Liste in Haskell
28.11.2017: Typklassen
4.12.2017: TermersetzungssystemeLazy-Auswertung
5.12.2017: Unendliche Strukturen
11.12.2017: I/O-Aktionen
12.12.2017: Zeilen numerieren CSV Show/Read Nats-Modul Main Hauptmodul
18.12.2017: Testen mit QuickCheck
19.12.2017: Testen mit eigenen Daten Fallstudie: Peano-Arithmetik Rationale Zahlen
8.1.2018: Test für ADT Rationale Zahlen Mengen als Funktionen Mengen als Listen Testen der Mengengesetze
9.1.2018: Mengen als geordnete Listen Verwandtschaftsbeispiel in Haskell Verwandtschaftsbeispiel in Prolog Landkartenfärbung
15.1.2018: Listenoperationen
16.1.2018: Peano-Zahlen
22.1.2018: Unendliche Ableitungen
23.1.2018: Verwandtschaftsbeispiel mit Negation Cut-Operator Fakultät Schaltkreisanalyse
29.1.2018: Hypotheken SEND+MORE=MONEY n-Damen-Problem
30.1.2018: Prädikate höherer Ordnung Verwandschaftsbeispiel mit Kapselung Meta-Interpretierer für Prolog
5.2.2018: Verwandschaftsbeispiel mit Ein/Ausgabe Differenzlisten Grammatiken in Prolog
6.2.2018: Meta-Interpretierer mit Trace-Ausgabe Curry-Beispiele Peano-Arithmetik in Curry

Literatur

  • G. Hutton: Programming in Haskell, 2nd Ed., Cambridge University Press, 2016
  • R.. Bird: Introduction to Functional Programming using Haskell, Prentice Hall, 1998
  • S. Thompson: Haskell - The Craft of Functional Programming, Addison-Wesley, 1996
  • 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

Die Abgabe der Übungen soll vornehmlich über das iLearn Übungssystem erfolgen. Hierzu wird man automatisch angemeldet, wenn man sich bei der StudiDB angemeldet hat.

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.