 Herzlich willkommen zum Vortrag über esoterische Programmiersprachen. Freut mich, dass ihr da seid. Esoterische Programmiersprachen. Was ist das überhaupt? Also der Begriff esoterisch kommt aus dem altgriechischen Esoterikos und setzt so viel wie aus zu dem inneren Kreisgehören. Das bezog sich ursprünglich auf die Lehren des Pythagoras, seine geheimen Lehren irgendwie. Der Begriff veränderte dann so die Bedeutung von diesem über etwas mystisches bis hin zu irgendwelchen Sachen, die sich nur so auf theoretische Konzepte basieren und irgendwie keine praktische Anwendung haben. Und das ist hier so der Fokus, um wie es geht. Esoterische Programmiersprachen sind solche, die halt nicht dafür entwickelt wurden, dass sie irgendwie nützlich sind, sondern andere Ziele haben, zum Beispiel einen Proof-of-Konzept darzustellen, irgendwie einen Konzept zu demonstrieren, oder irgendwie künstlerische Ausdruck zu sein, eine Herausforderung darzustellen, entweder für den Anwender oder für den Designer der Schwache selbst, oder einfach ein Witz zu sein. Naja, und in dem Vortrag möchte ich euch völlig verschiedene Schwachen vorstellen, die alle relativ prototypisch so für ihre jeweilige Kategorie sind. Und was sie gemeinsam haben, ist, dass alles imperativ besprachen sind und aus dem Sinne alle Touring vollständig. Man kann mit ihnen eine Touringmaschine simulieren oder anders gesagt alles brechen, was man auch mit verbreiteten normalen Programmiensprachen machen kann. Das ist bei manchen relativ erstaunlich. Gut, und die erste Schwache, die ich euch zeige, ist BrainFuck. Das ist sicher vielen von euch ein Begriff. Die Sprache wurde 1993 entwickelt von Obernd Müller. Der war zu dem Zeitpunkt Physikstudent in der Schweiz, hat irgendwie an seiner Uni so ein Online-Archiv übernommen von Amiga Software. Aminet hatte sich das. Und in dieses Archiv hat er dann selber 1993 den ersten BrainFuck-Compiler hochgeladen. Was seine Motivation war, dass eine Sprache entwickelt, deren Compiler möglichst klein sein kann. Also sein Compiler, den er hatte, den man da auch immer noch sehen kann, ist knapp 300 Beit groß. Fun Fact, dass es ungefähr doppelt so viel wie der gesamte Text, den ihr gerade auf der Folie seht. Ja, und diese geringe Größe konnte halt dadurch erreichen, dass die Sprache selbst eine ganz minimalistische Syntax hat. Also die verwendet nur diese acht Kommandos, die der seht. Spitz und eckige Klammern, Punkt und Minus, Komma und Punkt. Mit denen kann man alles machen. Der Name der Sprache, also BrainFuck, ist ein ungesachlicher Begriff, der sich auf ein schwer zu verstehenes oder kompliziertes Ding bezieht. Darauf kam er sicher, weil er sich dann so kurz angeguckt hat, seiner Sprache, und das war dann so Sonderzeichen. Und wenn man da nicht weiß, was passiert, versteht man das halt nicht. Aber wir gucken uns mal ein paar Beispiele an. Dieses Programm funktioniert so. Also erst mal das Konzept von BrainFuck überhaupt, das so rundelige Modell ist, dass es ein Tape gibt, was irgendwie unendlich lang ist und in einzelne Speicherzählen eingeteilt ist, die jeweils ein Beid speichern könnten. Eine Zeile von 0 bis 155. Und auf diesem Tape fährt dann ein Leseschreibkopf verruben. Na ja, und mit spitzen Klammern zum Beispiel, bewegt man jetzt diesen Schreibkopf nach rechts. Also was das Programm erstes macht, ist, den Schreibkopf drei Schritte nach rechts zu fahren. Dann kommt das Komma, das liest von dem Benutzer einen Askezeichen ein, und speichert dessen Wert in der aktuellen Zelle. Genau, das Minus zielt halt von dem aktuellen Wert eins ab. Und der Punkt gibt dann das Askezeichen, das wir gerade in der Zelle haben, aus. Dann fahren wir wieder drei Schritte nach links. Dann erhöhen wir den Wert, der da steht, um 10. Standardmäßig sind alle Zellen auf 0 initialisiert. Das heißt, da haben wir jetzt einen 10 drin stehen. Und dann geben wir das auch nochmal als Askezeichen aus. Das heißt, was dieses Programm macht, wenn man dem ein F als Eingabe gibt, das im Alphabet 5 nach vorne zu schieben, dann hat man ein A. Und dann das Askezeichen mit dem Wert 10 auszugeben, das ist halt ein Zeichen und Buch. Genau. Und in dem Programm haben wir jetzt schon mal 6 der 8 Zeichen drin. Das folgende Programm hat noch die beiden letzten. Wir erzeugen uns in dem Programm als erstes eine 5. Und die eckigen Klammern sind dann ein Schleifenkonstrukt. Die öffnende Klammer prüft, ob wir gerade im aktuellen Feld eine 0 haben. Und nur wenn man dann eine 0 hat, dann überspringt es die Schleife. Dann springt es halt zu erschließenden Klammern. In dem anderen Fall, so wie hier, jetzt haben wir dann eine 5 stehen, geht es in die Schleife rein. Und was dieses macht, ist, von dem aktuellen Wert 1 abzuziehen, 1 nach rechts zu fahren, dort einen Stoff zu addieren und wieder nach links zu fahren. Und das wird jetzt solange wiederholt, bis in dem Feld, bei dem wir dann am Ende der Schleife sind, auch wieder eine 0 ist. Denn dann wird die eckige Klammer die Schleife beenden. Wenn wir da etwas haben, was keine 0 ist, zum Beispiel zu dem Stand gerade, haben wir da eine 4 stehen, weil wir jetzt abgesungen haben, dann springt es wieder zu öffnenden Klammern und das ganze Welt wiederholt. Das heißt, was dieses Programm macht, ist, sich eine 5 erzeugen und das dann eine Zelle weiter schieben nach rechts. Genau. Und das ist noch das dritte Programm. Das sieht schon ziemlich vainfackig aus. Aber das möchte ich euch erklären, was es tut. Ich habe bis euch, genau, hier ist ein Beispiel, es kriegt einen H und gibt dann die Binetterstellung dieses Askezeichens aus. Genau. Auf der nächsten Folie habe ich das mal hübsch eingerückt. In vainfack ist es ganz praktisch, so dass man whitespace beliebig reintun kann. Das wird einfach ignoriert. Genauso wie auch Buchstaben oder andere Zeichen, die nicht diese 8 sind. Das bedeutet, man kann da auch so inline Kommentare reinschreiben. Das ist eigentlich ganz nett. Und in dieser Darstellung sieht man ein bisschen klare, was die einzelnen Teile davon sind. Also ihr seht das Tape, was auf 0 initialisiert ist. Wir sind da gerade auf dieser blaue Marketen mit dem Kopf und ziehen davon als erstes 1 ab. Dann kriegen wir einen Underflow und kriegen diese 255. Und das dient uns später als Marker, um die Startposition wiederzufinden. Genau. In Seile 2 beginnt dann so die äußere Schleife. Was die als erstes macht, ist ein Feld nach rechts laufen und das erste Zeichen von Benutzer eingeben. Das ist hier das H. Kriegen wir den Askelwert 104. Und die Schleife, die jetzt startet in Seile 4 wird diesen Wert nehmen und auf den 8 Stellen links von dem Marker die Binetterstellung berechnen. Das funktioniert so, dass wir erst mal 2 nach links fahren. Dann kommt in Seile 6 die Schleife, die guckt, ob wir eine 0 haben. Die öffnende Klammer. In diesem Fall ist es tatsächlich so. Deshalb wird die zum jetzigen Zeitpunkt erst mal übersprungen. Und in Seile 7 addieren wir da eine 1. So. Und was Seile 8 dann macht, ist wieder zum Marker zurückfinden. Das funktioniert so, dass es erst mal 1 addiert und dann kommt wieder so. Eine Schleife, die guckt, ob da jetzt eine 0 ist. Das ist halt nur dann so, wenn da vorher eine 255 war, auf die wir dann 1 addiert haben. Das heißt, in diesem Fall zum Beispiel, wo vorher eine 1 war, haben wir jetzt eine 2. Und deshalb gehen wir in die Steife rein. Das Minus setzt es wieder auf den Wert zurück, den es vorher hatte. Und dann fahren wir 1 nach rechts und probieren das da nochmal, ob da vielleicht der Marker ist. Wir addieren 1 und die schließende Klammer guckt, und in diesem Fall ist es tatsächlich so, weil wir beim Marker angekommen sind, dann wird diese kleine Schleife verlassen und mit dem Minus setzen das wieder zurück auf den ursprünglichen Wert. Genau, in Seile 9 fahren wir wieder auf unser Askelzeichen und ziehen von dem 1 ab, weil wir jetzt ein Byte von dem auf die linke Seite geschaufelt haben. Und damit ist dieser indere Schleife zu Ende und weil wir da jetzt noch was übrig haben, nämlich 103, fahren wir wieder in Seile 4 und machen das nochmal. Jetzt gehen wir in Seile 2 nach links. Jetzt kommt wieder dieser Schleife, die guckt, ob da eine 0 ist. In diesem Fall ist da keine. Deshalb gehen wir rein, ziehen da 1 ab und gehen 1 nach links. Das heißt, was diese Seile 6 macht, ist, alle 1s, die wir haben, auf 0 zu setzen und sich dann auf 1 fällt links, daneben zu setzen. Und da addieren wir jetzt 1. Das heißt, das sind Schiebereges da, und kriegen dann die Wiedererstellung. Genau, und in Seile 8 machen wir es wieder, dass wir den Marker zurückfinden. Da ist irgendwie keine 250 gewesen, da auch nicht. Weil die Schleife wiederholt und hier haben wir unseren Marker gefunden und verlassen dann die Schleife. Und ziehen da wieder 1 ab. Genau. Gut, und das machen wir jetzt 102 Mal. Dann haben wir diese Situation, dass wir auf dem rechten Feld nur noch 0 übrig haben und auf der anderen Seite haben wir die Erzgeberstellung. Genau, in Seile 11 lesen wir dann auf das allererste Witt davon. Und was jetzt Seilen 12 bis 17 machen, ist das Ausgeben. Das ist nicht so richtig spannend, deshalb erkläre ich das nicht im Detail. Wesentlichen, was das einfach macht, ist, in dem äußeren Schleifenkonstrukt immer wieder zu gucken, sind wir gerade beim Marker. Wenn nicht, dann mache ich mal was und gehe dann nach rechts. Und was es macht, ist halt sich eine 48 addieren und dann das Askezeichen auszugeben. Was dazu führt, dass wir dann tatsächlich die Zeichen 0 und 1 ausgeben können. Genau, und dann haben wir unsere Ausgabe für das kleine H. Jetzt sind wir in Seile 18 am Ende der äußeren Schleife und das können wir jetzt beliebig wiederholen für den restlichen Input. Genau, so funktioniert dieses Programm. Winefuck. Ein bisschen. Genau, hatte ich schon gesagt, das ist sicherlich die bekannteste esoterische Programmiersprache. Es gibt irrsinnig viele Implementierungen davon. Eine ganz coole ist AWIP, steht für Winefuck Compiler written in Winefuck. Also ist da sich in Winefuck geschrieben und kann nicht nur Winewies ausgeben, sondern zum Beispiel auch Rubycode und Ccode und Java und so. Und es macht Optimierungen, das ist noch ziemlich geil. Also es ist echt ein coole Programm. Der kleinste Interpreter, den es gibt, ist 1998, beid groß. Er ist mal bei einem Wettbewerb entstanden, das ist irgendwie ein MS-DOS-Exekutivell. Und ich glaube, der kleinste Compiler, den es gerade gibt, ist so 200 beid ungefähr. Der Ursprüngliche von Urban Müller waren ja so knapp 300, genau. Oh ja, und jemand hat einen Textadventar geschrieben. Das fängt so an. Aber das erkläre ich euch jetzt nicht, dass wir das mal so machen. Es gibt auch viele Varianten von Winefuck. Da habe ich euch mal ein paar aufgelistet. Unter anderem gibt es Doublefuck. Das benutzt zwei Tapes, auf denen man sich unabhängig voneinander herum bewegen und rein und raus schreiben kann. Es gibt Bullfuck. Da können die Zellen nur einzelne Bits enthalten. Was das so führt, dass Plus und Minus das Gleiche machen. Da kann man dann einen davon wegschmeißen, wenn man das erreicht, spawnt das einen neuen Thread. Ich glaube, in dem Kind lässt es dann eine Null in das Feld und in dem Elternprozess geht es eines nach rechts. Darüber kann man nicht unterscheiden. Und UG ist im Grunde Winefuck, aber die acht Kommandos sind durch verschiedene Intonationen von UG-UG ersetzt. Mit Faggezeichen oder Ausrufezeichen gibt es den Ziel, dass es an Orang-Uterns aussprechen können. Ja. Gut, so viel zu Winefuck. Die nächste Sprache, die ich euch zeigen will, ist Interkyl. Interkyl wird von vielen als die älteste esotiertes Sprache angesehen. Die wurde 72 entwickelt von diesen Herren. Also, so sehen die heute aus. Damals waren die irgendwie gerade mit ihrem Studium fertig. Ich habe ein bisschen zu viel getrunken irgendwie lustige Namen ausgedacht für die ganzen Sonderzeichen. Zum Beispiel dachten sie, es wäre doch lustig, wenn man doppelte Anführungszeichen Rabbit ears nennt oder das Adzeichen Whirlpool oder so. Das fanden sie ganz lustig und irgendwie ist daraus dann eine komplette Programmiersprache entstanden. Ich weiß auch nicht, die möglichst anders sein sollte als die Sprachen, die damals verweitet waren, wie Fortran oder Koboy. Das heißt, das ist wirklich so, dass die Autoren sind merkwürdig, die Eigenschaften sind komisch. Ihr werdet das sehen. Der ausgeschriebene Name ist Compiler language with no-pronounceable acronym. Was dann die Autoren halt zwangend einen anderen auszusuchen. Und das Handbuch davon ist wirklich lustig. Also, wenn ihr euch nach dem Vortrag mal mit irgendwas beschäftigen wollt, lest das Handbuch von Interkyl ist meine Empfehlung. Ich habe euch ein paar Auszüge mitgewacht. Wir haben ein Interleaf-Operator verwechseln, außer unter verwirrenden Umständen. Der Definition von Airway-Dimensionen wird später in mehr Detail diskutiert, weil es in weniger Detail zu diskutieren schwierig wäre. Ex-Präsentiert irgendeinen beliebigen Ausdruck, außer unrausbachlichen und Gesichtsausdrücken. Operatorenreihenfolge ist wie folgt. Dann kommt so eine leere Seite und unten steht, der Rest der Seite wäre absichtlich freigelassen worden. Es gibt keine Operatorenreihenfolge, das ist beliebig. Es gibt eine Fußnote mit diesem Inhalt, die nicht referenziert ist. Na gut, hier ist ein Beispiel in Interkyl. Ihr seht in Zeile 1, es ist das Please. Interkyl hat nämlich eine Höflichkeitsanforderung. Es fordert, dass mindestens ein Fünftel der Zeilen mit Please beginnen müssen, das ist unhöflich. Aber höchstens ein Viertel, das wäre sonst Schleimilch. Das heißt, ich habe hier irgendwie in diesen 7 Zeilen 2 davon zu Please gemacht, das ist okay, sonst kommt halt das nicht. Das ist so ein Präfix, den man vor die Zeile setzt. Dann kommt WriteInSpot1. Spot1 ist ein Variabler, die 16-bit lang ist und die Eingabe erfolgt in ausgeschriebenen Ziffern. Also 5-4, wenn man das Eingibt, dann wird in diese Variabler die Erstellung einer 54 geschrieben. Genau, wenn man eine Zeile nicht mit Please beginnt, beginnt man sie mit Do. Do kam von 42, das merken wir uns mal, die macht aber erst mal nichts. In Zeile 5, das ist eine Zuweisung mit dem Angleworm in 2-Spot1 und dass der Ausdruck, der auf der rechten Seite steht, ist dann kommt der BigMoney-Operator und MeshZero ist dann tatsächlich das Literal0. Das sind hier die beiden Werte, die wir jetzt mit dem Operator verknüpfen. Das ist ein Mingle-Operator. Mingle macht Folgendes nimmt die einzelnen Bits der beiden Argumente und verwebt die so abwechselnd. Das ist dann das Ergebnis. Das ist jetzt unser ursprünglicher Wert, aber da sind nur Lünz zwischen gestopft. Jetzt weißen wir noch 2-Spot2, was zu in der nächsten Zeile vorne steht, das ist der 16-Bit-Wert, der nur aus 1 besteht und hinten 1. Die vermingeln wir jetzt auch, dann haben wir das. Also 1 und 0 abwechselnd und die letzte 0 ist aber durch eine 1 ersetzt. In Zeile 7 sehen wir jetzt den zweiten und letzten Operator, den es gibt. Das ist das Squiggle. Das ist eine Filter-Operation. Die nimmt das erste Argument, das ist unser 2-Spot1 und wählt daraus die Bits aus, die in dem zweiten Argument als Einzengesetzt sind. Wir haben unseren Filter so gebaut, also dieser untere Wert, dass wir jedes zweite Bit davon auswählen und das letzte auch. Das Ergebnis ist das, da haben wir wieder unseren ursprünglichen Wert mit einer zusätzlichen Null dahinter. Das ist meines Wissens die einfachste Möglichkeit, ein Met mit 2 zu multiplizieren in InterK. Es gibt eine Standard-Library, die man aufrufen kann, die man für Multiplizierung benutzen kann, aber intern macht die das. Gut, ja. Jetzt kommt so ein Line-Label 42, was man auch vor Zeilen schreiben kann, wie in Basic ungefähr, haben wir uns einfach so definiert, das ist Zeile 42. Das ist nicht so groß, aber nicht so, wie ihr das erwartet, sondern in römischen Ziffern. Weil, warum nicht? Gut. Und weil das jetzt Zeile 42 war, greift das Kampfform, das ist das Gegenschritt zum Go-To. Wir springen da jetzt hin in Zeile 3 und dann wird das wiederholt. Das ist ein Loop. Das heißt, wir multiplizieren es, den Wert, den wir da haben, immer wieder mit 2 275i. Don't bite off more than you can chew. Und in Zeile 11 dieses GIF-Up, damit muss man ein Intercal-Programm benden. Tja. Das Programm, was ihr jetzt gesehen habt, war geschrieben in C-Intercal. Das wurde 1990 released von Eric Raymond. Den kennt ihr vielleicht als Auto von Fetchmail oder als Maintainer des Jagon-Files. Der hat sich dem mal angenommen. Denn das ursprüngliche Intercal war ein Zeichensatz entwickelt für Lochkarten. Da sehen die Operatoren ein bisschen anders aus. Das ist jetzt so der moderne Dialekt. Es gibt eine überraschend große, aktive Community um Intercal. Die Aufmedienlisten sich austauschen über die Sprache, die Programme schreiben, sich Varianten ausdenken und so. Unter anderem hat Donald Knuth mal ein Bug-Report geschrieben in 2010. Das war so singemäß, dass er da in der Standard-Label wieder einen Bug gefunden hat. Und der wurde dann gefixt. Knuth ist ein ordentlicher Mensch. Genau. Und Google hat einen Style-Guide rausgebracht. Kein Witz. Hier ist ein Ausschnitt daraus. Da geht es darum, wie man am besten Zeiteln umbricht. Diese einfachen Anführungszeichen habe ich jetzt nicht erklärt, weil wir die nicht brauchten, aber die lösen diese fehlende Operatorenreinfolge auf. Wenn man was in Anführungszeichen fasst, kann man das mal berechnet. Und da werdet ihr natürlich auch einsehen, dass es nicht so sinnvoll ist, eine Zeile mit einer öffnenden Klammer anzufangen, sondern stattdessen lieber mit einem Scoogie-Operator. Ist leichter zu lesen. Es gibt ein paar Varianten von Intercal, z.B. Tri-Intercal, das operiert auf ternlieren Werten. Da sind die Operatoren ein bisschen anders definiert, dass sie halt nicht auf Bits, sondern auf Trits operieren. Das klingt lustig. Threaded Intercal kann mit mehreren Kampfforms umgehen, die sich auf die gleiche Zeile beziehen. Wenn man diese Zeile erreicht, dann spawnt man ein Thread für jedes Kampfform und man geht in beide in den Threads. Genau. Und Backtracking Intercal hat noch das Maybe-Label. Das ist tatsächlich einigermaßen sinnvoll. Das schreibt man vor Zeilen und wenn man das erreicht, dann kann man später zu dem zurückkehren. Wenn man feststellt, was man bei Algorithmus gemacht hat, war eine schlechte Idee. Damit wird es leichter Backtracking Algorithmus zu implementieren. Ja. So viel zu Intercal. Die nächste Sprache heißt Bifunch. Bifunch wurde 1993 entwickelt von Chris Pressing. Und seine Motivation war, dass die Sprache für Phasen sein soll. Da kann ich euch beruhigen, für Menschen finde ich das eigentlich mit die angenehmste Sprache, die ich euch zeigen werde. Die Besonderheit der Sprache ist, dass es sich um eine 2-dimensionale Sprache handelt. Es gibt keinen linearen Programmfluss, sondern er geht so auch hoch und runter. Ich werde euch ein Beispiel zeigen gleich. Der Name der Sprache ist offenbar eine vertippte Version von Before, den er in einem ERC Chat gemacht hat. Sonst ist da nichts hinterher. Genau. Hier ist das erste Beispiel. Bifunch funktioniert so, dass der Programmcode selbst als Playground benutzt wird. Und es gibt auch eine lese Schreibkopf, der fängt immer ganz oben links an und bewegt sich standardmäßig nach rechts, wenn man ihn nicht umlenkt. Das heißt, was hier passiert ist, es startet da, dann wandert es auf das Zeichen, dann wird es nach unten gelenkt. Dann geht es wieder nach oben. Das heißt, hier haben wir eine Entloschleife. Hier ist ein bisschen größeres Beispiel. Das startet wieder hier. Es geht erst nach unten und dann nach rechts. Der Fragezeichenoperator geht dann in eine zufällige Richtung. Und wenn sich das hier nach links oder rechts bewegt, dann passiert nichts, weil wir gleich wieder zum Fragezeichen zurückkommen. Aber wenn wir nach oben oder unten gehen, zum Beispiel nach unten, dann sind wir auf der 1. Dann wird die Fragezeichen auf einen internen Stick geschmissen. Wenn nichts anderes angegeben ist, dann geht der Programm weiter in die Richtung, in die wir gerade unterwegs waren. Das geht dann hier weiter nach rechts, dann nach oben und nach links und kommen wir zu dem Punkt. Das gibt die Zahl, die wir gerade oben auf dem Stick haben, aus. Dann gehen wir weiter und dann wieder beim Fragezeichen. Das heißt, das gibt uns zufällige Binärstricken dieses Programm. Hier ist noch eins, was nicht diese Zweidimensionität benutzt, wo man sieht, wie man in Wifanen schrechnen kann. Das schmeißt nacheinander drei Sechsen auf den Stick einzunehmen. Das Mal nimmt dann die beiden oberen Elemente, multipliziert die und schmeißt das Ergebnis wieder auf den Stick obendrauf. Das Plus addiert das dann zu der dritten Sechse, die wir noch haben. Dann geben wir das aus. Fühlt sich so ähnlich an. Es ist auch so eine Postfix-Notation, die man dazu rechnet, zum Rechnen benutzt. Wenn du so willst. Punkt gibt es aus. Add beendet das Programm. Das ist dann halt die Ausgabe in dem Fall. Hier ist noch ein umfangreicheres Beispiel. Das ist eine Rott13-Implementierung. Was auf die Buchdaben des LVBs, also alle Buchdaben 13 Dritte im LVB weiter schiebt. Wie funktioniert das? Wir fangen wieder hier an. Die Tilde hat ich fast gesagt. Die Tilde liest vom Benutzer einen Aske-Zeichen ein. Dann schreibt dessen Wert in den Stick rein. Doppelpunkt verdoppelt das. Dann die Anführungszeichen machen den String-Mode an. Im String-Mode werden Zeichen, die man erreicht, nicht als Befehle, sondern tatsächlich, da werden die Aske-Zeichen der Werte auf den Stick geschrieben. Das ist ein Back-Tick und wenn man ein weiteres Anführungszeichen erreicht, dann geht der String-Mode wieder aus. Das heißt ab jetzt haben die Zeichen wieder ihre eigentliche Bedeutung. Hier kommt ein weiterer Back-Tick. Als Befehl macht der Folgendes, der guckt sich die beiden oberen Stick-Elemente an und vergleicht die. Und wenn das obere Stick-Element kleiner ist, dann erzeugt es an der Stelle 1. Ausrufezeichen invertiert das. Jetzt gehen wir nach unten nach links. Das ist auch ein Test. Der guckt sich den Wert oben auf den Stick an und wenn wir da eine 0 haben, dann geht es nach rechts, ansonsten nach links. Das heißt in diesem Fall werden wir jetzt nach rechts abbiegen. Was hat diese obere Zeile gemacht? Die hat geguckt, ob das Zeichen, das wir als Eingabe reingetan haben, ob das mindestens ein kleines A ist. In dem Fall geben wir es nach rechts. In allen anderen Fällen werden wir nach links abbiegen. Dann machen wir hier weiter. Die Zeile, die es kommt, macht wieder so was Ähnliches. Die guckt, ob es höchstens ein kleines Z ist. Schmeist da irgendwie diesen ausgewährte Z auf den Stick, vergleicht das hier wieder. Diesmal ohne invertieren, weil wir gucken wollen, ob wir drunter sind. In dem Fall haben wir jetzt auch eine 0, weil wir unter dem kleinen Z sind mit unserem Haar und biegen nach rechts ab. Diese dritte Zeile guckt jetzt, ob wir in der vorderen oder der hinteren Hälfte in dem Fall sind in der vorderen Hälfte, dann kriegen wir am Schluss eine 0. Gut, gehen wir runter und nach links und jetzt kommt an der Stelle der senkrechte Strich, der ist auch wieder ein Test, ob wir eine 0 oder eine nicht 0 haben und bei einer 0 würde es jetzt nach unten gehen. Da addieren wir eine 9, eine 4 und dann haben wir Brot 13 auf unser kleines Haar gemacht. Dann gehen wir weiter in die Richtung, auf der linken Seite gehen nach oben und das kommt mal aus. Das Programm ist so gebaut, dass es für Nicht-Buchstaben-Zeichen einfach nichts macht. Da werden wir von den Unterstrichen abbiegen in Delay ohne Berechnung auszuführen. Dann geben wir das Original-Zeichen wieder aus. Was bei Großbuchstaben passiert ist, dass wir beim ersten Test, wenn wir gucken, ob wir unter einem kleinen A sind, das ist dann dort gegeben. Dann könnte es noch eine Großbuchstabe sein. Dann landet man bei diesem V, was jetzt gerade rechts vorm Head ist und dann kommen wir in die untere Sektion. Da gucken wir dann, ob es mindestens ein großes A ist und höchstens ein Z, und dann wieder in welcher Hälfte es ist und dann gehen wir wieder in die Mitte. Das ist dann das Ergebnis des ganzen Programms. Bifansch Um Bifansch hat sich relativ früh entwickelt die Bifansch-Mailiness, weil das irgendwie viele Leute cool fanden. Die ist insofern vom Bedeutung als das zentrale Organ der esoterischen Programmiensprachen Community wurde. Nämlich die Esoteric Topics Mailing List. Das heißt, da haben sich viele Leute eingefunden, die später esoterische Programmiensprachen entwickelt haben. Auch da gibt es viele aktivmente Interpreter und Compilers, z.B. Bifansch. Das ist ein Just-in-Time-Compiler dafür. Der guckt sich die Wege durch das Programm an, die statisch sind und sich nicht verändern können und kompiliert die schon mal vor. Bifansch hat Befehle, die tatsächlich auch den Programmcode verändern, indem sie da was rein- und rausschreiben irgendwie. Und wenn sich da was ändert an einem Fahrt, dann wird halt dieser Teil null-compiled. Genau. Dadurch ist Bifansch da sich eine sehr schnelle, erlaubt dann eine sehr schnelle Ausführung befinden. Genau. Jemand hat ein ERC-Klein geschrieben mit 10.000 Zeichen. Der ist superhübsch strukturiert. Das sind so einzelne Abschnitte. Hier so ist ein Stück, das irgendwas macht, auch mit Kommentar. Also kann man auch so Text reinschreiben, wenn man da nicht zufällig drin landet, macht das ja nichts. Und ja, empfehle ich das mal rauszusuchen. Varianten gibt es ein paar. Also Preci hat nicht nur Bifansch entwickelt, sondern auch Unifansch. Was halt eine eindimensionale Variante ist, ist ein bisschen langweilig. Und Trifansch ist dreidimensional. Das sind Zeichen, die die Ebene wechseln im Programm. Variant ist eine Variante, die ist irgendwie als Kooperation entstanden auf dieser Mailing-Liste. Da haben sie überlegt, wir hätten gerne weniger Instruktionen. Zum Beispiel nur eine einzige. Da sind sie dann am Schluss drauf gelandet. Also alle nicht rights-based Zeichen machen das gleiche. Und das funktioniert so, dass man mit beliebigen Zeichen abbieten können, in verschiedenen Winkeln. Und der Winkel bestimmt dann, was an der Stelle passiert. Ja. Perth ist so eine Mischung aus Bifansch und Wainfuck. Also der Sosco selbst ist eindimensional wie bei Wainfuck und bestimmt was passiert. Und das Playfield ist seidimensional und da kann man Sachen reinschreiben und Dinge rumgruppieren. Genau. Ja. Das war Bifansch. Malbok wurde 98 entwickelt von Ben Olmstedt. Der sich so die Sprachen, die wir bisher gesehen haben, angehuckt hat, zum Beispiel Wainfuck und Intercal und so. Und das fand er alles viel zu leicht zu verstehen und zu einfach. Und der wollte mal eine Sprache machen, die wirklich schwer zu verstehen und hart zu benutzen ist. Das ist ihm so gut gelungen, dass es tatsächlich von 98 an, also von der Veröffentlichung der Schwache ist zum Beispiel. Das zeig ich euch gleich. Ja. Der Name kommt von Malebolge. Das ist in Dante's Inferno der Achtekreis der Hölle. Wo Menschen gefoltert werden. Das ist vielleicht ganz passend. Gut. Malbok funktioniert so. Das ist im Grunde eine einfache virtuelle Maschine, was da drin steckt. Mit einer CPU, mit drei Registern. A, C und D irgendwie. Und dann gibt es drei Hochzehn Speicherzellen, die jeweils zehn Tritz enthalten wieder. So was ist drei. Ja, das klingt praktisch. Und was Malbok da macht, ist den Programmcode in diese Speicherzellen reinladen und vorne anfangen. Die Register werden irgendwie auf 0 gesetzt. C ist der Code-Pointer. Der bestimmt dann, welche Instruktion es jetzt ausgeführt wird. Und dann startet es halt vorne. Und was dann für jede Instruktion passiert ist, man zieht davon erstmal 33 ab und dann wird C dazu. Ein Modulo mit 94. Ihr lacht schon. Als nächstes wird eine Substitutionsverschlüsselung darauf angewendet. Das ist eine relativ einfache. Das ist einfach ein langer String mit Askezeichen durcheinander gewürfelt, wo dann der aktuelle Wert als Index fürgenommen wird. Das stoppt einfach die Zeichen durch. Genau. Und wenn wir dann irgendwie eins dieser acht Zeichen haben, wird das ausgeführt. J und I erhöhen verschiedene Register. Mal ist so eine Rotation im Akkumulator. P ist die Crazy-Operation. Das ist so ähnlich wie XOR, aber halt für tertziere Werte. Und ja, die restlichen sind für eine und Ausgabe und um das Programm anzuhalten. Und ich glaube, O macht einfach nichts. Ja, wenn man irgendwie was anderes hat, stürzt das Programm ab. Ja. Wenn man es ausgeführt hat, zieht man nochmal 33 ab, wendet eine andere Substitutionsverschlüsselung an und schreibt das dann wieder in die Speicherzelle, wo es vorher war. Also man verändert das Programm während man das ausführt. Genau. Und dann inkriminiert man C und D. D ist so, kann man als Data-Pointer benutzen, das ist natürlich höchst praktisch, dass D dann auch erhöht wird, vielleicht für einen, so als Service. Okay. Bei dieser Sprache ist es so, dass ich euch das Beispiel nicht erklären kann, das ist Hello World. Das ist tatsächlich das original erste Programm, was nach diesen zwei Jahren mal entwickelt wurde. Und da hat sich jemand hingesetzt und per Good Force einfach das gesucht. Also tatsächlich relativ viele kluge Optimierung reingemacht, irgendwie, dass er guckt, wenn er zum Beispiel schon mal ein großes Haar hat oder so was, dass er sich das merkt irgendwie. Und er schreibt dann so irgendwie, nach ein paar Stunden hatte er dann das. Die Ausgabe ist Hello World oder so ein kleinen Buchstaben, weil er da einfach aus Optimierungsgründen nicht das unterschieden hat, aber immerhin. Ja. Großartig war es. 2005 hat dann Louis Scheffer eine Cryptoanalyse gemacht und dabei festgestellt, dass diese beiden Substitutionsverschlüsselung so Loops beinhalten, weil irgendwie 0,3 Zeichen immer wieder herumgetauscht werden. Um relativ leicht funktionierende Mailbox-Programme zu entwickeln. Dann hat er dann ein Paper darüber geschrieben und dann irgendwie darin machte der Vorschläge, wie man die Sprache wieder reparieren könnte und noch schwerer machen, irgendwie. Er schlägt zum Beispiel auch vor, den Quasi-Operator weniger nützlich zu machen. Ja. Und in der U.S. Mechanischen Fantasy Relementary in einer Folge kommt ein Mailbox-Programm vor. Das ist irgendwie der Schlüssel, also das Programm, was ein irgendwie in eine Bank reinhäckt. Allerdings ist das nur ein anderes Hello-World-Programm von der Wikipedia mit ein paar Tipp-Feldern drin. Ja. Mailbox. Gut. Die fünfte Sprache ist Shakespeare. Shakespeare wurde entwickelt von diesen beiden Schweden und die haben das tatsächlich als Hausaufgabe gekriegt in ihrer Sittaxanalyse Veranstaltung irgendwie mal so ein Freestyle-Programm, die Sprache zu entwickeln. Und da haben Sie sich überlegt, wir machen mal eine Sprache, die ein ganz festes Thema hat. In dem Fall lesen sich die Programme mit der sich so wie Theaterstücke von Shakespeare. Sie schreiben dazu, es kombiniert die Exklusivität von Basic mit der Bündnisaufwandlichkeit von Assemblacourt. Aber dafür sieht es hübsch aus. Es geht los. Es ist der Titel bis zum ersten Punkt. Es hat keinerlei Bedeutung. Es ist einfach nur so, als Flavortext wird im Grunde ignoriert. Die nächsten drei Zeilen definieren dann die Variablen. Die heißen hier Giulietromio, Mercutio. Das ist einfach eine feste Liste von Shakespeare Charakteren, die man damit nutzen kann. Die sind standardmäßig haben, die sind standardmäßig den Wert null und sind nicht auf der Bühne. Und die sind in Akte und Szenen. Akt 1, Szene 1. Giuliet beleidigt alle. Giuliet und Mercutio kommen auf die Bühne. Und jetzt unterhalten die sich und dabei weisen sie einander Werte zu. Also Mercutio sagt jetzt Hugh Charming Angel zu Giuliet. Und was das bedeutet ist, Angel ist ein positives Nomen. Wir kommen mal grundsätzlich der Wert 1. Und jedes Charming wird das dann verdoppeln. Alle Adjektive, die man davor hängt, werden das verdoppeln. So dass wir hier dann Charming Angel ist, der Wert 2, den wessen wir als Giuliet zu. Und das überschreibt er dann aber gleich, indem er sagt, you are as beautiful as a flower. Und das funktioniert so, you are as, glaube ich, as und dann kommt wieder ein Wert. Also flower ist einfach wieder ein positives Nomen, und das klingt somit like what a dirty pig. Pig ist eine Minus 1 und das wird jetzt 5 mal mal 2 genommen. Dadurch kriegt man diese Minus 32. Dann sagt sie noch you are as small as the difference between nothing and thyself. Das ist jetzt eine Rechnung. Im Grunde Mercutio gleich 0 Minus Mercutio. So dass es dann ins Positive geflippt wird. Gut, Mercutio verlässt die Bühne, Romeo kommt. Giuliet sagt you devil Minus 1 you are nothing 0 Romeo sagt open your heart das führt dazu, dass Giuliet ihren Wert als Zahl ausgibt. Und dann sagt er remember me das tut, also jeder Charakter hat einen eingebauten Stack zusätzlich. Das pusht dann seinen eigenen Stack auf Giuliet drauf. Gut, Giuliet verlässt die Bühne. Szene 2 Mercutio Jetzt unterhalten sich die beiden. Romeo fragt jetzt Mercutio are you better than me? Das ist ein Test. Da guckt er jetzt, ob Mercutio einen höheren Wert hat als er selbst. In diesem Fall ist das, dass er sich so. If not, let us proceed to scene 4. Das greift jetzt allerdings nicht, weil Mercutio ist ja größer. Speak your mind. Führt, gibt den Wert von Mercutio als Aske zeichnen aus, ist ein Space. Gut. Mercutio, you are as miserable as the sum of the self and the stone wall. Das ist Romeo, gleich Romeo plus 1. Stone wall ist ein zusammenhängendes Nomen, das ist ein positives. Remember yourself. Das tut Romeo's eigenen Wert auf sein Stack. Mercutio verlässt die Bühne. Szene 3 Giuliet du are me. Das weist Romeo ihren eigenen Wert zu. In dem Fall sind die beide gleich. Deshalb passiert nichts. Da habe ich gar nicht gesagt, oben steht das. Das berechnet die Feminati-Reihe. Das fängt mit 2, 1 an. Romeo sagt, we call our eternal love. We call. Führt dazu, dass Giuliet ihren Stack-Wert nimmt und wieder sich selbst zuweist. You are as happy as the sum of the self and me. Das addiert den vorigen Wert, der den Null war auf Romeo's Wert, was die 1 ist. Deshalb passiert es die 1. Open your heart. Gibt das wieder aus. Remember me. Tut dann wieder seinen Wert auf Giuliet's Stack. Giuliet sagt, we call that you all must die. Das ist wieder dieses Recall. Das nimmt den Stack-Wert und weist das Romeo zu. Exit Giuliet. Romeo sagt, we must return to scene 2. Das ist jetzt der Loop zurück auf Szene 2. Also kurz zur Bedeutung der Charaktere. Mercutio hat nur eine Funktion. Er ist ein Space. Nein, er hat tatsächlich 2. Er ist ein Space und er bestimmt die Anzahl der Feminati-Zahlen, die wir uns ausgeben werden. Dadurch, dass Romeo der Counter ist. Romeo wird immer um 1 erhöht. Mit dem you are as happy as the sum of the self and the stonewall. Dann gibt es ja vorne diesen Test. Der guckt, ob Romeo größer ist als Mercutio und das ist der Job. Das ist die Jobbefunktion von Mercutio. Giuliet merkt sich die beiden Fibonacci-Zahlen. Eigentlich erwert das der größere und auf ihrem Stack ist der davor. Diese Berechnung in der Szene weiß halt, dass sie sich addieren. Genau. Gut, geht zurück zu Szene 2. Dann wird das geloopt. Die ganzen Durchläufe habe ich jetzt mal übersprungen. Und Romeo ist jetzt tatsächlich beim Wert 32 angekommen, wurde oft genug erhöht. Und wenn er dann fragt, are you better than me, dann ist das natürlich nicht der Fall. If not, let us proceed to scene 4. Und das ist jetzt eine Szene, die hat tatsächlich eigentlich keine Wirt-Örtum mehr. Das ist nur noch so ein bisschen zum Flavor. Er sagt Mercutio, are you better than me, you bastard! Und Giuliet kommt und Romeo macht sich Hoffnung, you are as bad as Mercutio, we call my final goodbye. Ja, das ist das Programm. Eine lustige Geschichte dazu. Er erinnert euch vielleicht an DCSS. Ein Algorithmus, um DVDs zu entschlüsseln. Wo es vor vielen Jahren mal großes Drama darum gab, inwiefern das veröffentlicht werden darf und exportiert und so weiter. Und da hat sich irgendwie der Autor einer Implementierung an die beiden gewendet und vorgeschlagen, man könnte doch den Algorithmus kommentieren, denn wir ist durchs Recht auf freie Meinungsäußerung gedeckt. Ich glaube, die beiden hatten zu dem Zeit und keine Zeit dazu, deshalb ist das nie passiert. Aber es ist eine ganz charmante Idee. Ja, und es gab tatsächlich eine Shakespeare-Aufführung 2007. Ich gucke mal, wie viel Zeit wir haben. Wir haben auf jeden Fall Zeit, das abzuspielen. Das zeige ich euch mal. So sieht das aus. Was fangst du? Reflektieren? Nicht, dass ich wüsste. Also, dass es sowieso die einzige Aufführung, die ich gefunden habe und ja kannst du noch... Also, was meinst du? Wie weit kann man das bleiben? Ja. Du bist eingeladen, das auszuprobieren. Es ist, glaube ich, in vielen Aspekten tatsächlich schwer, dass in Shakespeare so zu schreiben, dass es sich kompiliert. Zum Beispiel, wenn drei Figuren gleichzeitig auf der Bühne sind. In Shakespeare kannst du wirklich nur zwei haben, die gleichzeitig da sind, damit es eindeutig ist, mit wem er sich gerade unterhält. Genau, aber ich habe eine lustige Idee. Genau. Das stimmt ja. Könnte man vielleicht die Szene wechseln, die räumliche Szene irgendwie. Ja, gut, ich sehe schon, ihr habt gute Ideen. Es gibt noch ein paar andere Sprachen, die so ein festes Thema haben, da will ich euch noch ein paar zeigen. Es gibt zum Beispiel Chefprogramme, lesen sich wie Kochrezepter. Da gibt es irgendwie verschiedene Schüsseln, in die man Sachen reintun kann. Also Schüsseln sind Sticks und die Zutaten sind dann irgendwie Zahlen und Buchdaben und so. Und dann tut man die im Schluss irgendwie in den Ofen und dann wird das ausgegeben oder so. Ganz niedlich. Man sieht sich wie Anweisungen an einen Taxifahrer, der irgendwie Leute durch man hätten fährt. Und seine Fahrgäste sind dann die Variablen und die Orte bestimmen, was mit denen passiert. Genau, Lollcode ist euch vielleicht ein Begriff. Das ist so Lollcatchsprache, I'm in your loop, cat thanks by. Und worauf ich hingewiesen wurde vor diesem Vortrag ist, es gibt etwas namens Friendship is medic plus plus. Das liest sich so wie die Briefe an oder so. Genau. Das war so der Bereich thematische Sprachen. Damit sind wir mit den 50 euch zeigen bitte auch durch, aber ich habe euch noch einige wenige mitgebracht, die es aus meiner Sicht wert sind, dass ihr euch da noch mal beschäftigt, wenn ihr das interessiert. Also Pete ist auch relativ bekannt. Pete-Programme sind Bilder, die so aussehnlich abstrakte Gemälde von Pete Mondrian an. Die Farbwechsel bestimmen dann, was passiert. Das stinkt ziemlich charmant. Das ist tatsächlich relativ schwer für Menschen nachzuvollziehen, was das ist. Was ihr abgebildet seht, ist tatsächlich ein Wain-Fuck-Interpreter. Und ich weiß nicht, es gibt Beispiele, da ist dann ein gigantischer Roter Kreis, wo der Lesekopf durchläuft, aber auch die Fläche anguckt und das brechnet dann pieh. Da steht dann noch im Kommentar, wenn man diesen Kreis größer macht, dann ist das ein Wain-Fuck-Interpreter. Ja. Ja. Also die Frage war, kann man ein beliebiges Bild nehmen und das so bearbeiten, dass man es mit Pete ausführen kann? Und auf jeden Fall. Ich glaube, Pete hat nur acht verschiedene Farben, die was tun oder die zulässig sind oder so. Da müsste man dann irgendwie drauf diskritisieren. Und die allermeisten werden dann irgendwie random im Kreis waren und irgendwie Müll ausgeben wahrscheinlich, aber ja. Assetto ist noch eine weitere 2-dimensionale Sprache. Da ist der Source-Code ein Quadrat aus Zeichen und der Programmfluss folgt dann einer Hilbert-Kurve dadurch. Das ist so eine raumfüllende Kurve, die, wenn sie größer wird, sich immer mehr verfeilte, zu sagen. Man kann dann auch Abbiegungen machen und irgendwie Abküßungen nehmen. Weitspace kennt ihr vielleicht auch. Das benutzt nur die Zeichen Swaystub und Return. Simuliert intern auch Stacks, wo es Sachen drauf schmeißt und drum rechnet und so. Genau, beliebt zum Verstecken im Quartext von Webseiten oder so zum Beispiel. Und Slashes ist eine lustige Sprache, die hat als einzige Operation String-Ersetzung. Da steht in der ersten Seite irgendwie ein String und alle anderen Zeilen sind dann die Operation. Und ist Touring komplett? Ich weiß nicht, wie es funktioniert, aber ... Ja. Genau, Velato als erstes noch. Da sind die Programme MIDI-Files. Die Tonhöhen und die Harmonien und die Längen bestimmen, was passiert. Und da ist irgendein Grund, neigen Velato-Programme dazu, wie Jazz zu klingen. Genau, für viele, viele, viele mehr guckt ihr am besten in das Unheimlich viele Isotirisch-Wachen enthält, die auch sehr gut kategorisiert. Ja, das wäre so der erste Anlaufpunkt, glaube ich, wenn ihr da was zu Graus mitmult. Genau. Damit sind wir auch durch. Ihr findet unter diesem Link die Slides und für die Referenzen. Und dann bedanke ich mich sehr für euer Interesse und eure Aufmerksamkeit. Wenn ihr noch Fragen habt, mal hier damit. Ja. Es gibt diesen Hook oder Hook. Genau. Ich weiß, es gibt noch Moo. Ist das am Ende auch? Have ich noch nie gehört? M-O-O geschrieben? M-O-O. Ich glaube tatsächlich, das ist dann die Variante, die Kühe ausblichen können. Ja, genau. Das ist dann Moo wahrscheinlich mit Ausruhrzeichen oder Wahrzeichen. Das klingt schon so, weil es könnte es gut auf Brainfuck-Zug so viel sein. Noch andere Fragen? Ja. Ich hatte im Kopf gehabt, dass es gerade noch auf Wikipedia nachgelesen, dass Pete gar nicht touring vollständig ist. Wie kann man denn darin einen Brainfuck-Interpreter schreiben? Weißt du, aus welchem Grund ist also die Frage, also genau, bei einem Mikrofon, weißt du, warum es nicht touring vollständig ist? Weil man irgendwie nicht auf den kompletten Stack zugreifen kann, weil der Stack nicht wahlfrei ist oder so. Das ist tatsächlich ziemlich wenig drüber. Bei manchen Sprachen ist das Problem, dass der Speicher limitiert ist. Zum Beispiel bei Intercal gibt es ja irgendwie diese 3 hoch 10 Speicherzellen. Das verhindert dann halt auch irgendwie, dass du wirklich explizit touring vollständig sein kannst, wenn du begrenzten Speicher hast. Aber bei Pete weiß ich es leider nicht. Warum beschäftigt man sich jetzt damit? Ich meine, dass man mal über Wikipedia gestolpert ist und das cool fand, oder hat das noch irgendein praktischen Sinn, sag ich mal? Du siehst, das macht zumindest Spaß, oder? Sich damit zu beschäftigen. Und wie gesagt, für diese beiden Schweden war es irgendwie eine Hausaufgabe und keine Ahnung, ich hatte hier noch aufgeschrieben künstlerische Ausdruckfälle mit der man sich damit beschäftigen kann. Irgendwie Herausforderungen für einen selbst. Genau. Aber natürlich fragt man sich das erstmal, wenn man in dieses Themengebiet kommt. Gut, alles klar. Ich glaube, es gibt keine weiteren Fragen. Ich bin sonst auch noch hier. Genau, gut, danke euch noch mal.