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

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

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

Все одномерные языки программирования требуют некоторых синтаксических различий между комментариями и исходным кодом. В языке Befunge нет особого синтаксиса для комментариев, чтобы вставить документацию в код, программист просто «обводит» управление вокруг области комментария.

Система команд Befunge Ниже перечислены команды языка Befunge. Каждая команда кодируется одним ASCII-символом. Для стековых операций в скобках дан их эквивалент в языке Forth. Команды, берущие параметры из стека, удаляют их со стека.

перемещение (9):

|width=40 align="center"| > || Двигаться вправо

|align="center"| < || Двигаться влево

|align="center"| ^ || Двигаться вверх

|align="center"| v || Двигаться вниз

|align="center"| _ || Двигаться вправо, если на вершине стека 0, иначе — влево.

|align="center"| | || Двигаться вниз, если на вершине стека 0, иначе — вверх.

|align="center"| ? || Двигаться в случайном направлении

|align="center"| # || Пропустить следующую ячейку ("трамплин")

|align="center"| @ || Конец программы

|colspan=2 | манипулирование со стеком (3): : Поместить в стек копию вершины (forth:DUP) \ Обменять местами вершину и подвершину (forth:SWAP) $ Удалить вершину (forth:DROP) модификация кода программы (2):

|align="center"| p || "PUT": со стека извлекаются координаты ячейки и ASCII-код символа, который помещается по этим координатам

|align="center"| g || "GET": со стека извлекаются координаты ячейки; ASCII-код символа по этим координатам помещается в стек

|colspan=2 | константы (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-+:| , @ >^

Категория:Эзотерические языки программирования Категория:Языки программирования по алфавиту