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-+:|
, @
>^