Befunge — стековый эзотерический язык программирования. Считается двумерным, так как программа на Befunge записывается в таблицу со сшитыми краями (тор), по которой в различных направлениях перемещается интерпретатор, исполняя команды, расположенные в её ячейках. Название языка родилось из опечатки в слове «before».

Первая версия языка Befunge была создана Крисом Пресси в 1993 году. Как утверждал автор, его целью было разработать язык, максимально сложный для компиляции. Сложность обеспечивается командами p и g, модифицирующими текст программы.

Версия Befunge-93 ограничена таблицей 25X80 (стандартный размер текстового экрана) и потому не обладает тьюринговской полнотой. Befunge на бесконечной таблице полон по Тьюрингу.

Все одномерные языки программирования требуют некоторых синтаксических различий между комментариями и исходным кодом. В языке 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 Поместить число в стек
" Начало/конец символьного режима, в котором ASCII-коды всех текущих символов программы помещаются в стек
стековые арифметические операции (5):
+ Сложение вершины и подвершины (forth:+)
- Вычитание вершины и подвершины (forth:-)
* Умножение вершины и подвершины (forth:*)
/ Целочисленное деление (forth:/)
% Остаток от деления (forth:MOD)
стековые логические операции (2):
! Отрицание: нуль на вершине заменяется на 1, ненулевое значение — на 0 (forth:0=)
` Сравнение "больше, чем": если подвершина больше вершины, в стек помещается 1, иначе 0 (forth:>)
ввод-вывод (4):
& Запросить у пользователя число и поместить его в стек
~ Запросить у пользователя символ и поместить в стек его ASCII-код
. Распечатать вершину стека как целое число (forth:.)
, Распечатать символ, соответствующий ASCII-коду на вершине стека (forth:EMIT)

Примеры программ править

Бесконечный цикл:

>v
^< 

Программа, печатающая «Hello, World!»:

>                          v
@,,,,,,,,,,,,"Hello World!"<

Генератор случайных чисел:

 vv  <      <
     2
     ^  v<
  v1<?>3v4
     ^   ^
 >  >?>  ?>5^
     v   v
  v9<?>7v6
     v  v<
     8
  .  >  >   ^
 ^<

Вывод первых 14 (от 0 до 233) чисел Фибоначчи:

62*1+v>01p001>+v>\:02p\:02gv
     0       ^             <
     .         :p
     "         .1
        v 0," "<0
     "  >1g12-+:|
     ,          @
     >^