 Ja, herzlich willkommen zur Veranstaltung Programmierparadigmen im Sommersemester 2020 an der Uni Stuttgart. Normalerweise würden wir das alles im Hörsaal machen. Aufgrund der aktuellen Corona-Situation gibt es das Ganze nun hier im Homeoffice. Ich hoffe, wir kriegen das trotzdem alles hin. Die Veranstaltung wird eingeteilt sein in verschiedene Themenblöcke und jeder Themenblock wiederum hat dann verschiedene Einheiten in sich drin. Das hier ist jetzt der erste Themenblock und darin auch die erste Einheit, in der ich versuchen werde, das Thema ein bisschen einzuführen und zu motivieren, warum es überhaupt interessant ist, sich mit Programmierparadigmen und Programmiersprachen genauer auseinanderzusetzen. Bevor wir das machen, sage ich vielleicht ein paar Worte zu mir selbst. Also, ich bin seit September 2019 Professor an der Uni Stuttgart. Ich habe zuvor in verschiedenen Orten studiert und gearbeitet. Ich habe mal irgendwann angefangen an der TU Dresden Informatik zu studieren. Ich hatte dann die Möglichkeit, für zwei Jahre ins Ausland zu gehen nach Paris und war an der Eco Central Paris. Und für meine Masterarbeit hat es mich dann nochmal weggezogen und ich war an der EPFL in Lossan. Anschließend bin ich erst mal in der Schweiz geblieben und zwar an der ETH Zürich, wo ich promoviert habe oder doktoriert, wie man dort sagt. Und anschließend bin ich mal über den großen Teich nach Kalifornien an die UC Berkeley als Postdoc. Dann ging es wieder zurück nach Deutschland als Assistenzprofessor an die TU Darmstadt. Und bevor ich dann hier in Stuttgart gelandet bin, war ich nochmal in Kalifornien für ein halbes Jahr auf sabbatical bei Facebook, wo ich mir einfach mal die Softwareentwicklung in der Wirklichkeit anschauen wollte und sehen wollte, wie das Ganze so im Silicon Valley läuft. Ich leite hier in Stuttgart eine Forschungsgruppe namens Software Lab. Wir beschäftigen uns mit Werkzeugen und Techniken, die helfen, Softwareentwicklung produktiver zu machen. Also schlussendlich helfen Softwareentwickler in ihrer Arbeit zu unterstützen. Das Ziel dabei ist, dass Software zuverlässiger wird, dass Software sicherer wird, dass Software schneller wird oder effizienter wird. Und für all diese Ziele entwickeln wir Werkzeuge und Methoden, die Softwareentwickler benutzen können, um diese Ziele zu erreichen. Das sind in der Regel Methoden zum Programmetesten, zum Programm analysieren oder zum Verstehen, was die Programme eigentlich genau tun. Wir verwenden da sehr viel traditionelle Programmanalyse-Techniken und in den letzten Jahren auch vermehrt Techniken aus dem machinellen Lernen, wo wir die Programme als Daten betrachten und versuchen aus existierenden Programmen interessante Modelle zu lernen, die dann die Programme analysen für andere Programme implementieren. Wer das Ganze interessant findet und vielleicht auch diese Veranstaltung interessant findet, kann uns gerne mal ansprechen auf Möglichkeiten für Bachelorarbeiten, Masterarbeiten oder auch diverse andere Tätigkeiten, wie z.B. Heavy Jobs. Es gibt da immer wieder Möglichkeiten und wer sich dafür interessiert, bitte einfach mal bei mir melden. So, dann steigen wir mal langsam in das eigentliche Thema ein. Also in diesem ersten Block möchte ich das Thema generell einführen und fangen erstmal mit bisschen Motivation an, also darum, warum es überhaupt interessant ist, sich mit Programmierparadigmen und Programmiersprachen zu beschäftigen. Was ist eigentlich diese ganze Programmierung, um dies geht und welche Rolle spielen daran Programmiersprache? Wie das bei quasi allen Tätigkeiten ist, wo man sich ausdrückt mithilfe einer Sprache, ist die Sprache ganz, ganz essentiell. Es gibt da dieses berühmte Zitat von Ludwig Wittgenstein, der sagt, die Grenzen meiner Sprache bedeuten die Grenzen meiner Welt. Und so ähnlich ist es auch in der Informatik, wo die Sprache ja in der Regel eine Programmiersprache ist und die bestimmte Programmiersprache, die ich benutze, sehr entscheidend ist, wie gut ich darin sein kann, eine bestimmte Aufgabe zu erfüllen. Es gibt im Prinzip die Möglichkeit, jeden Algorithmus in jeder Touring vollständigen Sprache auszudrücken. Von daher könnte man auch sagen, naja, die Programmiersprache ist ja eigentlich nicht so wichtig. Aber de facto gibt es natürlich Sprachen, die bestimmte Arten von Algorithmen oder bestimmte Arten von System oder Ideen viel einfacher implementieren können als andere. Und um zu wissen, wann man welche Sprache benutzen kann, ist es sehr wichtig, sich mit Programmiersprachen überhaupt erst mal zu beschäftigen. Und genau das ist das Ziel dieser Veranstaltung, also das Ziel ist, zu verstehen, wie Programmiersprachen eigentlich wirklich funktionieren und was da eigentlich dahinter steckt, wenn ich so ein Programm in der Programmiersprache schreibe. Also speziell werden wir uns anschauen, wie man zum Beispiel überhaupt spezifiziert, was Teil einer Programmiersprache ist, so dass überhaupt klar ist, was gehört dann eigentlich in diese Programmiersprache und was gehört nicht in diese Programmiersprache. Wir werden es verschiedene Sprachdesignentscheidungen anschauen, verschiedene Sprachfeatures, Sprachparadigmen anschauen und wie die alle zusammenhängen und welche Vor- und Nachteile die vielleicht haben und auch wie die kombiniert werden können in verschiedenen Sprachen. Denn nicht jedes Feature kann man ganz einfach mit jedem anderen Feature kombinieren. Schlussendlich werden wir auch anschauen, wie Programmiersprachen überhaupt implementiert werden. Denn so eine Sprache existiert ja nicht nur theoretisch auf Papier oder in einem Buch, sondern muss schlussendlich auch in Werkzeuge implementiert werden, um praktisch nützlich zu sein. Zum Beispiel in einen Compiler oder eine Virtual Machine, die hilft, die Programme, die in der Sprache geschrieben sind, dann tatsächlich auch auszuführen und wie das Ganze funktioniert. Diese Sprachimplementierung werden wir hier auch ein bisschen anschauen. Warum ist das interessant? Also warum sollte man sich überhaupt damit beschäftigen, als Informatiker, wie Programmiersprachen eigentlich funktionieren? Der offensichtlichste Grund ist natürlich, dass man für eine bestimmte Aufgabe oder für einen bestimmten Zweck die richtige Sprache auswählen möchte. Die richtige Sprache klingt so als Gapestyle nur eine. In der Regel gibt es natürlich mehr als eine geeignete Sprache, aber es ist wichtig, eine geeignete Sprache für jede Aufgabe auszuwählen, weil man damit viel viel produktiver sein kann, als wenn man einfach die eine Sprache nimmt, die man ja schon immer genommen hat. Um diese Entscheidung treffen zu können, also welche Sprache ist dann die geeignete für ein bestimmtes Projekt oder für eine bestimmte Idee, die ich implementieren will, muss man natürlich erst mal einen Überblick darüber haben, welche Sprachen es überhaupt gibt, welche Vor- und Nachteile die haben, welche Features die haben und wann es vielleicht gut ist, diese oder jene Sprache zu benutzen. Ein anderer interessanter Aspekt ist, dass es natürlich hilft, sich mit Programmiersprachen auszukennen, wenn man sich zwischen verschiedenen alternativen Arten eine und dieselbe Sache zu implementieren, entscheiden muss. Es ist oft so, dass man ein Algorithmus so oder so ausdrücken kann mit verschiedenen Sprachfeatures oder mit verschiedenen Sündtags, die schlussendlich eigentlich alle dasselbe meinen. Und jede diese Arten hat oft ihre Vor- und Nachteile und es ist wichtig zu verstehen, welche Vor- und Nachteile das sind. Da kann es um Badbarkeit gehen, da kann es um Effizienz gehen, da kann es um Korrektheit gehen und all diese Trade-offs muss man verstehen, um dann aus diesen alternativen Wegen eine bestimmte Idee zu implementieren, eine gute für den jeweiligen Zweck auswählen zu können. Im dritten Grund, warum es gut ist, sich mit Programmiersprachen auszukennen, ist, dass man damit viel besser die verschiedensten Werkzeuge nutzen kann, bis es ringsum jede Programmiersprache gibt. Da gibt es natürlich Compiler und Virtual Machines und Interpreter und ähnliches, um die Programme erstmal auszuführen. Aber außerdem gibt es natürlich noch eine ganze Reihe anderer Tools, von denen Sie wahrscheinlich auch einige schon verwendet haben. Zum Beispiel interaktive Debugger oder IDIs, die durch Code Completion helfen, den Programmtext schneller zu schreiben oder Analyse Tools, die sich das Programm anschauen und versuchen darin Fehler zu finden, so dass diese Fehler eben nicht erst zur Laufzeit auftreten, und vielleicht schon vorher gefunden werden. Um all diese Werkzeuge besser zu verstehen und um besser auswählen zu können, welches Werkzeug jetzt vielleicht das geeignete ist und um zu verstehen, was diese Werkzeuge können oder vielleicht auch nicht können, muss man Programmiersprachen verstehen. Denn was diese Werkzeuge machen, ist, Programmiersprachen zu analysieren. Also muss man auch erstmal die Sprache, die dahinter steht, zumindest ein Stück weit verstehen. Der vorletzte Punkt hier ist, dass einige Sprachen doch oft sehr obskure Sprachfeatures haben. Und diese obskuren Sprachfeatures, auch wenn man die selbst vielleicht nicht verwendet, doch hier und da auftreten. Und irgendwann wird man an den Punkt kommen, dass es Code gibt, in dem man anders geschrieben hat und man den jetzt eigentlich gern verstehen möchte und dann wird aber da dieses eine Feature benutzt und wenn man das dann nicht versteht, dann versteht man den ganzen Code eigentlich nicht. Und für diese Situation möchte ich Sie im Prinzip bewahren, indem wir uns hier möglichst viele Sprachfeatures anschauen und Sie die jetzt schon mal sehen und verstehen, sodass es später vielleicht einfacher ist, die dann auch in der Arbeitswelt oder was auch immer sehr anschließend machen, anwenden zu können. Und schlussendlich der letzte Punkt hier auf der Folie, gibt es manchmal die Möglichkeit, ein Sprachfeature, was in einem bestimmten Sprache fehlt, durch andere Sprachfeatures zu ersetzen oder zu simulieren. Und um das tun zu können, muss man aber erstmal verstehen, was diese Sprachfeatures überhaupt sind und wie man die entsprechend einsetzt, um vielleicht das, was die eine Sprache, die man aus welchem Grund auch immer jetzt benutzt, nicht bietet, dann trotzdem zur Verfügung zu haben. Was sehr wichtig ist, ist, dass es in dieser Veranstaltung nicht um eine bestimmte Sprache geht, die wir von A bis Z durchiterieren und am Ende sagen können, Juhu, wir können jetzt diese eine Sprache, sondern es geht um die Konzepte, die dahinter stehen. Also wir werden uns nicht nur eine Sprache anschauen, sondern wir werden den Kurs anhand von Programmiersprachen-Konzepten aufbauen und natürlich viele, viele verschiedene Sprachen benutzen und Beispiele aus diesen verschiedenen Sprachen benutzen, um diese Konzepte dann zu erläutern und genauer zu studieren. Der Grund, warum wir uns auf die Konzepte konzentrieren und nicht eine bestimmte Sprache oder vielleicht zwei oder drei Sprachen nur in den Fokus setzen, ist, dass die Konzepte viel, viel langlebiger sind. Die Sprachen kommen und gehen, und diese sind vermutlich auch noch in einigen Jahrzehnten da. Das heißt, wenn Sie jetzt diese Konzepte richtig verstehen, sind Sie für das Berufsleben dann auch langfristig gewappnet, eben weil Sie dann in der Lage sein werden, zukünftige Sprachen oder Sprachen, die früher vielleicht gar nicht so wichtig waren, aber nun plötzlich wichtig sind, auch verstehen zu können, weil Sie eben sehen, aha, das ist ja dieses Konzept, das ist ja jedes Konzept, natürlich, das kenne ich ja noch aus der Programmierbaratik mit Vorlesung. Wenn Sie vielleicht schon mit einer Sprache sehr vertraut sind, weil die in anderen Kursen dran kamen oder weil Sie da selbst schon viel mitgearbeitet haben, dann können Sie vielleicht fragen, na ja, reicht das vielleicht nicht auch, wenn ich jetzt diese eine Sprache kenne, die kann doch eigentlich alles. Und was auch immer diese Sprache ist, ich kann Ihnen versichern, die Antwort ist Nein, denn in der Wirklichkeit werden Systeme aus verschiedensten Sprachen, die auch verschiedenste Sprachparadigmen enthalten, zusammengesetzt und gebaut. Das ist ein bisschen kleiner Erfahrung, die ich bei Facebook gemacht habe. Die Software, die hinter Facebook steht, ist ein sehr, sehr komplexes System und zu meiner Überraschung auch, werden da sehr, sehr viele Sprachen eingesetzt. Das ist eine wilde Mischung aus verschiedensten Sprachen und Sprachparadigmen, die da zusammenkommen. Und wenn man irgendwo was ändern will, muss man in der Regel eben nicht nur diese Einsprache arbeiten, sondern muss eine ganze Reihe von Sprachen in den Kommunen des Systems verstehen, um überhaupt irgendwas tun zu können. Das heißt, wenn Sie an irgendeinem interessanten komplexen System mitarbeiten wollen, ist eine Sprache mit hoher Wahrscheinlichkeit nicht genug. Der andere Grund, warum eine Sprache mit Sicherheit nicht genug ist, ist, weil sich die Welt weiterentwickelt. Ich habe hier mal so einen kleinen Grafen, der zeigt, wie populär verschiedene Programmiersprachen in den letzten 16, 17 Jahren waren. Und was man sieht, ist, dass sich das ganz schön ändert über die Zeit. Es ist gar nicht so wichtig, welche Sprache da gerade ganz oben ist oder vielleicht auch nicht soweit oben ist. Was wichtig ist, ist, dass Sprachen, die vor einigen Jahren vielleicht vollkommen bedeutungslos waren, plötzlich relevant sind und auch neue Sprachen dazu gekommen sind, die es vielleicht vor 16 oder mehr Jahren noch gar nicht gab. Und gleichzeitig Sprachen, die vielleicht mal ganz wichtig waren, dass die Sprache mit Sicherheit nicht mehr gelöst werden würde, dann hätten sie einfach nicht das Rüstzeug um langfristig mit den Entwicklungen mitzuhalten und sich auch mit neuen Sprachen beschäftigen zu können. Gut, das soll es auch schon wieder gewesen sein für diesen ersten kleinen Einheit vom ersten Block. Ich hoffe, das klang jetzt so halbwegs interessant, denn es folgen ja noch eine ganze Reihe anderer Blöcke, um mir Paradigmen genauer anschauen. Und damit danke erst mal fürs Zuhören und bis zum nächsten Mal.