Ja. Okay. Dann guten Tag, meine Damen und Herren.
Ich freue mich, dass Sie so zahlreich erschienen sind für die funktionale Programmierung.
Ich hätte gleich zu Anfang eine Bitte. Sie haben hier
im Hintergrundgeräusch schon gemerkt, dass dieser Raum ja akustisch eine Katastrophe ist.
Und wenn wir ein bisschen Geschwätz im Hintergrund haben, also gleich so laut,
dass kaum eine, was von der Vorlesung verstehen wird.
Deshalb bitte, Wenn sie ein Schwätzchen halten wollen,
einfach vor die Tür und dann wieder zurückkommen. In diesem Semester werden sie merken,
wir werden uns mit einem Teil der Programmierung befassen,
der sich sehr, sehr wesentlich von dem unterscheidet,
was sie bisher kennengelernt haben, im Rahmen der objektorientierten,
imperativen Programmierung im Jahr war.
Also kurz gesagt, es wird in dieser Vorlesung alles anders.
Und diese Erkenntnis, dass es anders ist, wird so
bei ihnen, denke ich mal, drei Schritten vorgehen.
Jedenfalls ist meine Erfahrung. Zu Anfang müssen wir im Wesentlichen Fingerübungen machen,
Sachen ausprobieren, dass sie sich mit dem System auskennen,
die wir benutzen, dass sie das Imperative Denken aus dem Kopf kriegen und stattdessen funktional Denken üben.
Das wird in ziemlich leicht vorkommen und wahrscheinlich,
die wollen sie gar keine Zeit ins Üben investieren.
Ich kann nur sagen, in dieser Phase wurde es
konzeptuell noch nicht so anstrengend. Es ist essentiell,
dass sie es üben und die Zeit nutzen,
es auszuprobieren
Moment, wo es komplizierter wird, nicht mehr im Handbuch lesen müssen.
Also nutzen Sie die Anfangszeit, wo es Baby leicht ist,
um die Sachen auszuprobieren. Und das reckelt System,
mit dem wir arbeiten, werden spielerisch zu erkunden.
Dann müssen Sie nicht mehr drüber nachdenken, welche Klammer auf uns zugehört,
wenn Sie drüber nachdenken sollen, ob ein Rekursionsschema korrekt ist.
Und zweite Sache, weshalb das so wichtig ist,
die Sprache Record, die wir benutzen,
die ist zwar in ein didaktisches System angebettet,
was von sich behauptet ist, kann Fehler erkennen und so weiter,
aber ich sage es Ihnen gleich,
Sie werden wirklich ohne irgendeinen Schutz- und Rüstung da programmieren müssen.
Es ist wenig Fehlererkennung vorhanden. Das Beste ist,
man macht erst gar keine Fehler, wenn man das Programm schreibt.
Die sind schwer zu finden. Ja, das heißt,
dann wenn es schwieriger wird,
sollten sie von vornherein die Programme richtig schreiben,
dass sie nicht die Nacht sich um die Ohren schlagen müssen mit der Fehlersuche.
Okay, und wenn wir dann in der zweiten Semesterhelfe wirklich
interessante Konzepte ansprechen, werden sie in dem Moment Das ist,
was ich befürchtet habe
So, aber ich hoffe, dass so gegen Semesterende,
wenn sie gesehen haben, was möglich ist,
sie die Lust überkommt, das wirklich auszuprobieren,
weil wirkte erst gegen Ende bei den schwierigeren Sachen,
wird es wirklich spannend und man sieht,
warum wir uns das alles antun.
Deshalb... Vielleicht haben sie dann Lust im Semester drauf,
schlichtweg das auch im Programmierpraktikum auszuprobieren. Kommen wir mal einfach hinein.
Dieses Semester sind wir extrem ausgebucht. Die Übungsgruppen Sind alle
bis zur Obergrenze ausgeschöpft. Wir haben noch zwei Termine,
wo wir einen bis zwei unterbringen könnten,
in der Donnerstagsgruppe acht bis zehn und in all den Übungsgruppen,
wo jetzt fünftens steht, als Teilnehmerzahl.
Ich zeige Ihnen diese Folie mal, Sie wissen ja hoffentlich,
welche Übungsgruppe Sie sich ausgesucht haben, dass Sie dich schon mal
den Namen von der Übungsleiterin oder dem Übungshelfer einbringen, einprägen.
Wer hat noch keine Gruppe abbekommen? Eins, zwei.
Okay, würden für Sie denn diese Termine passen,
die jetzt frei sind
Was ich abgemacht habe im Studienbüro ist das folgende,
melden Sie sich bitte in irgendeine Gruppe an,
wo Stine sie reinlässt,
damit sie offiziell zugelassen sind und setzen sich dann in eine der anderen Gruppen.
Aber bitte, bitte schicken Sie Ihre E-Mail,
Ihre Lösungen zum Korrigieren, zu demjenigen, dessen Gruppe sie sind.
Also wir wollen den Korrekturaufwand gleichhalten in den Gruppen, ja?
Also jeder sollte seine Lösung in der Gruppe abgeben und sie
per E-Mail zu dem Übungshelfer,
zu der Übungshelferin schicken,
für die
sie eingetragen sind ins Diene
Bringt mich gleich dazu, wie die Übung in diesem Semester laufen,
anders als in den Semestern davor,
werden wir nicht mehr Händchen halten der Weise,
neben ihnen am Terminal sitzen und Präsenzübungen am Rechner machen,
sondern sie bekommen jede Woche einen neuen Aufgabenzettel,
den sie zu Hause bearbeiten.
Bitte im Team von zwei oder drei Personen, ja,
also möglichst keine Einzellösung abgeben.
Wir möchten gern, dass sie die Aufgaben mit jemand anderem
durchsprechen und die gemeinsam lösen.
Erstellen die Lösung,
schicken sie per E-Mail
An die Person, die ihre Gruppe betreut. Und wir werden
das dann in den Übungsterminen besprechen, Vorlesungsinhalte nochmal nachbesprechen und so weiter.
Aber wir sitzen in den Übungsterminen nicht mehr am Rechner und programmieren in Echtzeit.
Also einfach die Zeit, nachdem die Aufgabe ausgegeben ist,
nutzen sie in ihrem Team bearbeiten, Lösungen per E-Mail an ihre Gruppenleiter schicken.
Und dann kann es losgehen. Die allererste Übungsstunde wird allerdings so sein,
dass wir in den Übungen einfach das Record-System,
mit dem wir programmieren werden,
mitbringen und dann eine Präsenz Übung lösen und das gemeinsam durchsprechen,
sodass sie sehen, welche Werkzeuge da sind,
dass sie es ausprobieren können.
Und sie sollten in der Lage sein,
sich selbst die Entwicklungsumgebung auf ihrem Rechner zu installieren.
Also es gibt Linux-Versionen, Windows-Versionen, Mac-Versionen.
Ich werde es hier mit der Mac-Version vorstellen.
Okay. Ja, dann erst mal so viel.
Toll. Das darf nicht wahr sein.
Wollen wir nicht doch lieber die Vorlesungsaufzeichnungen mit Umgebungstonen machen
Also all diese Schreckschüsse durch die Geständen,
die ganze Zeit nachher kriegt hier jemand einen Herzinfarkt.
Und ich muss ab und zu an meinen Rechner ran.
Dann könnt ihr alle studieren, denn bei der Playto-Go,
aber dann nicht mehr der Saison von der Qualität.
Ja, also wenn sie das wollen,
sollen sie bitte kommen und sich hier hinsetzen.
Gut. Das ist schlecht. Dann kann ich
die Folge nicht erkennen, was das Problem ist.
Ja, ja
Grade. Karte gibt es noch, um zu arbeiten.
Wie ist das irgendwie, Athen? Habt ihr Ersatz irgendwie was?
Ein Orbit-Projekte drauf, dann ist es nicht so ruhig.
So klingt es am Moment. Wir haben uns nicht
so verkabelt
Okay. Gut, kommen wir mal gleich zum Ende der
Veranstaltung in der Reihenfolge, wie die Folien hier geschrieben habe.
Ich gehe natürlich davon aus, sie sind alle hier,
weil sie den Stoff lernen wollen,
aber einen Nebeneffekt sollte ja sein,
dass sie die Modulprüfung bestehen am Ende und ihre Leistungspunkte bekommen,
also traditionsgemäß ist diese Vorlesung immer der Vorreiter in der Klausurperiode.
Also wir werden am 4.2. gleich am ersten Tag in den Semesterferien,
die Klausur schreiben. Das heißt, die Semester haben sie
praktisch so für diese Klausur keine zusätzliche Vorbereitungszeit, ja.
Wir müssen während der Vorlesungszeit so mitarbeiten, dass man,
wenn am Ende des Semesters die Klappe fällt,
sich in die Klausur setzen kann und sie schreiben kann.
Die zweite Klausur ist in der Mitte der Ferien und erfahrungsgemäß
hat die Hälfte alles wieder vergessen bis zu dem Termin hin.
Wir werden noch ein Tutorium reinschieben, wo wir die erste ausgefallene Übung nachholen.
Das heben wir immer auf als Tutorium vor der Wiederholungsklausur.
Sie können dann, sie sich gut vorbereitet haben auf die Klausur,
die letzten Fragen noch mit ins Zitotorium bringen,
sodass sie dann auch für die Wiederholungsklausur vorbereitet sind.
Aber stellen Sie sich bitte seelisch darauf ein,
dass Sie auf jeden Fall die erste Klausur versuchen sollten und bei den meisten klappt es ja auch.
Wir werden die Übungsaufgaben so machen in der zweiten Semesterhälfte,
dass Sie immer einen Teil schlichtweg Klausurtraining enthalten,
sodass Sie eine Chance haben sollten, dann die Dinge zu wiederholen,
die in Vergessenheit geraten sind und das,
was für die Klausur wichtig ist, drankommt.
Okay, die Klausur wird zweistündig sein,
wie üblich werden wir sie bestehen lassen,
wenn sie die Hälfte aller Punkte kriegen und dann werden wir sehen.
Bisher konnten wir bei den Klausuren es immer zulassen,
dass man das Skript mitbringt. Können wir diesen Semester nicht machen,
weil wir schlichtweg keine Skripte mehr drucken dürfen.
Das heißt also diesmal bitte für die Klausur davon ausgehen,
sie sollten das Wissen im Kopf haben und nicht im Skript neben sich auf dem Tisch.
Und wir werden die Klausurbögen so machen, dass alles,
was man gern nachschlagen möchte, wie syntax von Sprachkonstrukten und so weiter,
dass das im Anhang des Klausurbogens drin ist.
Also wenn sie sich die muss der Klausuren aus dem Vorjahr anschauen,
werden sie sehen, was ein zusätzlicher Info in ihrem Klausurbogen erwartet werden kann.
Joje, gut. Unsere Themen, wir haben im Wesentlichen
drei Schwerpunkte in dieser Vorlesung, über die wir sprechen werden.
Das eine ist zunächst mal in der Einführung heute,
was ist mit den verschiedenen Programmierstilen gemeint?
Sie werden aus dem Java-Teil und aus der Einführung in SE1
und 2 schon wissen, was Programmierstile sind.
Da ist bei mir so marrisch gesagt worden, ja,
die gibt es und wir machen den
In dieser Vorlesung wollen wir trainieren, dass sie erkennen,
wie man Stilreihen programmiert. Und das Wesentliche der Programmierstile
verinhaltlichen. Deshalb werden wir auch bei den Übungsaufgaben,
wenn sie etwas abgeben, in der Algorithmus funktioniert,
den noch lange nicht als richtig werten,
wenn sie uns ein imperatives Programm abgeben in einem funktionalen Programm Mirkurs.
Also wenn sie in den Handbüchern zureckelt und so weiter,
Kontrollelemente sehen, Funktionen, die einen Namen mit Ausrufezeichen,
Bang endet, weiterblättern.
Die dürfen sie ohnehin nicht verwenden. Das sind die
imperativen Sprachelemente und dir das Bang,
was für Seelen gibt,
Punktabzug im Programm
Sowas wie eine Wertzuweisung. Können Sie erst mal vergessen für
den Anfang dieses Semesters? Gut, das Wesen der Funktionalen Appstraktion
werden wir an vielen Beispielen sehen. Ich werde auch versuchen,
Ihnen die Vorteile zu vermitteln, die es mit sich bringt.
Zweiter wichtiger Baustein in dieser Vorlesung ist die Frage,
was ist die Semantik einer Programmiersprache?
Was bedeutet das Programm, das wir schreiben?
Und das ist in der funktionalen Welt einfacher zu fassen,
weil wir im Wesentlichen es mit einer Programmiersprache zu tun haben,
die eins zu eins die mathematischen Funktionen und unter anderem auch
die Relationen abbildet als Sprachelemente in der Programmiersprache.
Das heißt, wir können mit der Semantik sehr formal werden und Dinge wie Korrektheitsbeweise,
Programmentransformationen und so etwas auch ansprechen und darauf hinarbeiten,
dass es möglich wird.
Dann ist der nächste große Block,
dass wir drüber reden,
was sind die typischen Entwurfsmuster eines funktionalen Programms,
in welchen Situationen hilft es
Funktional zu denken und nicht imperativ. Und welche Bausteine habe
ich, aus denen ich ein funktionales Programm zusammensetzen kann?
Und damit werden wir den Weg übnen,
dass wir über objektorientiertes Programmieren einen funktionalen Programmierstil reden können.
Der Teil Celos macht hier im Wesentlichen anderthalb Vorlesungsstunden aus,
aber im Skript werden sie sehen,
dass sich darauf fast 100 Seiten verbraten habe,
um zu zeigen, wie ein echtes objektorientiertes Programm aussieht.
Also sie finden im Skript eigentlich jedes Programm,
das ich hier vorführe,
vollständig kommentiert,
Und können da nachschlagen. Es gibt in der Welt der Objektorientierten Programmierung
auch viele Sichten, was damit gemeint sein kann.
In Java haben sie eine zustandsorientierte Welt der Objektorientierten Programmierungen kennengelernt und wir werden darüber sprechen,
wie kann man objektorientiertheit als funktional sehen,
wenn man ganz bewusst Zustandsänderungen versucht zu vermeiden.
Wenn wir Funktionen zum Gegenstand der Berechnung machen können,
wie können wir dann Methoden zu Argumenten machen und ähnliches.
Das werden Sie an dem Beispiel sehen und aussehen, wie mächtig das ist.
Und um die Celos-Objektorientierte Programmierung in die Sprache Recket reinzukriegen,
hat mich viel Zeit darauf verwendet, Meta-Programmierung durchzuexerzieren.
Und ich habe es auch mit ins Skript aufgenommen.
Also wir werden in dieser Vorlesung viel darüber reden,
wie kann ich eine gegebene Programmiersprache erweitern.
Auf der syntaktischen und semantischen Ebene. Also nicht nur zusätzliche Klassen hinzufügen oder Plugins,
sondern Wie mache ich aus meiner Sprache der Sprachelemente fehlen eine,
die weitere Sprachelemente hat?
Und das werden wir an zwei Beispielen sehen. Einmal,
wie wird eine Objektorientierung eingebaut in die Programmiersprache, das sich objektorientierte Sprachelemente habe.
Und das zweite, wie bekomme ich den Teil Logikprogrammierung,
auch in Recke zur Verfügung. Mein Kollege Menzel macht in
seiner Vorlesung genau das Gegenteil, der zeigt seinen Studierenden,
wie baue ich eine funktionale Erweiterung in Pullock hinein.
Und wie erweitere ich eine relationale Sprache, Einen skimmen kann,
mit dem ich dann funktional arbeiten kann. Ja,
und dann gucken wir uns gegen Ende des Semesters das größere Anwendungspakete an,
wo wir sehen, wie es alles benutzt wird und was man für schicke Sachen damit machen kann.
Und ich hoffe, spätestens zu dem Zeitpunkt werden sie
von wesentlichen Teil dieser Inhalte begeistert sein.
Ich bin es jedenfalls immer noch nach vielen Jahren.
Okay, gut. Komm, Matze. Einführung fangen wir
nochmal ganz einfach an
Bei AW, Applikative Programmierung oder AW-Algorithmen.
Funktionales Programmieren tocht in verschiedenen Namen in der Literatur auf.
Und das Wesentliche ist im Functional Programming oder applikative Programmierung, weshalb applikativ.
Wir applizieren Funktionen auf Argumente. Das ist der Kern des Programmierstils,
ja. Und was ist denn das Besondere daran ist,
habe ich hier mal aus einem ersten Buch abgeschrieben,
weil es einen wunderschönen Einführungskurs in Informatik basierend auf funktionaler Programmierung gemacht hat.
Nämlich aus dem Buch von AW Birzen ein Sassmann. Okay, first,
we want to established the idea that the computer language,
is not just away of getting a computer to perform operations.
But rather, it's the novel formal medium,
for expressing ideas about mysodology. That's programs must be ritten
for people to read and only incidentally for machines to execute.
Das ist genau ein Punkt, was mich an der funktionalen Programmierung so begeistert.
Wir können in den funktionalen Programmiersprachen sehr gut erstmal unsere Gedanken ordnen und Dinge beschreiben.
Eine Sprache, es als eine Sprache verwenden,
wie die natürliche Sprache, um Dinge zu erklären, zu beschreiben.
Stellen Sie vor, Sie lösen etwas,
voll mathematisch ein Problem, Lösung, schreibende Gleichung hin.
Die funktionalen Programmiersprachen sind die Programmiersprache, mit der Ihr Computer dann
diese Gleichung auswertet und ausführt. Auch das ist ein Beispiel,
was wir uns anschauen werden,
wie kann ich so etwas wie Mathematiker im Wesentlichen Kern hier machen,
dass ich einen Computer habe,
der Integralgleichung transformiert und mit Gleichungssysteme löst und mir neue Dinge herleitet
Okay. Second, das glaube ich nicht ganz,
aber ich habe es trotzdem aufgeschrieben. We believe that the
ascential material to be at to rest by subject at dess,
this level is not the syntax of a particular programming language.
No clever algorithms for computing efficiently. No even the mass
magical analysis of algorithms and the foundations of computing.
But the rather, the technics used to control the intellectual
complexity of large software systems.
Deshalb glaube ich es nicht ganz, ich finde clever
Algorithms sind essentiell
Muss effiziente Algorithmen formulieren können, ja. Und auch Algorithmen
mathematisch analysieren können. Aber ganz wichtig ist es,
dass wir über Werkzeuge nachdenken, wie wir Komplexität großer Probleme lösen können.
Und sie haben genau für die Frage,
nur allerdings in den ersten beiden Semestern,
schon den objektorientierten Entwurf als eine Strategie gelernt,
wieder verwertbare Software durch Vererbung zu erzeugen und Modularisierung,
Handhabbarkeit,
Bausteine zusammensetzen
Das werden wir hier machen. Nur die funktionale Sicht bringt
noch weitere Punkte dazu, die das ebenfalls ermöglichen.
Also wir werden die Palette von Entwurfsmustern, wie wir rangehen,
erweitern und eine ganz wichtige Art komplexe Probleme anzugehen,
besteht darin, dass wir nicht mehr selbst nach einem Algorithmus suchen,
er ist Problem löst, sondern nur das Problem beschreiben.
Und den Computer nach der Lösung suchen lassen. Die letzten Beispiele,
die wir diesem Semester besprechen werden, werden Beispiele sein,
wo wir all die Regeln aufschreiben, die sagen,
Diese Regeln sind Randbedingungen für die Lösung, zu die wir suchen.
Computer mach mal, ja. Und dieses deklarative Programmieren
mit aufschreibende Regeln wird ein weiterer Punkt sein.
Okay. Naja, den Flug lasse ich mal weg.
Können wir gleich zu den ketzerischen Behauptungen. Was ich ganz niedlich fand,
war die Unterscheidung, die Evozon Ancessman in ihrem Vorwort zum Anfangsbuch gemacht haben,
zwischen Mathematics in Computation.
Und das ist, sagen wir mal, zu 90 Prozent
Messmatics provides a framework for dealing prescisely this notions of what is.
Computation, provides the framework for dealing prescisely this notions of how two.
Ich denke, das bringt es auf den Punkt.
In der Mathematik schreiben, wer Satzbeweisaussagen,
solange wir es nicht mit Nomerik und Lösungsprozedur zu tun haben,
im Wesentlichen deklarieren wir Sachverhalte.
Und was wir in der Informatik machen,
wenn wir bei Algorithmen sprechen, dann beschreiben wir im Wesentlichen
auch Lösungswege.
Wie kann das Problem
gelöst werden
Und sie werden an vielen Beispielen in dieser Vorlesung sehen,
dass es mir sehr drauf ankommt, dass wir uns klar machen,
wie kann man bestimmte Probleme lösen und wie kommen wir zu Besseren und überhaupt Handpappbaren Algorithmen,
um in dieser Situation eine Lösung zu finden.
Vielleicht, wie soll ich es motivieren? Sie sind ja hier,
weil sie nicht Programmierer werden wollen, sondern Informatikerinnen und Informatiker.
In vielen Programmiersituationen, ist es inzwischen so,
dass man drauf trainiert wird, erst mal zu gucken,
nicht das Rad neu zu erfinden, sondern bestehende Lösungen zu verwenden.
Und das geschickt zusammenzusetzen in einer guten, modularen Programmumgebung.
Habe ich absolut nichts gegen, genau das sollte man tun.
Bloß es muss irgendjemand auf der Welt geben, der den
neuen Typ von Rad erfindet, wenn es gebraucht wird.
Und wenn Probleme immer schwieriger werden und es einfach keinen fertigen Baustein gibt,
dann muss man sich auf den Hosenboden setzen und den entwickeln und mit den Werkzeugen,
die wir inzwischen haben, die so komplex sind,
dass man acht bis zehn Semester studieren muss,
um sie überhaupt sinnvoll benutzen zu können,
können es eigentlich nur die Bachelor- und Master-Absolventen in der Informatik sein,
die dann das Ganze weiterbringen und neue Verfahren entwickeln.
Und dafür sind sie hier, dass sie in der Lage sind,
anhand bestehender Muster zu erkennen,
wo werden Erweiterungen gebraucht und wo komme ich weiter.
Der funktionale Programmierstil macht viele Dinge lösbar. Das mit einem Grund,
warum in vielen Projekten gesprachen, um die es hier geht,
verwendet werden will, ist ein Skim,
weil es um die Lösung nicht traditionelle Aufgaben geht,
wo man gern weiterkommen möchte
Gut, und das ist jetzt der zweite Programmierstil.
Ich hoffe, ich habe es jetzt ein bisschen motiviert dazu.
Der funktionale Programmierstil ist eben wirklich grundsätzlich anders als der Imperative.
Er ist mathematisch wohlfundiert. Das heißt,
man kann es wagen, dort Korrektheitsbeweise zu führen.
Ich behaupte, er ist leicht zu erlernen.
Es wird in vielen Universitäten als Erstsemester Programmiersprache verwendet.
Wir haben es hier auch jahrelang gemacht,
bis die Java-Fraktionen gewonnen hat
Ich bin nicht traurig rum. Ich kriege sie erst im dritten Semester,
wenn sie schon wissen, dass Klammern auf und zu gehören.
Und so die ganzen Kinderkrankheiten erledigt sind. Dann,
wir haben softwaretechnisch wirklich wichtige Konzepte. Und ich hoffe,
über all die Sprachelemente übersehen sie Konzepte nicht, die sie hier lernen sollen.
Und wir werden diesmal nicht mit dem Compiler arbeiten,
obwohl er da ist, sondern mit dem Enturbretter.
Ja, das heißt, wir werden im Wesentlichen interpretiert arbeiten
und verwenden die Sprache Reggaet. Und das ist ein Vertreter
aus einer riesengroßen Familie von Programmiersprachen, nämlich der List-Familie.
Funktionale Abstraktion. Unser, wir schreiben, Keine Unterprogramme,
sondern wir schreiben auch keine, im Wesentlichen erst mal keine Klassen.
Wir schreiben Funktionen. Wir haben Symbole. Symbole sind
ganz typisch für die Lispfamilie und sind das Fundament dafür,
dass wir in dieser Vorlesung auch über Semantik von Programmiersprachen sprechen können.
Kommen gleich dazu, warum das wichtig ist. Wir haben
eine dynamische Typisierung. Erst zur Laufzeit des Programms wird festgestellt,
was der Typ eines Argumentes ist. Das heißt,
wir können, und deshalb habe ich vorhin gewarnt,
wir können Programme übersetzen, die nicht typkonsistent sind, Programmfehler,
die sie machen, fliegen ihnen erst zur Laufzeit um die Ohren.
Ja. In Java, weißt du noch,
von meinen ersten Übungen her, das war eine lange Durststrecke,
bis man zum ersten Mal durch ein Compiler das Programm durch
hat und alle Sonntagsfehler draus waren.
Und wenn man das geschafft hat, was Programme meistens schon richtig.
Hier wird das Programm sofort von ihrem System genommen.
Es wird versucht auszuführen und zur Ausführungszeit wird festgestellt,
wo die Typen nicht passen. Also das heißt,
dass die Backung beginnt während des Testens und da ist es sehr gut,
dass sie mit einem Enturbretter arbeiten,
weil sie kleine Teile unabhängig voneinander testen können
Vorgezogene Auswertung erklären wir drei Kapitel weiter. Mit der Programmierung Erweiterbarkeit der Sprache,
also das ist ganz, ganz wichtig,
die Datenstrukturen und Daten, die wir schreiben,
sind von der Syntax her dasselbe wie unser Programmcode.
Und wir können zur Laufzeit Programmcode generieren,
Perameter abhängig neue Programme erzeugen und sie auch gleich on the fly ausführen.
Und das funktioniert eben, weil kein syntaktischer Unterschied zwischen
den Daten und den Programmstrukturen selbst
da sind
So. Ja, was ist denn in dieser seltsamen Welt ein Algorithmus?
Schauen wir nochmal zurück ins erste Semester. Ich hoffe,
Sie erinnern sich, Sie werden eine ähnliche Definition kennengelernt haben.
Wie ich hier aufgeschrieben habe, von Schäfer oder Bauer Guss.
Als ich Erstsemester war, habe ich die folgenden Definitionen gelernt.
Algorithmus ist ein eindeutig bestimmtes Verfahren und der Verwendung von Grundoperationen über primitiven gegebenen Objekten.
So, und alles, was ich hier rot markiert habe,
ist wichtig, erstmal der eingeführte Begriff, klar.
Wichtig ist, es wird gefordert,
ein Algorithmus ist eine ein eindeutiges Verfahren. Das heißt,
man muss zu jeder Zeit, während man den Algorithmus abarbeitet,
muss der Prozessor genau wissen, was er zu tun hat.
Es gibt Grundoperationen, das ist nämlich, sind die Operationen,
die der Rechner durchführen kann, auf dem es läuft.
Und es gibt gegebene primitive Objekte, eine endliche Zahl von
unterschiedlichen Typen, die erkannt und verarbeitet werden können.
Ja, so hat es mein Kollege Schäfinanze 85 in seinem Informatiklehrbuch geschrieben.
Eine andere klassische Definition aus der Frühzeit der Informatik von
Bauer und Gos
Algorithmus. Es ist eine präzise in einer festgelegten Sprache abgefasste,
endliche Beschreibung eines allgemeinen Verfahrens und der Verwendung Ausführer ausführbarer, elementarer Verarbeitungsschritte.
Also im Wesentlichen sehen die Dinge ähnlich aus.
Der große Unterschied ist diese Stelle hier. Endliche Beschreibung eines
allgemeinen Verfahrens und der Verwendung hier in einer festgelegten Sprache.
Bauer und Guss, und das war in den 80er Jahren,
70er, 80er Jahren gang und gäbe, haben gesagt,
Ein Algorithmus ist nichts ohne die Programmiersprache.
Wenn ich einen Algorithmus schreibe, muss ich auch gleich sagen,
in welcher Sprache er beschrieben wird.
Und davon ist man inzwischen ein bisschen abgekommen,
sondern man meint das Verfahren an sich und es ist egal,
in welcher Sprache wir es beschreiben,
solange die Sprache die Ausdruckskraft hat, dieses Verfahren zu beschreiben.
Und insofern können wir auch in der funktionalen Programmiersprache von Algorithmen sprechen,
die ausgeführt werden. Und wir brauchen uns nicht genau festzulegen,
in welcher Sprache sie beschrieben werden, sondern Abstrakte,
die abstrakte Folge von Operationen, die ausgeführt werden soll,
festgelegt, eindeutig ist unser Algorithmus.
Was wir essentiell fordern wollen, ist eben,
dass ein Algorithmus an sich, das abstrakte Konzept,
implementiert wird als Programm und vom Programm fordern,
das sind bei Algorithmus ausführen soll.
Da fordern wir, dass es präzise eindeutig und endlich ist.
Nicht nur in der Beschreibung, sondern auch in dem,
was es tun soll. Pavokabeln, die wir in dieser Vorlesung
immer wieder brauchen, Ich erwarte, dass sie die kennen.
Ich möchte sie nur wiederholen, damit versichert sind, dass wir sie gleich verwenden.
Sequenzieller Algorithmus haben wir, wenn wir alle Schritte hintereinander ausführen.
Parallel oder nebenläufig, wenn einige der Schritte gleichzeitig sind,
sein können, ja, durch meine finde ich parallele Prozessoren.
Und deterministisch, das wird jetzt in der Vorlesung wichtig,
wir werden nämlich beides kennenlernen.
Deterministisch, wenn jeder Schritt eindeutig geregelt ist, das heißt,
der Prozessor muss nicht würfeln zu bestimmten Zeiten.
Wir werden recht viele nicht deterministische Algorithmen schreiben,
wo Die Reihenfolge erst zur Laufzeit zufällig entschieden wird.
Gut, terminieren, das ist das Traumziel, man möchte,
dass es irgendwann fertig wird, nach endlich vielen Schritten.
Und bitte nicht verwechseln mit determiniert, wenn er eindeutig
bestimmtes Ergebnis liefert. Also was wir hier behandeln werden,
so der zweiten Semesterhälfte sind determinierte Algorithmen,
die liefern uns ein eindeutiges Ergebnis, aber sie müssen nicht unbedingt deterministisch sein.
Es kann auch ein nicht deterministisches Verfahren ganz zum selben Ergebnis
kommen,
nur auf unterschiedlichen Wegen
So, und gegeben dieses Konzept von Algorithmen eindeutig,
was muss getan werden, wo ist denn jetzt der Unterschied
zwischen funktional und imperativ und anderen Modellen.
Das hängt am Verarbeitungsmodell. Das ist unsere wichtigste Vokabel heute.
Wenn wir ein Verfahren beschreiben, gehen wir davon aus,
dass die Maschine, die dieses Verfahren ausführen soll,
nach einem bestimmten Schema arbeitet.
Das ist das Verarbeitungsmodell. Und das bestimmt eben,
welche Grundoperationen sie kennt,
mit welchen Objekten sie hantieren kann,
mit welchen Werten,
in welcher Weise
sie vorgeht
Also im Wesentlichen die Grundoperation und das Verhalten auf Eingaben.
So und die Verarbeitungsmodelle korrespondieren mit den Grundstielen der Programmierung,
die wir haben. Bei der imperativen Programmierung haben wir das Verarbeitungsmodell,
das zu jedem Zeitpunkt gesagt wird,
verändere den Zustand der Berechnung in einer bestimmten Weise.
Tue etwas und das Ergebnis der Berechnung ist immer der Zustand
der Maschine, nachdem sie dieses getan hat.
Und Ausprägungen davon auf Elementars der Maschinenebene,
die von Neumann programmieren oder eben die objektorientierte Programmierung,
wo wir abstraktere Objekte haben, die ihren Zustand ändern können.
In der funktionalen, applikativen Programmierung, sagen wir,
der Maschine, Wende, eine Funktion auf gegebene Argumente an.
Und die Kaskade von Funktionsanwendungen sind unser Programm. Bei der Logikprogrammierung,
sagen wir der Maschine, du weißt etwas über die Welt,
hier sind deine Aussagen, Fakten und du hast Regeln,
die den Zusammenhang zwischen Fakten beschreiben.
Nun sag mir,
bin ich reich oder nicht
Und da muss die Maschine aufgrund der Regeln, die sie kennt,
entscheiden, anhand der Fakten, ja oder nein.
Bei der stromorientierten Programmierung stellen wir uns vor,
dass Objekte transformiert werden in einem Strom, der jeweils getaktet verändert wird.
Werden wir auch noch kennenlernen. So,
das Schöne an Verarbeitungsmodellen und weshalb sie so wichtig sind,
ist, dass sie uns endlich davon befreit haben,
so wie ich es als Erstsemester noch tun musste,
Bits und Schalter am Rechner umlegen,
Papierband reinzufüttern und auf dieser Ebene direkte adressieren von Speichern in der Maschine zu programmieren.
Wir können Eine Sprache erfinden,
in der wir ein Problem beschreiben, eine Maschine bauen,
die diese Sprache versteht und dann in der Semantik dieser Sprache
uns Antworten gibt auf die Fragen, die wir haben.
Und wie wir ein Problem lösen, hängt aber da lösen sollten,
hängt davon ab, was das Verarbeitungsmodell ist, das unsere Maschine kann.
Und praktische Programmiersprachen, damit sie verwendbar sind,
sind meistens so benutzerfreundlich, dass sie einem erlauben,
nicht nur einen Programmierstil zu pflegen, sondern mehrere,
sie sind hybrid und wir können,
wenn das Problem mehrere Sichten oder Facetten hat,
vom einen in den anderen wechseln.
Ja, und das ist das,
wo man wirklich anfangen muss,
nachzudenken und sorgfältig zu arbeiten
Also Programmierstil bezieht sich jetzt wirklich darauf,
wie wir ein Problem analysieren und modellieren und nicht darauf,
ob wir unser Programm kommentieren.
Als ich studiert habe und dir die ersten Programme geschrieben wurden,
da meinte man mit sauberem Programmierstil, dass man seinem Programm kommentiert.
Ja, das hat sich ein bisschen geändert.
Das heißt, dass wir stillgetreu programmieren. Gut,
gucken wir nochmal ein bisschen plakativ auf die Programmierstile,
die sie kennen sollten. Der klassische Imperative Programmierstil,
gut erkennbar, sobald man Flussdiagramme sieht,
weiß man,
es ist so was
Wir haben eine Welt, wo es Objekte oder Werte gibt,
die zu einem bestimmten Zeit,
einen bestimmten Satz an Werten haben, dann gibt es Anweisungen,
es gibt Bedingungen, Verzweigungen am augenglücklichen Zustand wird entschieden,
wie es weitergehen soll, wenn man das oft genug macht,
hat man das, was am gemeinhin Spaghetti-Code genannt wird.
Programm mit dem man nicht mehr warten kann.
Und im Wesentlichen ist unsere Sicht als Programmiererin oder Programmierer,
dass unser Computer Befehle versteht und daraufhin seinen Zustand ändert,
Gut, das habe ich eben erklärt. Gucken wir uns
mal ein Beispiel an, wenn man rein imperativ arbeitet,
wie so ein Algorithmus aussehen könnte. Kennen Sie,
haben Sie oft genug gemacht in den ersten zwei Semestern?
Ich möchte es jetzt nur kontrastieren, zu dem wir
das gleiche funktional aussieht. Erinnern Sie sich mal,
wie Sie im zweiten oder vielleicht im ersten Schuljahr gelernt haben,
zwei Zahlen miteinander zu multiplizieren, stellenweise.
113 mal 114 oder so. Was man gelernt hat,
man schreibt die Zahlen nebeneinander, betrachtet die Stellen,
multipliziert sie, je nach Fertigkeit, addiert das Ganze.
So, und das wollen wir jetzt
unserem Computer erklären
Stellen sich mal ihre zwei, ihre Zahlen vor.
Erst Zahl und zweite Zahl. Wir nehmen die letzte Stelle
der zweiten Zahl und multiplizieren sie mit der ersten Zahl.
Das heißt, unser Verarbeitungsmodell erwartet das Zahl
mit einer Zahl von null bis neun multipliziert werden kann.
Dann nehmen wir das Ergebnis Oss-1 mit dem Stellenwert der benutzten Stelle.
Jetzt muss unser Programm wissen, was Stellenwert ist.
Das ist eben die eine Zehner 100er Stelle.
Dann streichen wir sie. Und jetzt merken wir uns,
was war denn der Stellenwert der nun in der letzten Stelle?
Und dann gucken wir, haben wir bereits ein Ergebnis aus der vorangegangenen Berechnung,
studieren wir das, halten das Ergebnis fest.
Andernfalls, wenn wir noch keins haben, halten wir unser jetziges Ergebnis fest.
Und wenn keine Stellen der zweiten Zahl mehr vorhanden sind,
haben wir das Resultat. Etwas so Simples zu tun,
aber feinen Schritten aufgefieselt, imperativ, ist es beim ersten Lesen graus.
Das Imperativ. Gucken wir mal,
davon sollte uns jetzt das Objekt orientierte Modell,
mit dem sie jetzt zwei Jahre programmiert haben, wegbringen.
Dabei reden wir nicht mehr von Zahlen, sondern von Konzepten,
Rep-Modelle von realen Objekten und wir hantieren mit diesen Modellen der Objekte im Rechner und haben komplexere Operationen.
Zum Beispiel aus der alten Robotersprache L. Da konnten wir einem Roboter sagen,
wie so Bauklötzchenweise spielend, Move-Block-A to-block-by, Attach Block-by,
wenn ich zwei Dinge hier zusammensetzen sollte und kann eben wieder Befehle geben,
der Zustand der Welt ändert sich,
aber ich beziehe mich nicht mehr kleinen, kleinen auf.
Die Zahlen, wie sie im Rechner sind,
sondern auf Modelle der realen Welt. Der Rechner kennt feinere,
oder detailliertere Grundobjekte als schlichtweg die Zahlen der Hardware,
die wir in ihm verdrahtet sind.
Gut, weshalb wir objektorientiert programmieren, mache ich auch gern.
Wir können unseren Problembereich über abstrakte Objekte modellieren. Wir haben
verständliche Programme, hoffentlich. Super Erweiterbarkeit über die Vererbung.
Wir können bestehende Lösungen spezialisieren. Und der Nachteil Solange wir in
dieser imperativen Welt mit den Schleifen, Flussdiagrammen und so weiter sind,
ist es extrem schwierig, formale Korrektheitsbeweise zu führen.
Sagt man ihnen normalerweise nicht so, sondern man versucht,
ihnen beizubringen, wie das geht.
Aber es ist eben schwierig und es ist nicht zuverlässig.
Deshalb, ich weiß noch, als ich meine Diplomarbeit gemacht habe,
kamen die ersten Pascal-Compiler auf. Und wir arbeiteten mit einem Compiler,
für den hat die Peter Amann, Doktoranden von Niklas Wirth in Zürich,
hatte Diesen Compiler entwickelt als Dissertation und die Meisterleistung war eben,
wofür er seinen Doktorhüt gekriegt hat.
Er hat bewiesen, dass dieser Compiler korrekt ist.
Er hat einen Beweis vorgelegt, ein korrekter Compiler.
Also von so etwas hat man damals geträumt.
Und das war etwas, was man wirklich haben wollte,
was essentiell ist. Dieser Compiler mit seinem formalen Korrektheitsbeweis hatte
mehr Fehler als jeder andere, den ich hier benutzt habe.
Woran liegt es? Der Beweis war richtig. Man muss,
wenn man imperative Programme beweist, Erstmal aufschreiben,
was man denn beweisen müsste. Und wenn man das,
was man beim Aufschreiben dessen, was zu beweisen, ist,
schon Fehler macht, dann beweist man eben das Falsche.
Zu dem Zeitpunkt war es üblich,
ein Informatikübungsaufgaben in den ersten Semestern, zu jedem Programm,
was man geschrieben hat, ein Korrektheitsbeweis abzugeben.
Haben Sie das auch noch geübt? Nein. Gut.
Ich habe viele Programme gesehen. Wo bewiesen ist,
dass sie richtig sind und sie waren falsch
Simples Beispiel, typische Übungsaufgabe, Erstsemester, Imperative, Programmiersprache,
Sortiere, ein RE von Zahlen, aufsteigend, ja.
Ich habe eine tolle Lösung gekriegt, mit dem Beweis an,
Beweis sagt, ja, in der ganzen Herleitung, kein einziger Fehler.
Ich rufe das Programm auf, von den Hundert zu sortierenden Zahlen hatte ich nachher 98.
Die waren aber in der richtigen Reihenfolge. Was ist passiert? Derjenige,
der in den Korrektheitsbeweis geschrieben hat,
hat ja keine Lust gehabt oder hat es total vergessen, zusätzlich zu verlangen,
dass der Algorithmus hinterher genauso viele Zahlen hat wie vorher.
Das eben, also war nicht berücksichtigt, was geschieht mit Zahlen.
Die waren alle verschwunden in dem Algorithmus. Gut,
und das ist also eine Krux speziell, auch bei Imperativen Programmen,
wo wir über Dinge wie Schleifen in Varianten Zustandsfortschreitungen,
den Beweis führen müssen und bei dem Spaghetti-Kurt von allen Seiten an jede Stelle springen können,
die ganzen Vorbedingungen aufschreiben zu können, die erfüllt sein müssen.
Im Funktionalen Verarbeitungsmodell, das ist unsere Vorstellung, Computer,
Dem können wir sagen, Wendefunktion so und so auf Argument so und so an.
Ja, wie ein Taschenrechner, wir haben ein Argument,
da stehen und rücken eine Taste.
Das ist jetzt die Funktion. Ich habe jetzt zur Gewöhnung
schon mal hingeschrieben, wie unsere Programme im Wesentlichen aussehen werden.
Klammer auf, Klammer zu. Und außerdem Funktionsaufrufe und wir
haben eine Prefix-Notation, der Name der Funktion steht immer vorn,
dann folgen die Argumente.
Ja, unsere Sicht für dieses Semester auf unsere abstrakte Maschine,
die unsere Programme verarbeitet,
sie kann Funktionen auf Argumente anwenden
Und wir haben als Basisfunktion, wir konstruieren funktionale Therme,
so wie Teilausdrücke, die wir dort gesehen haben.
Wir können Programme wirklich meistens sehr prägnant und kurz formulieren.
Und wir können formal, indem wir das,
was die Mathematiker und sein Arbeit schon abgenommen haben,
schlichtweg alles, was über Funktionen bekannt ist, nutzen,
um zu beweisen, die Programme korrekt sind, terminieren.
Und die Syntax ist wirklich einfach. Also im Wesentlichen Haben wir
nicht mehr zu tun als Klammer auf und Klammer zu,
nett abzustimmen und Argumente drin zu erwähnen.
Und die Funktionsnamen hier hinzuschreiben, ja. Es gibt nicht
viel mehr Sinntax, die wir in diesem Semester lernen müssen.
Und ein Syntax-Highlighting macht im Wesentlichen die schließende Klammer zur
öffneten Klammer zu und zeigt sie ihnen.
Ja? Okay. Gut, wie sieht denn jetzt
ein Multiplikationsalgorithmus funktional aus? Erinnern wir uns,
beim Imperativen war diese Seite hier total gefüllt.
Ja? Hier kann ich noch auf das Beispiel draufschreiben
Und im Wesentlichen sind es drei Zeilen. Das Produkt zweier
Zahlen ergibt sich als Summe der Produkte aus der ersten Zahl
und denen mit ihren Stellenwerten multiplizierten Stellen der zweiten Zahl.
Das ist es. Ein schöner funktionaler Ausdruck. Wir sehen das,
was an elementaren Schritten da ist,
ist der Aufruf der Funktion, Produktsumme, Produkte,
Bezeichnung der Argumente, denen mit ihren Stellenwerten multiplizierten Stellen,
auch das,
da steckt für der impliziten Funktionsaufruf drin und genaues Bezeichnen
und wir können das Ganze in drei Zeilen hinschreiben
Keine Verzweigung in diesem Fall. Die haben wir im
funktionalen Programmierstil auch. Insofern ist Beispiel etwas unfair.
Aber was wir hier schon mal feststellen können,
zum einen dieser Algorithmus ist nicht deterministisch.
Wir erzeugen Produkte. Hier ist nicht gesagt worden,
in welcher Reihenfolge die Produkte ermittelt werden müssen.
Das macht das Ganze nicht deterministisch. Es ist aber terminierend
und es ist determiniert. Der kommt wirklich nur einen Wert
raus. Es ist funktional. Außerdem ist es rekursiv
Wir beschreiben ein Produkt als Summe von Produkte. Und das ist das Zweite,
was ich schon mal sagen kann für dieses Semester.
Bis Weihnachten vergessen Sie bitte alle Waldschleifen, Vorschleifen, überhaupt Schleifenkonstrukte.
Wir werden im Wesentlichen, um Dinge mehrfach zu machen,
Funktionen anwenden oder Rekursionen verwenden. Kein Goto, keine Wiederholung schleifen,
sondern im Wesentlichen schreiben wir die Funktionen so hin,
dass sich Wiederholungen im Wesentlichen durch den rekursiven Aufruf ergeben.
Oder eben Funktionen, die diese Wiederholung machen
Also, wir haben eine extrem einfache, wenig redundante Syntax.
Die Semantik, um präzise zu sein, dennotationelle Semantik,
wenn wir etwas, einen Ausdruck hinschreiben, wird übers Landerkalkül definiert.
Ich hoffe, Sie lernen in den formalen Grundlagen der Informatik,
in den Vorlesungen FG12 und soweit das Landerkalkül kennen.
Hier werde ich es nicht ansprechen können, aber das ist ein Teil,
um die Berechnungen zu beschreiben, ähnlich Thüringenmaschinen.
Ja, die erste Implementation für den Sprach in der Listenfamilie,
mit dem wir es hier zu tun haben,
wurde von John McCarthy gemacht
John McCarthy, Mathematiker und hat einen Lamderkalkül gesehen als eine
formale Spezifikation von dem, was Berechnung macht. Und hat gesagt,
ja, wenn das formal beschreibt, was ein Programm tut,
warum nicht diese formale Sprache Beschreibung direkt zum Programm machen.
Er hat eins zu eins den Lamderkalkül als Programmiersprache entworfen und
es ist seit 1960 benutzt worden und das ist die Basis
von Lisp
Und weil eben mathematische Ausdrücke so kurz und knackig sind,
also wenn sie mal das Mathe-Skript oder sonst wohin,
schauen sie, wo Formeln stehen,
über eine Seite von Formeln kann man locker Tage grübeln.
Und genauso kann es ihnen mit nicht gut kommentierten, funktionalen Programmen auch gehen, ja.
Gut, also wir machen sagen sehr kurz und knapp und knackig
auf wenig Platz sehr viel. Und wie man damit umgeht,
und das benutzt die Pragmatik der Sprache,
das ist das, was ich gemeint habe,
in dem Teil, wo wir über Entwurfsmuster sprechen werden,
Wie gehe ich damit um und wie löse ich typische Probleme?
So, was ist der Kollege Wolfgang Menzel, der Parallelvorlesung macht?
Hört die eigentlich auch jemand dir? Ah, wunderbar.
Sehr schön. Genau. Also was sie lernen werden,
ist ein Verarbeitungsmodell, wo es um das Auswerten von Beziehungen zwischen Fakten geht.
Im Wesentlichen stellen wir uns vor, wir haben eine Maschine,
die logische Schlussfolgerung machen kann und Fakten kombinieren kann.
Ich höre mal den Nick Knatterton,
das ist also unsere Sicht auf den Computer.
Wenn wir programmieren, Gehen wir ihm eine Faktendatenbasis?
Einen Satz von Schlussfolgerungsregeln sind fest eingebaut im Programm.
Und wir definieren relational Variationen, Beziehungen zwischen den Fakten,
die wir genannt haben. Wir sichern zum Beispiel Tier zu,
den alten Spruch, der Mörder ist immer der Gärtner,
ist ja nett von Reinhard May vor langer Zeit mal besungen worden.
Und das sagen wir als Relation so, wenn irgendeinen X ermordet wurde,
dann steht es in der Relation zum Gärtner.
Der Gärtner ist der Mörder von X. So. Und jetzt fragen wir unseren Computer,
huch, ich habe die Leiche Paul gefunden.
Sag Mittwoch, wenn ich diese Relation hinschreibe, Paul,
ist ermordet worden. Ich weiß seinen Mörder nicht.
Welches M steht in der Relation, Mörder zu Paul?
Dann wird unser Prologsystem nachschauen in seiner Datenbasis
durch Abgleich
Unifikation, also das sollten sie bei Wolfgang Menzel dann lernen,
was Unifikation ist, sonst wird es mit der Klausur nie was.
Und das wird Ihnen sagen, M ist der Gärtner.
Ja, das ist meine Lösung. Und wenn wir dann jetzt in so Mikulan eingeben,
gibt es weitere Lösungen, weil das ist ein Massenmord oder so,
dann wird in diesem Fall sagen, nö,
es gibt keinen weiteren Mörder,
also das No heißt in dem Fall,
ich weiß nichts über einen weiteren, ich kenne nur den einen.
Bei der Logik benutzen wir es dann meistens so,
als es gibt nur diese
eine Lösung
Also das ist der logische oder relationale Programmierstil. Und für den werden wir
eine Erweiterung in Recket schreiben als eine der wichtigen Anwendungen der Metaprogrammierung in Recket.
Und sodass wir dann hier auch solche Schlussfolgerungen machen können.
Also was ganz typisch für diese Art der Programmierung ist,
für modellierende Fakten, Beziehungen in Form von Relationen.
Der ganze Ablauf, wie gesucht wird, wie man
die Lösung findet und damit kombiniert, ist fest eingebaut.
Also Suchschleifen, all das müssen wir nicht selbst schreiben,
sondern das System in der relationalen Programmierung wird versuchen,
durch eine geschickte Suche diese Lösung zu finden.
Einfache Syntax leicht zu lernen, ja, im Wesentlichen,
wenn sie genau, wenn sie gucken, was ist denn hier passiert?
Ey, weigert. Hat sich aufgehängt, toll. Versuchen wir es nochmal. Gut. Also,
wir suchen hier Explizit schreiben wir auf, was durchforscht werden soll,
leichte Syntax, ja, und im Wesentlichen,
wollen wir es mit dem Stil dann am Ende des Semesters befassen,
dann werden sie den Unterschied genießen können zur, logisch,
zur funktionalen Sicht,
die wir im Wesentlichen besprechen und der zweiten Art.
So, das stromorientierte Verarbeitungsmodell Da haben wir die Sicht,
unser Rechner verarbeitet, einen Strom von Objekten, kann Ströme kombinieren, zusammensetzen.
Denn im Wesentlichen sehen wir es so, wir haben Fließbänder,
auf denen, die zu kombinierenden Objekte ankommen,
die verarbeitet werden sollen, mehrere Fließbänder können sich zu einem Strom vereinigen.
Es kann ein neuer Strom herauskommen und einen bestimmten Takt werden
immer zwei Werte kombiniert. Das Schöne bei diesem Programmierstil ist,
dass für uns die Datenstrukturen potenziell unendlich groß vorstellen können
Stromorientierte Verarbeitung ist zum Beispiel in der funktionalen Sprache Miranda,
in der anderen Welt, der funktionalen Programmierung eingebaut.
Da können wir locker und lässig sagen, der Wert,
meine Variable X, X ist die Menge der natürlichen Zahlen.
In Java würden sie nie ein RE mit der Länge unendlich definieren.
Das kommt nicht gut. Können wir aber im Stromorientierten Programmierstil machen,
weil dort eingebaut ist, dass dafür gesorgt wird,
dass von unendlich großen Datensätzen immer nur der Teil zurzeit gehalten wird,
an dem man gerade in der Verarbeitung zugange ist
Und eine ähnliche Art stromorientierter Programmierung haben sie auch,
wenn sie an unseren Linux-Maschinen, auf den PCs arbeiten und
die Terminal-Kommandos verwenden wie Grab und Sord und so weiter.
Auch da können wir mit den Unix-Pipes genau solche Datenströme verarbeiten.
Besonders gut geeignet eben für solche Fließbandartigen Verarbeitungen.
Wir haben als Programmkomponenten Quellen, die uns Objekte produzieren,
senken, wo sie verschwinden.
Wir haben Kombinatoren
Die stromorientierte Programmierung neben der Hyundax-Shell vor allem immer benutzt im Bildverarbeitungsanwendung.
Wenn man von der Kamera bis zur Darstellung des Fertigen verarbeiteten Bildes
einfach so eine Kette von Verarbeitungsbausteinen hintereinanderschalten möchte, ne?
Ja, das war jetzt aber erst die eine Seite der Medaille.
Das, wo das Ganze kompliziert wird, ist,
dass diejenigen, die hingehen und die Computersysteme bauen,
dass die ihrerseits dessen Spieß umdrehen und sagen,
ich gehe von einem bestimmten Benutzermodell aus.
Also mein Benutzer versteht das und das und ich kann von
ihm die folgenden Aktionen eingaben und so weiter verlangen.
Und die große Softwarekrise haben wir immer dann,
wenn Die Paarung von Benutzer und Systemen nicht stimmt.
Wenn die wechselseitig von sich völlig falsche Vorstellung haben, dann geht es abgrundtief schief.
Und deshalb, wenn immer sie Programme schreiben,
möchte ich ihnen ans Herz legen, machen sie klar,
was ihr Benutzermodell ist, wenn sie die Software machen,
damit jeder weiß, ob er das kaufen sollte oder nicht.
Aber ein Beispiel, wo ich erlebt habe,
dass das Falsche Benutzermodell wirklich Das ist eine Katastrophe geführt hat.
Das war in den 90er Jahren, war die Programmiersprache.
Adar sehr beliebt. Ich weiß nicht, ob sie die Sprache hier kennengelernt haben.
Die Sprache war eine Erweiterung der allgäuähnlichen, imperativen Sprachen,
die aber als erstes in Richtung Objektorientiertheit ging in Richtung generischer Klassen und so weiter.
Parallelisierung. Und sie wurde, die Entwicklung wurde finanziert vom
Department of Defense in den USA. Alle amerikanischen Universitäten und Forschungseinrichtungen
haben an dieser Sprache mitgearbeitet, haben die Sprache entwickelt.
Und in der Konsequenz war es in den USA,
praktisch nicht möglich, irgendwelche staatlichen Forschungsaufträge zu bekommen,
wenn nicht diese Sprache benutzt wurde.
Es hat sehr für die Verbreitung gesorgt, ja. So,
nur hat die NASA festgestellt, die hatten bisher ihre gesamte
Software in den Raumfahrtprogrammen im Wesentlichen in Fortträumen gemacht.
Und wenn sie je Vortragen vier programmiert haben, wissen sie,
dass das für Systeme mit großer Parallelverarbeitung und Riesendatenmengen wirklich nicht das Geeignete war.
Die wollten sich jetzt also auf Ada umstellen,
um eben auch die Forschungsgelder vom DOD zu kriegen.
Und Wir haben in Crash-Kursen ihre Vortrenn-Programmierer hingesetzt. Und ich
kann da wirklich Programmierer sagen, Programmiererinnen hätten die damals nicht.
Die sollten dann, ja, anhand des Handbuches erschließen,
wie sie ihre Vortrennprogramme auf Ada umstellen.
Haben sie auch gemacht, ja. Und sie haben die
Programme im Wesentlichen syntaktisch transformiert. Also was passierte ist,
die haben mit stehenden Code genommen,
die Gleichung und alles sieht ein Fortdrang wie in Adern,
jeder imperativen Sprache gleichaus, im Wesentlichen arathmetische Ausdrücke mit Operatoren dazwischen.
Und alles, was es in Fortdrang gibt,
gibt es auch in Ada, also im Wesentlichen haben sie
eins zu eins den fortdren Code nach Ada übersetzt.
Die Programme waren nach dieser Umstellung doppelt so lang.
Es sind Fehler eingebaut worden und der Code war um einiges langsamer.
Der Problem war eben, die hatten überhaupt nicht verstanden,
weil es Programmierer waren, die keine Ausbildung als Informatiker hatten, was generische Klassen sind.
Also die haben praktisch das ganze Red-System beiseite gelassen,
die haben alles beiseite gelassen, wo Vererbung stattfinden konnte.
Also stellen sie sich vor,
sie schreiben Java-Programme ohne eine einzige Klasse zu definieren,
haben sie ungefähr das Chaos,
was aus den Vortransprogrammen Ada geworden war und die NASA hat
dann die Benutzung von Ada nur noch nach außen gezeigt,
aber ihre eigentliche Software schön in den Vortragmybliotheken gelassen.
Das war schneller und sicherer und robuster. Okay. Ja,
mein Lieblingsverarbeitungsmodell oder Angst, was ich versuche zu vermeiden und ihnen abzugewöhnen, das mystische Verarbeitungsmodell.
Jetzt, wo es auf Halloween zugeht, vielleicht gar nicht so schlecht.
Das ist immer die Situation, in der ein Softwareprodukt auspacken.
Es ist Aufruf benutzen wollen und absolut nicht verstehen,
wie es benutzbar sein soll. Also genau in der Krise,
wenn Benutzermodell und Systemmodell nicht zueinander passen oder wenn beim Entwurf
eine Bedienoberfläche nicht bedacht wurde, dass dem Benutzer klar sein musste,
was bei irgendwelchen Reaktionen geschehen soll, ja.
Also wenn das gerade zu kritisch wird, weil wenn jedes Mal,
wenn sie dieselbe Eingabe machen, was anderes passiert,
wenn sie unerwartete Ausgaben bekommen und was weiß ich,
dann gibt es eigentlich nur eins in dem Fall,
das System kurz und kleinhauen drauf zu verzichten ist,
zu benutzen,
ist es gefährlich,
Einen Softwareprodukt ohne klares Verarbeitungsmodell sollten sie nie erzeugen,
sondern es muss allen Seiten klar sein,
was das Verarbeitungsmodell ist, was dort stattfindet.
Und diese mystischen Modelle sind vor allem deshalb so kritisch,
weil wenn ein Computer ist, ausführt, denkt der Laie,
das ist präzise, schließlich macht es einen Computer.
Das ist, Software wird viel zu hoch eingeschätzt als
etwas Präzises, solide funktionieren, das macht immer dasselbe.
Es ist etwas, worauf man vertrauen kann
Und diese Einschätzung ist total falsch.
Ich hatte mal im Altona Bahnhof ein schönes Beispiel gesehen.
Ich kam da vorbei an einem Stand, der verkaufte ein
gut aussehender junger Herr Horoskope. Und die Leute standen Schlange,
weil er hatte, das war in den 80er Jahren,
war es noch nicht so üblich,
er hatte einen Computer auf dem Tisch stehen,
wo er es verkauft hat.
Ja, war einer der ersten PCs.
Und Chatwerk kauft Computerhoroskope. Ich habe immer gefragt, ja,
weshalb wollen sie eigentlich sich hier ein Horoskop erstellen lassen?
Glauben sie denn da dran
Eigentlich nicht. Also nicht, wenn es so in der Zeitung steht,
aber da wird es so von einem Computer errechnet, dann muss es stimmen.
Ja, und das ist eben die Frage,
Algorithmus wird dadurch nicht besser, dass er von einem Computer durchgerechnet wird,
wenn der Algorithmus in sich schon fragwürdig ist.
Und wenn auch nicht klar ist,
wie es zu diesem Horoskop kommt, also naja, okay.
Also die mystischen Verarbeitungsmodelle, woran erkennen wir sie? Unvorhersehbares Systemverhalten,
ja, immer wenn man, man tut dasselbe,
gestern war das Menü, der Menüantrag noch da,
heute nicht mehr.
Wenn sich überraschende verborgene Zustände auftun,
im nettesten Fall Ostereier,
manchmal auch was anderes
Wenn wir unreproduzierbare Fehler haben, wenn die Fehlermeldungen total unsninnig sind,
einer der Computer, mit denen ich mal arbeiten musste,
Minkel-Prozessmaschine, gab, wenn irgendwas unklar war,
immer nur Sternen, Sternen, zwei Sternen Sternen,
ja, sah gut aus,
aber auf der Dauer fand ich es wenig hilfreich.
Wenn die bedienen Oberflächen unergonomisch verwirrend sind und man einfach nicht finden kann,
was gebraucht wird, unter die Handbücher unverständlich sind.
Also kurz und gut. Das ist nicht beherrschbar und das ist gefährlich.
Also man kann nichts Kritisches von solchen Programmen abhängig machen.
Und im Wesentlichen weg damit. Ganz entschieden,
Nein sagen und zu sehen ist sowas vom Markt verschwindet.
Und selbst auch nicht dran mitarbeiten, außer es lässt sie nicht vermeiden.
Aber dann versuchen auch Besserungen hinzuwirken. Zu Zeiten,
als die großen Diskussionen über Steuerung von Interkontinentalraketen und dem großen Schutzschirm stattfanden,
auch Hochzeit der Programmiersprache Ada übrigens, der sagte,
CAHR,
eine unzuverlässige Programmiersprache
Aus der Unzuverlässige Programme hervorgehen, bedeutet sehr viel größere Gefahr für unsere Gesellschaft,
als unsichere Automobile, giftige Festizide und Reaktorunfälle in Kernkraftwerken.
Vorher meinte damit im Wesentlichen die Programmiersprache Ada ein bisschen ungerecht.
Gut, also ich habe ihre Erinnerung aufgefrischt, wie Zahl der Programmierstile.
Es gibt noch ein paar mehr, ich habe einige ausgelassen.
Ja, und jetzt kommt natürlich die große Frage, welches ist der Beste?
Ich könnte es mir jetzt einfach machen und sagen, klar,
der Funktionale. Im Wesentlichen aber Ist die Antwort auf diese Frage
gar nicht so einfach? Es gibt für jedes Problem,
das zu lösen, ist den besten Programmierstil.
Sie sollten es von den Problemen, die sie lösen wollen,
von der Aufgabe, für die sie einen Algorithmus brauchen,
abhängig machen, welchen Programmierstil sie verwenden.
Weil wir haben ja gesehen, der Programmierstil beschreibt die Art
der grundlegenden Objekte und der Operationen, die auf diesen möglich sind.
Und wenn sie ihr Problem analysieren,
sollten sie es mithilfe einer Programmiersprache machen,
die für ihr Problem
die besten Abstraktionsmittel bietet
Weshalb sie als Informatikerin oder Informatiker dieses Lernen ist,
weil sie eben auch lernen müssen, festzustellen.
Gibt es den Programmierstil schon, der mein Programm löst?
Wenn nicht, setzen Sie sich bitte auf den Hosenboden,
analysieren Ihr Problem, sagen, wie der Programmierstil aussieht,
mit dem dieses Problem am besten und treffendsten beschrieben werden kann
und bauen sich diese Maschine.
Und auch dafür lernen wir Liz und da eben eine Sprache der Liz-Familie,
weil wir Seit der Gründung und ersten Erfindung von Lisby
jedes Jahr gesehen haben, dass ein neuer Programmier still reinkam.
Es ist so einfach zu erweitern. Also der schickste und modernste Programmierstil,
der gerade da ist, wo taucht er zuerst auf?
Sobald bekannt geworden ist, dass es gibt,
können Sie darauf wetten. Sie finden ihn als Lisp-Erweiterung.
Ziemlich bald. Ja, die Sprache ist sehr lebendig.
Gut. Also, eigenes Problem adäquates Verarbeitungsmodell definieren,
wenn Sie sehen, dafür gibt es einfach noch nichts.
Eine passende Programmiersprache definieren,
die virtuelle Maschine implementieren und
dann können Sie loslegen
Okay. Gut, die Programmiersprachen kommen wir jetzt mal dahin.
Was sind so die Ausdruckskraft? Darauf zählt es hier hin
. Wir brauchen Programmiersprachen mit einer Ausdruckskraft, in der
wir ohne drumherum reden zu müssen unser Problem beschreiben können.
Es gibt einmal General Purpose-Programmiersprachen, also das ist das,
was Sie jetzt gelernt haben, mit Java.
Auch Prolock ist eine General Purpose-Sprache,
die Familie der Listsprachen ist eine,
es gibt aber auch Spezialsprachen wie Datenbanksprachen oder so,
die sich nur für ganz bestimmte Gebiete eignen
Wir mal auf die Programmiersprachen. Wir haben im Wesentlichen in
der Welt der Programmiersprachen für die funktionale Programmierung zwei typische Familien.
Gut, für Sie habe ich die Listenfamilie ausgesucht,
sagte ich schon. Und da werden wir eben Regit verwenden,
weil es das neueste und modernste Mitglied dieser Familie ist.
Es gibt daneben funktionale Programmiersprachen, die alle verwandt sind mit
Miranda oder Hessgirl. Und beide Sprachen haben ihre großen Anhängerkulturen,
weshalb habe ich mich für die List-Variante entschieden
Ich sag mal zuerst, was wir vermissen werden,
weil wir nicht Miranda oder Häskel nehmen.
Im Rande und Teskel sind Sprachen mit einem Strong Typing. Ja,
und ich habe mir gesagt, sie haben jetzt zwei Semester lang,
der strenge Typ, die strenge Typisierung von Yava erdulden müssen.
Wir können mal gucken, dass sie auch sehen,
wie es an einer ungetypten Sprache aussieht,
die kann es, welche zusätzlichen Freiheiten kommen.
Sie sind inzwischen weit genug, das für sie nicht riskant wird.
Das zweite ist, Wegen des Strong Typings sind Teskel,
Miranda nicht so erweiterbar in puncto Meta-Programmierung.
Und genau das wollte ich Ihnen eigentlich beibringen. Es gibt in der Sprache
auch keine Symbolverarbeitung. Und die Symbolverarbeitung macht es am leichtesten,
das, was Wolfgang Menzel in seiner Vorlesung behandelt,
in relationalen Programmierstil, in eine funktionale Sprache einzubauen,
ohne Symbolverarbeitung, hätte ich nie im Leben Lust gehabt,
solche Spracherweiterungen in die funktionale Sprache einzubauen.
Deshalb also, wir werden die Listefamilie kennenlernen, Symbole,
dynamische Typisierung, Hybrid, Und streng getypt, hässgel,
grande, wenn sie in anderen Modulen das brauchen,
werden sie es mit Liz-Kenntnissen leichter arbeiten können.
Das ist nicht so schlimm. Gut. Und wir werden
vor allem Symbolverarbeitung kennenlernen. Gut, ich hatte schon gesagt,
McCasty hat im Wesentlichen Delamber-Kalkül zu einer Programmiersprache gemacht.
Und Liz ist eine der ältesten Programmiersprachen, die immer noch benutzt wird.
Liegt eben daran, dass diese Sprache riesen Evolution mitgemacht hat. Ja,
es ist heute im Kern immer noch das alte Lisp,
aber alles, was an wichtigen neuen Konzepten erfunden wurde,
ist drin, weil das so einfach reinzubringen ist.
Das Gute, was bedeutet der Name Lisp? Offiziell stets für
List Processing, weil Listen, die elementare Datenstruktur sind,
oft mit der wir sehr viel arbeiten werden.
Es gibt gehässige Ketzer, die sagen, das heißt was anderes.
Lots of Silly in City is Parencieses.
Also wir werden, die Klammerntasten ziemlich abnutzen
Es gibt also den Vollausbau von Liz,
so die Pro-Version, das ist das Ansehen kommendes.
Das ist ein genormter Objekt orientierter Liz-Standard. Und da ist
wirklich alles drin, was das Herz begehrt. Ich habe
ein Semester lang an Sie kommendes für die Übung genommen und habe schnell wieder aufgegeben,
weil es blieb nichts mehr übrig für Astsemesterübungen,
was man noch programmieren könnte.
Also Student von heute setzt sich hin,
schlägt das Handbuch auf und stellt fest, aha,
Aufgabe 3, wir brauchen eine Funktion,
die eine Liste flach macht.
Na gut, Handbuch
Ist schon da, ich rufe sie auch für Übung gelöst, ja.
Es war nichts Einfaches, zum Programmieren mehr da,
was man tun könnte, was nicht schon in den Paketen da ist.
Und es ist so ausgefeilt, dass es man auch zum Erklären
der Syntax der Sprache schon, das halbe Semester braucht,
dann kommt man nicht mehr zu interessanten Konzepten. Okay,
aber wenn sie professionell in Liss programmieren wollen,
würde ich sagen, nehmen Sie eine Variante von Anse kommen lässt,
dann wurde Ende der 80er Jahre von Abless und Sussman die Sprache Skim entworfen und diese Sprache ist,
soll der Vorfahrer von dem Racket,
was wir jetzt seit ein paar Jahren in SE3 verwenden.
Ja, im Kern ist unser Racket noch das gute alte Skim.
Das ist ein orthogonal entwaffnenes Kernsystem. Wie gesagt, in Liz
ist alles in tausend Ausprägungen drin. Stellen Sie vor,
sie sind Hobby-Heidenwerker und wollen wirklich für jeden Zweck gerüstet sein,
richten ihre Werkstatt ein, haben von jedem Werkzeug tausend unterschiedliche Ausprägungen.
Drehbank, die man modifizieren kann und so weiter,
dann haben sie Lösb. Und wenn Sie sagen,
ich bin Survival-Künstler und möchte das Wichtigste bei mir im Rucksack haben,
dann kaufen Sie sich ein Schweizer Messer und das
ist so das Analogon
Zu Recket oder Skim? Man kann damit auch alles machen,
aber von jedem Werkzeug gibt es nur eine Form und das
ist so ausgelegt, also für die meisten Zwecke passt.
Ja. Gut. Also auch Recket hat funktionale Abstraktionen,
klar, Symbolverarbeitung, dynamische Typisierung, vorgezogene Auswertung, wichtiger,
semantischer Unterschied. Vorlesung 4, wo wir es genau erklären,
wir haben Metaprogrammierung und keinen syntaktischen Unterschied zwischen Programmen und Daten.
So, Peter Norweg hat es auf den Punkt gesagt,
Relevanz von Liz, ist eine der ältesten Sprachen.
Sie wird besonders für die KI-Programmierung eingesetzt.
Und bei vielen ist so dieses Bild dann, na gut,
die List-Welt ist die Sprache für die KI-Spinner. Ja,
also nur die, die ihre Sachen da machen,
verwenden List, aber für Leute,
die was Praktisches brauchen und was in der Welt akzeptiert und verstanden wird,
nehmen wir doch lieber Java.
Okay, das ist eine gute Sicht drauf.
Das wirst du mal ein bisschen nachfragen,
warum eigentlich für künstliche Intelligenzprobleme List genommen wird und nicht Java.
Es gibt nur wenige Tabfütterer, die es versucht haben,
so ein Java zu machen und böse auf die Nase gefallen senden.
Expertensysteme in Java schreiben. Die List ist die Sprache,
in der man mehr kann
Das ist einfach, muss man so sehen. Das ist eine Sprache,
die viele Möglichkeiten bietet, die eine gendere Purpose-Sprache,
die aber speziell für kommerzielle Software ausgelegt ist, nicht hat.
Also die vielen Freiheiten, Möglichkeiten, andere Programmierstile reinzubringen und so weiter.
Inferenzenmaschinen reinzubringen, das hat man nur in Liz.
Und weil es eben nur in Liz geht, ist das die Sprache,
die in der KI genommen wird für die wirklich schwierigen Probleme,
wo man neue Algorithmen entwickeln und ausprobieren muss.
Und na gut, Peter Norweg hat es in der Einleitung
zu seinem Buch über Programmieren in List gesagt,
if you're going to learn the language,
it might is vell be one of a,
wann wir so growing littwitcher, rather than a dead tang.
Okay. Also, List ist keine Special-Popelsprache für die KI-Programmierung.
C oder Java könnten wir als Jenner als spezielle Sprachen für
numerische Probleme, für kommerzielle Probleme und so weiter ansehen.
Ja, die sind auf einem bestimmten Anwendungskreis ausgerichtet.
Probleme der traditionellen DV
Okay. Lisbe ist ein Chamäleon, ja. Also wenn
immer ein neuer Programmierspiel ausgefunden wurde, war er da.
Und das Lisbe von gestern ist nicht das von heute.
Okay. Anfassungsfähigste Sprache, die ich kenne,
und die will jetzt nicht weggehen.
Gut, weshalb denn mehr als ein Verarbeitungsmodell.
So können Sie jetzt sagen, ja gut,
mein Java ist doch eine General-Purple-Sprache.
Irgendwie werde ich
jedes Problem gelöst kriegen
Wenn sie gute Informatikerinnen und Informatiker sind,
können sie das auch. Aber die Frage ist,
wie gut und wartbar und pflegeleicht sie das lösen können.
Gegeben, wenn man nur ein Werkzeug hat,
dann ist es einfach so, wie die vorderen Programmierer der NASA, ja.
Man hat einen Hammer und versucht, jedes Problem wie ein Nagel zu behandeln.
Man nimmt seinen Hammer und dort drauf, weil das ist,
wie man mit einem Hammer den Nagel bearbeitet.
Wenn dieser Blick so eingeschränkt ist und alles sieht so aus
wie dieser Nagel, dann kommt man nicht weit,
weil man eben die passenden Sprachelemente verpasst
Und wenn wir keinen Hammer haben, wie die Forttransprogrammierer,
die mit einmal... Die Sprache Ada nehmen sollten, ja?
Gut, dann hämmern sie eben mit ihrem Ada.
Und es gibt nur diese eine Methode hämmern,
egal was wir haben, wir hämmern damit.
Und was sie eben lernen sollen, ist feststellen,
viele unterschiedliche Probleme, unterschiedliche Programmierstile,
für jeden Zweck das passende Werkzeug finden und
eine passende Art wie ein Problem analysiert werden sollte.
Ja, ein paar organisatorische Sachen sollten wir noch mal anschauen.
Sie haben im Online-Skript finden Sie ein kommentiertes Vorlesungsverzeichnis, ja.
Und Bücher, die ich Ihnen ans Herz legen möchte,
also aus historischem Interesse, aber auch,
weil das Buch einfach so toll zu lesen ist,
sind die Grundideen gut erklärt, Struction, Interpretation of Computer Programs.
Schauen Sie gerne mal rein,
das wird die Urform von Recket, das Gim erklärt.
Die Recket wird in seiner Form am ersten erst beschrieben in
dem Buch von Felleisen, Findler Flat, How to Design Programs.
Und das Schöne an diesem Lehrbuch ist,
dass es in der Entwicklungsumgebung, die wir haben,
direkt verlinkt ist. Das heißt, sie können jederzeit,
wenn sie am Programmieren sind, auch in dieses Buch reingehen.
Die meisten Bücher, die es gibt für diesen Bereich,
richten sich
Entweder an fortgeschrittene Studis im Masterstudium oder aber an Erstsemester.
Also für den mittleren Level, den ich sie jetzt hier einschätze,
da gibt es einfach keine Literatur. Und deshalb ist mein
Skript ein bisschen dicker geworden, ja, nicht erschrecken.
Ich habe aus verschiedenen anderen Büchern über funktionale Programmierung versucht,
diese beiden Ebenen einander anzupassen. Also die formalen methodischen Grundlagen
sind zuerst sehr gut beschrieben worden von Bört und Wodle.
Dummerweise haben die das Ganze in der Miranda-Hästel-Welt gemacht.
Also ich kann Ihnen das Lehrbuch nicht geben, als Begleitung
für diesen Kurs. Ich habe alle Programmbeispiele und Konzepte,
die hier im Bird and Woddler beschrieben und hergeleitet wurden,
in Reckett übersetzt und habe sie in der Programmbibliothek für sie zur Verfügung gestellt,
sodass wir das im Skript in Reckett beschrieben finden.
Wer den theoretischen Hintergrund besonders gut dargestellt finden möchte und in Hang zur Theorie hat,
denn bitte kommt mal bei Lippe und Wolfram reingucken.
In der zweiten Setmesterhälfte, wenn wir uns objektorientierte Erweiterungen anschauen,
dann können Sie mal in dieses Buch von Sonja Kini reinschauen
Emmaskuy to chillos. Zillos ist in Rekord schon drin.
Es ist das Objektsystem aus Kommenlisp und es
ist eingeführt worden und wir können es direkt benutzen.
Und das Buch von Sonja Kieni ist wirklich lesenswert.
Das Kurzprogramm dazu, da habe ich das Skript Beispiel
aus dem Skript draus genommen, ist von Peter Graham N.
Sie kommen Lisp. Also der hat es geschafft,
wofür Sonja Kieni 100 Seiten gebraucht hat,
um es richtig gut zu erklären, auf 20 Seiten zusammenzufassen.
Also die Kurzfassung für Eilige finden sie hier. Für die
relationale Programmierung finde ich immer noch Programming Prolock von Clocksin und Managed Super.
Und das könnten sie, das passt vermutlich auch sehr gut
zu dem, was Wolfgang Menzo in diesem Semester macht.
Wenn nicht, sagen sie es mir,
dann werde ich in eine andere Empfehlung reinschreiben. Die Programmentwurfsbeispiele,
die ausgefeilten Dinge, die wir uns anschauen werden,
wie zum Beispiel, wie programmiere ich mir Mathematiker oder so.
Etwas habe ich aus dem Buch von Peter Norweg entnommen.
Da sind viele Fallstudien zum ersten Mal systematisch zusammengetragen worden,
wie man das in der Liz Game Reckett-Welt-Programmentwurf macht.
Und wenn jemand wissen will,
wie man die beiden Welten relational und logisch zusammenbringen kann,
die Einführung von Fleetman and Bird, The Reason Skimmer,
ist lesenswert, ist allerdings echt nichts für Anfänger.
Es ist etwas mehr, sagen wir mal, Masterlevel,
man möchte die fortgeschrittenen Dinge kennenlernen. Gut, Handbücher,
Online, The Revised Report. Und für diejenigen,
die eine ganz sanfte, zarte Einführung für Racket brauchen,
weil sie einfach nicht dahinter kommen,
was das soll mit Klammer auf und Klammer zu und was soll das dazwischen?
The Little Streamer gibt einem viele nette, hilfreiche Beispiele und also das,
wenn das nicht hilft, weiß ich nicht mehr.
Online finden sie alles bei Racket Langorg, ja,
und da können sie auch,
was immer sie selbst an Rechnern haben,
sich eine Version runterladen.
Die Sachen zur Vorlesung habe ich auf meiner Web-Pitch eingestellt.
Sie können, wenn Sie da gucken,
gibt es einen Link in der linken Spalte für dieses Semester.
Und da können Sie dann auf die Lehre gehen und es gibt eine Skriptseite.
Sie sehen in der URL hier, dass die allgemeinen Vorlesungsunterlagen
frei erreichbar sind, die doch nirgendwo Informatik auf.
Aber der Link, der wir von zu den Skripten zeigt,
enthält Informatik im Pfad. Und das heißt,
dass man im Rechnernetz der Informatik sein muss über VPN zum Beispiel,
um das Skript selbst runterladen zu können
Wenn Sie Schwierigkeiten haben, ins Informatiknetzwerk zu kommen,
weil sie selbst dort keinen Account haben oder etwas,
dann bringen Sie Ihren USB-Stick mit,
dann gebe ich Ihnen das Skript hier direkt.
Gut. Also ich habe das Skript aus zwei Gründen im Bereich,
wo es nur Studierende von unserem Fachbereich sehen können.
Das eine ist, ich habe einige Bilder aus Büchern und
so weiter einfach übernommen und per Copyright kann das nicht
in einem öffentlichen Teil des Netzwerks sein.
Das zweite ist, dass in den Jahren,
wo ich die Folien öffentlich im Netz hatte,
ich Wochen später meine Folien mit den Namen jemand anders im Netz gefunden habe.
Nicht mal ein Acnoledgement oder wo es sehr war.
Und das passiert immer wieder. Und das möchte ich einfach nicht haben,
dass Kollegen ohne mich persönlich anzusprechen und zu sagen,
ich möchte sie auf die Vorlesung verwenden.
Meine Folien klauen ihren Rahmen drum setzen und sie als ihre verkaufen. Okay,
das sind, also die Gründe, weshalb es da ist,
die Aufgabenblätter werden sie an derselben Stelle finden,
Dressley,
Übungen und da werde ich im Laufe der Zeit
in diesem Lehreblock einfach ein Aufgabenblatt nach dem anderen reinhängen.
Sie meistens schon ein bisschen im Voraus,
dass sie sehen können, was da so auf sie zukommt.
Auf den Seiten finden sie auch Probeklausuren aus den Semestern davor.
Sie können also so gegen Weihnachten schon mal anfangen, sich anzugucken,
wie die Klausur aussieht und dass sie dann zielgerichtet lernen können.
Fragen Sie beim ersten Übungstreffen Ihre Übungsgruppenleiter nach Ihrer E-Mail-Adresse
und geben Sie Ihre Lösungen,
bitte per E-Mail ab
Wir haben folgenden Zeitplan, 12 Uhr mittags, montags,
sollten die Lösungen per E-Mail eingegangen sein bei ihrem Übungsgruppenleiterinnen und Übungsgruppenleiter.
12 Uhr mittags für diejenigen, die sicher sein wollen,
dass bei der, beim folgenden Übungstreffen auch ihre Lösung schon besprochen werden kann.
Wenn jemand jetzt echt Schwierigkeiten hat, kannst du nicht termingerecht abgeben.
Die Notfallauffanglinie ist 10 Uhr dienstags, 10 Uhr dienstags ist meine Übungsgruppe.
Und nachdem die Lösung in meiner Gruppe besprochen worden sind,
nehmen wir keine Lösung mehr an, um dafür Punkte zu vergeben.
Sie können sie immer noch korrigiert kriegen, kein Problem,
geben sie es später ab.
Aber wenn sie die Punkte für einen Schein angerechnet haben wollen,
müssen sie wirklich allerspätestens bis dienstags 10 Uhr in der Mailbox.
Bei ihrem Übungsgruppenleiter angekommen sein. Und nicht vergessen auf ihren
Abgaben drauf zu schreiben, einen vollen Namen, Matrical-Nummer,
zu welchem Blatt die Lösung sein soll.
Also manchmal erschließen sich uns diese Dinge nicht automatisch,
wenn wir das Ganze sehen
Kleine Besonderheit, Wolfgang Menzel macht es nicht anders.
Während die Zahl der Punkte, die man pro Blatt kriegt,
steigt, ich habe ja gesagt, ganz zu Anfang,
werden es im Wesentlichen Fingerübungen sein,
wo noch nicht viele Konzepte gelernt werden, sondern nur überhaupt,
wie kriege ich überhaupt so ein Dreckigprogramm zum Laufen?
Und was sind die Elementaren Datenstrukturen? Wenn es anfängt,
etwas konzeptuell spannender zu werden, so ab Blatt 4 Semantikrekursionen gibt es mehr Punkte.
Und fürs letzte Aufgabenblatt gibt es auch Punkte,
Dies Blatt muss erst abgegeben werden, wenn sie eigentlich die Klausur schon geschrieben hätten.
Jedenfalls, sie können wir nicht mehr besprechen. Also stehen die in Klammern,
das ist dafür da, dass diejenigen,
die bis zur zweiten Klausur noch irgendwie die Punkte zusammenkriegen wollen,
eine Chance haben, das zu schaffen.
Gut, aber die Zahl der Punkte steigt. Das heißt,
sie müssen auf jeden Fall Aufgabenblätter aus der zweiten Semesterhälfte bearbeiten.
Und sie müssten die Hälfte der Punkte schaffen,
dass wir sie zur Klausur zulassen
Das ist also das Ziel,
was sie vor sich haben, die Termine,
die variieren noch, die nehmen sie bitte nicht so ernst,
aber im Wesentlichen kriegen sie immer am Freitag vorher die Aufgabe und müssen am drauf folgenden Montag,
also eine Woche später, die Sachen abgeben.
Okay. Teamarbeit, bitte, wenn bis zum ersten Übungsgruppen
treffen, finden sich in Dreierteams zusammen, ja.
Gut, und jeder soll seine Lösung zweimal vorstellen und
das haben wir es dann im Wesentlichen.
Ja, vielen Dank für die Aufmerksamkeit