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