Esoteric Programming, Teil 4

Befunge – Code in 2D

| Autor / Redakteur: Mirco Lang / Stephan Augsten

Conway's Game of Life in Befunge: Links der initiale Quelltext, rechts der Quelltext nach kurzer Laufzeit.
Conway's Game of Life in Befunge: Links der initiale Quelltext, rechts der Quelltext nach kurzer Laufzeit. (Bild: Mirco Lang)

Befunge ist eine durchaus ernstzunehmende esoterische Programmiersprache. Sie führt mit zweidimensionalem und selbstmodifizierendem Code Konzepte ein, die anderes Denken fordern, und gehört mit zu den Ursprüngen der Esolangs-Community.

Chris Pressey erfand Befunge im Jahr 1993. Da es mittlerweile allerhand Abwandlungen gibt, findet sich für das Original auch häufig die Bezeichnung Befunge-93. Zwar existiert mit INTERCAL bereits seit 1972 eine erste esoterische Programmiersprache, aber erst in den Neunzigern bildete sich dank des wachsenden Internets eine Community rund um das Thema.

Das Befunge-Projekt, geboren in der Amiga-Szene, zählt hier zu den Gründungsmitgliedern. Die anfängliche Community in Form der damals üblichen Mailing-Listen findet sich heute beispielsweise im Esolangs-Portal wieder – die erste Adresse für den thematischen Einstieg.

Pressey formulierte den Grundgedanken von Befunge in einem Interview wie folgt: „Was, wenn man BASIC hätte, aber statt Zeilennummern zu verwenden, Pfeile zu der Zeile zeichnen würde, zu der man gehen [GOTO] möchte?“ Zudem sollte Befunge Stack-basiert sein, wie es Pressey zuvor bei den Sprachen FORTH und FALSE kennengelernt hatte.

Das Ganze sollte dann in ein zweidimensionales Raster gegossen werden. Zu den konkreten Zielen gehörte auch, dass Befunge möglichst schwierig zu kompilieren sein sollte. Also gesellte sich zur Zweidimensionalität auch noch selbstmodifizierender Code. Und genau diese beiden Konzepte sind wirklich faszinierend – und problemlos live auf dem Desktop erlebbar!

Das Sprachkonzept

Zunächst das weitgehend Normale: Befunge beherrscht 27 Instruktionen, die meisten drehen sich darum, Werte auf dem einzigen Stack abzulegen, abzuholen und zu verrechnen bzw. im Stack zu navigieren. Zudem gibt es auch ein logisches „NICHT“, Schleifen und Nutzereingaben. Wie kaum anders zu erwarten, sind all diese Instruktionen über Sonderzeichen gelöst. Somit besteht Befunge-Quelltext ausschließlich aus einer Ansammlung von Kommata, Klammern, Strichen und einigen wenigen Buchstaben – lediglich Ziffern sind als solche zu erkennen.

Besonderheit Nummer 1: Der Quelltext ist auf ein Raster der Größe 80 x 25 festgelegt – Befunge-Programme sind daher grundsätzlich alle gleich groß; wobei natürlich das Verhältnis von Instruktionen zu Whitespace differiert. Dieser Quelltext wird aber nicht wie üblich zeilenweise abgegrast.

Richtungsanweisungen werden stattdessen in Form der oben erwähnten Pfeile realisiert: Per „<, >, v, ^“ springt der Parser eine Zeile nach oben oder unten oder wechselt gegebenenfalls die Richtung. Auf diese Weise kann ein und dieselbe Instruktion über vier Wege ausgeführt werden, je nachdem, ob der Zeiger eben von oben nach unten über den Befehl läuft, oder von rechts nach links und so weiter.

Besonderheit Nummer 2: Über den Befehl „p“ kann sich der Quelltext selbst modifizieren. Dazu werden die Werte a, b, c vom Stack geholt und dann wird das Zeichen an den Koordinaten a/b zum ASCII-Gegenstück von c geändert. Das klingt jetzt furchtbar abstrakt, lässt sich aber wunderbar in der Praxis demonstrieren.

Befunge ausprobieren

Vereinfachtes Schachprogamm in Befunge-93.
Vereinfachtes Schachprogamm in Befunge-93. (Bild: Mirco Lang)

