Befunge ist eine esoterische, zweidimensionale und stackbasierte Programmiersprache, die Chris Pressey 1993 für den Amiga entwickelte. Das erklärte Ziel war, eine Sprache zu schaffen, die sich möglichst schwer kompilieren lässt: Der Quellcode ist kein linearer Text, sondern ein Raster, in dem sich der Befehlszeiger in alle vier Himmelsrichtungen bewegt.

Das 2D-Modell

Ein Befunge-Programm liegt auf einem Spielplan (Playfield) aus ASCII-Zeichen — bei Befunge-93 standardmäßig 80×25 Zellen. Ein Instruction Pointer (IP) startet oben links und wandert je nach Richtungsbefehlen durch das Raster; am Rand wickelt er bei Befunge-98 toroidal um (unten geht es oben weiter).

Die wichtigsten Befehle

0-9   Zahl auf den Stack legen
+ - * / %   Arithmetik auf den Stack
!   logisches NICHT, `  Vergleich (größer)
> < ^ v   Richtung des IP ändern
?   zufällige Richtung
_ |   waagerechte / senkrechte Bedingung
"   String-Modus (Zeichen bis zum nächsten ")
:    obersten Stack-Wert duplizieren / tauschen
$   obersten Wert verwerfen
.   Zahl ausgeben, ,  Zeichen ausgeben
&   Zahl einlesen, ~  Zeichen einlesen
p   Zeichen ins Playfield schreiben (put)
g   Zeichen aus dem Playfield lesen (get)
#   Trampolin: nächste Zelle überspringen
@   Programm beenden

Mit p und g kann ein Programm seinen eigenen Quellcode verändern — Befunge ist damit selbstmodifizierend, was Compiler vor echte Probleme stellt.

Beispiel: Hello World

"!dlroW olleH">:#,_@

Der String-Modus legt „!dlroW olleH" rückwärts auf den Stack; die Schleife :#,_ gibt Zeichen aus, bis der Stack leer ist, dann beendet @ das Programm.

Versionen und Verwandtschaft

  • Befunge-93: 80×25-Grid, nicht ganz Turing-vollständig (endlicher Speicher).
  • Funge-98: toroidales Grid, Fingerprint-Erweiterungen und dynamische Playfield-Größe — damit Turing-vollständig.
  • Der „Funge"-Zweig umfasst weitere 2D-Sprachen wie Unefunge (eindimensional) und Trefunge (dreidimensional).
  • Gemeinsam mit Brainfuck-Befehle und Whitespace-Befehle ist Befunge einer der Klassiker unter den Esolangs — alle drei gelten als Turing-Tarpits mit absichtlich widerspenstigem Quellcode.

Wer die Muster verstehen will, findet die Grundlagen der Datenhaltung in den Python-Befehle und der Stack-Logik in den PostScript-Befehle.