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