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.