YABI93, „Yet Another Befunge93 Interpreter“, ist ein Open-Source-Projekt auf Java-Basis und eignet sich perfekt, um Befunge-Code in Aktion zu demonstrieren. Zwei funktionierende Beispielprogramme finden sich auf der Wikipedia-Seite von Befunge: Ein Schachprogramm und eine Umsetzung von Conway's Game of Life.

Der Interpreter macht vor allem dank zweier Features Spaß. Zum einen gibt es eine Live-Anzeige des Stacks, wodurch sich die Entstehung von Ergebnissen wunderbar verfolgen lässt. Zum anderen lässt sich über den Animations-/Demo-Modus das Parsing visualisieren – so werden zum Beispiel Schleifen sehr deutlich. Über die 1-4-Buttons lässt sich die Geschwindigkeit im Demo-Modus bestimmen.

Leider funktionieren Programmablauf und Animation nicht zeitgleich. Dennoch lässt sich der veränderliche Teil des Codes am Game-of-Life-Beispiel (siehe Aufmacherbild) sehr gut beobachten: Klickt man nach dem Start des Programms zwischendurch auf den Animation-Button, wird der Quelltext aktualisiert.

Die Game-of-Life-Muster werden unten in der Konsole live ausgegeben – finden sich aber auch im Quelltext selbst, was aber erst sichtbar wird, wenn der Code über den Button manuell aktualisiert wird. Da ist natürlich nur eine Frage der Visualisierung.

Mini-Code-Beispiel

Um den grundsätzlichen Ablauf von Befunge-Programmen zu demonstrieren, hier ein winziges Stück Quellcode, das den Buchstaben H ausgiebt:

v >,v
9 * @
>8^

Der Code beginnt oben links mit der Anweisung, nach unten zu springen, legt die 9 auf den Stack, folgt dann dem >-Pfeil, legt die 8 auf den Stack, multipliziert 8 und 9 per *, folgt wieder dem >-Pfeil, gibt das ASCII-Äquivalent zu 72 aus, folgt dem v-Pfeil und endet schließlich mit dem Klammeraffen. Natürlich hätte man auch einfach

8 9 * , @

schreiben können – aber dann würde die wunderschöne Zweidimensionalität fehlen.

Hello-World-Programm in Befunge.
Hello-World-Programm in Befunge. (Bild: Mirco Lang)

Das vorangestellte Bild zeigt eine Schleife in Befunge. In diesem Hallo-Welt-Beispiel werden zunächst die ASCII-Zeichen „Hello World!“ umgekehrt auf dem Stack abgelegt und anschließend über die Schleife zwischen > und ^ wieder ausgegeben, bis der Stack leer ist – der Screenshot verdeutlich das Verhalten. Neu sind hier Unterstrich und Doppelpunkt: Zuerst wird der oberste Wert des Stacks per : multipliziert. Per _ wird dann geprüft, ob dieser Wert 0 ist – falls nein, geht es nach links in die Schleife, falls ja, geht es nach rechts zum Klammeraffen-Exit. Sobald der Stack also leer ist und der : somit ein „0 x 2 =0“ produziert, wird die Schleife verlassen.

Wer sich für Befunge interessiert, sollte auch einen Blick die recht ansehnliche Sammlung von Programmen werfen, die unter anderem ein minimalistisches Textadventure, Zufallsgeneratoren und diverse 99-Bottles-of-Beer-Beispiele beinhaltet. Und wen speziell zweidimensionaler Code begeistert, sollte eine Blick auf Brainfuck2D werfen.

Kommentare werden geladen....

Kommentar zu diesem Artikel

Anonym mitdiskutieren oder einloggen Anmelden

Avatar
  1. Avatar
    Avatar
    Bearbeitet von am
    Bearbeitet von am
    1. Avatar
      Avatar
      Bearbeitet von am
      Bearbeitet von am

Kommentare werden geladen....

Kommentar melden

Melden Sie diesen Kommentar, wenn dieser nicht den Richtlinien entspricht.

Kommentar Freigeben

Der untenstehende Text wird an den Kommentator gesendet, falls dieser eine Email-hinterlegt hat.

Freigabe entfernen

Der untenstehende Text wird an den Kommentator gesendet, falls dieser eine Email-hinterlegt hat.

copyright

Dieser Beitrag ist urheberrechtlich geschützt. Sie wollen ihn für Ihre Zwecke verwenden? Infos finden Sie unter www.mycontentfactory.de (ID: 44751332 / IDEs & Programmiersprachen)