Befunge — стековый, эзотерический язык программирования. Считается двумерным, так как программа на Befunge записывается в таблицу со сшитыми краями (тор), по которой в различных направлениях перемещается интерпретатор, исполняя команды, расположенные в её ячейках.
Первая версия языка Befunge была создана Крисом Пресси в 1993. Как утверждал автор, его целью было разработать язык, максимально сложный для компиляции. Сложность обеспечивается командами p и g, модифицирующими текст программы.
Версия Befunge-93 ограничена таблицей 25X80 (стандартный размер текстового экрана) и потому не обладает тьюринговской полнотой. Befunge на бесконечной таблице полон по Тьюрингу.
Система команд Befunge
Ниже перечислены команды языка Befunge. Каждая команда кодируется одним ASCII-символом. Для стековых операций в скобках дан их эквивалент в языке Forth. Команды, берущие параметры из стека, удаляют их со стека.перемещение (9):
> Двигаться вправо
< Двигаться влево
^ Двигаться вверх
v Двигаться вниз
_ Двигаться вправо, если на вершине стека 0, иначе — влево.
| Двигаться вниз, если на вершине стека 0, иначе — вверх.
? Двигаться в случайном направлении
# Пропустить следующую ячейку ("трамплин")
@ Конец программы
манипулирование со стеком (3):
: Поместить в стек копию вершины (forth:DUP)
\ Обменять местами вершину и подвершину (forth:SWAP)
$ Удалить вершину (forth:DROP)
модификация кода программы (2):
p "PUT": со стека извлекаются координаты ячейки и ASCII-код символа, которой помещается по этим координатам
g "GET": со стека извлекаются координаты ячейки; ASCII-код символа по этим координатам помещается в стек
константы (2):
0-9 Поместить число в стек
" Начало/конец символьного режима, в котором ACSII-коды всех текущих символов программы помещаются в стек
стековые арифметические операции (5):
+ Сложение вершины и подвершины (forth:+)
- Вычитание вершины и подвершины (forth:-)
* Умножение вершины и подвершины (forth:*)
/ Целочисленное деление (forth:/)
% Остаток от деления (forth:MOD)
стековые логические операции (2):
! Отрицание: нуль на вершине заменяется на 1, ненулевое значение — на 0 (forth:0=)
` Сравнение "больше, чем": если подвершина больше вершины, в стек помещается 1, иначе 0 (forth:>)
ввод-вывод (4):
& Запросить у пользователя число и поместить его в стек
~ Запросить у пользователя символ и поместить в стек его ASCII-код
. Распечатать вершину стека как целое число (forth:.)
, Распечатать символ, соответствующий ASCII-коду на вершине стека (forth:EMIT)
Примеры программ
Программа, печатающая «Hello World!»
> v
@,,,,,,,,,,,,"Hello World!"<
Генератор случайных чисел
vv < <
2
^ v<
v1 ?>5^
v v
v9