Эта статья поднимает множество проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалить эти сообщения-шаблоны ) ( Узнайте, как и когда удалить этот шаблон сообщения )
|
Разработчик | Крис Пресси |
---|---|
Впервые появился | 1993 г. |
Веб-сайт | catseye |
Под влиянием | |
Четвертый , ЛОЖЬ |
Befunge является двумерным стек на основе , отражающей , эзотерический язык программирования . [1] Он отличается от обычных языков тем, что программы расположены в двухмерной сетке. Инструкции «стрелки» направляют поток управления влево, вправо, вверх или вниз, а циклы создаются путем отправки потока управления в цикле. Он был описан как «помесь форта и леммингов ». [2]
Достойный товарищ ИНТЕРКАЛ ; Семейство компьютерных языков, которое избегает банальных ограничений линейного потока управления и включает счетчики программ, летающие через несколько измерений с экзотическими топологиями.
История [ править ]
Изначально язык был создан Крисом Пресси [4] в 1993 году для Amiga, как попытка разработать язык, который будет как можно сложнее компилировать. Обратите внимание, что p
команда допускает самомодифицирующийся код . Тем не менее, впоследствии был написан ряд компиляторов . Также существует ряд расширений к исходной спецификации «Befunge-93», в первую очередь Funge-98, который расширяет концепцию до произвольного числа измерений и может быть многопоточным, при этом несколько указателей команд работают одновременно в одном и том же пространстве. Расширения и варианты Befunge называются Fungeoids или просто Funges .
Спецификация Befunge-93 ограничивает каждую допустимую программу сеткой из 80 инструкций по горизонтали и 25 инструкций по вертикали. Выполнение программы, выходящее за эти пределы, «зацикливается» на соответствующую точку на другой стороне сетки; Таким образом, программа на Befunge топологически эквивалентна тору . Поскольку программа Befunge-93 может иметь только один стек и ее массив хранения ограничен, язык Befunge-93 не является полным по Тьюрингу (однако было показано, что Befunge-93 является полным по Тьюрингу с неограниченным размером слова в стеке). [5] Более поздняя спецификация Funge-98 обеспечивает полноту по Тьюрингу.сняв ограничения по размеру программы; вместо того, чтобы ограничиваться фиксированным пределом, движение указателя инструкций Funge-98 следует модели, получившей название «пространство Лахи» в честь ее создателя, Криса Лахи. В этой модели сетка ведет себя как тор конечного размера по отношению к обертыванию, но при этом позволяет неограниченно расширять себя.
Этимология [ править ]
Слово Befunge происходит от опечатки в онлайн-обсуждении, где имелось в виду слово «до».
Компиляция [ править ]
Как уже говорилось, целью разработки Befunge было создание языка, который было бы трудно компилировать. Это было предпринято с помощью реализации самомодифицирующегося кода (инструкция «p» может записывать новые инструкции в игровое поле) и многомерного игрового поля (одна и та же инструкция может выполняться в четырех разных направлениях).
Тем не менее, эти препятствия до некоторой степени были преодолены, и компиляторы Befunge были написаны с использованием соответствующих методов.
Компилятор bef2c, входящий в стандартный дистрибутив Befunge-93, использует многопоточный код : каждая инструкция компилируется в фрагмент кода C, и управление проходит через фрагменты так же, как в интерпретаторе Befunge (то есть, при условии, что значение некоторых регистр направления). Это не дает существенного преимущества перед хорошим переводчиком. Обратите внимание, что компилятор bef2c неверен, поскольку он не обрабатывает ни 'p', ни строковый режим, но сделать это не невозможно (хотя язык C может не подходить для этого).
Компилятор Бетти , например, лечит всевозможные прямые линии команд , как подпрограмма, и если инструкция изменяет «Р» , что подпрограммы, что подпрограмма компилируется. Это интересный вариант своевременной компиляции , и он дает гораздо большее преимущество перед интерпретатором, поскольку многие инструкции могут выполняться в машинном коде без принятия промежуточных решений в регистре «направления».
Пример кода Befunge-93 [ править ]
Техника использования стрелок для изменения потока управления демонстрируется в программе генератора случайных чисел ниже. Указатель инструкции Befunge начинается в верхнем левом углу и перемещается вправо, если его не перенаправить. Следуя стрелкам вокруг, ?
инструкции отправляют указатель инструкции в случайных направлениях света, пока указатель не достигнет цифры, толкая ее в стек. Затем стрелки переходят к, .
чтобы вывести цифру из стека и вернуть указатель на первый направленный рандомизатор. @
Эту программу нельзя прерывать, поэтому она производит бесконечный поток случайных чисел от 1 до 9.
v >>>>> v 12345 ^? ^ > ? ? ^ v? v 6789 >>>> v ^ . <
Следующий код - это пример классического "Hello World!" программа . Сначала буквы "olleH" помещаются в стек как числа ASCII . Затем они извлекаются из стека в порядке LIFO и выводятся как текстовые символы, чтобы передать «Hello». Пробел - это символ номер 32 в ASCII, который здесь создается путем умножения 4 и 8 перед выводом в виде текста. Оставшийся код затем выводит "World!" аналогичным образом, за которым следует символ ASCII 10 ( символ перевода строки , перемещающий курсор вывода на новую строку).
> v v ,,,,, "Hello" < > 48 * , v v ,,,,,, "World!" < > 25 * , @
Следующий код - немного более сложная версия. Он добавляет в стек символ ASCII 10 ( символ перевода строки ), а затем помещает в стек «! Dlrow, olleH». Опять же, порядок LIFO означает, что «H» теперь находится наверху стека и будет напечатан первым, «e» - вторым и так далее. Чтобы напечатать символы, программа входит в цикл, который сначала дублирует верхнее значение в стеке (так что теперь стек будет иметь вид « \ n ! Dlrow, olleHH»). Затем операция «_» вытолкнет дублированное значение и пойдет вправо, если оно равно нулю, в противном случае влево. (Предполагается, что совместимый интерпретатор "возвращает" 0 при извлечении пустого стека.) Когда он уходит влево,он выскакивает и печатает верхнее значение как ASCIIперсонаж. Затем он дублирует следующий символ и возвращается к тесту «_», продолжая распечатывать оставшуюся часть стека, пока она не станет пустой, и поэтому следующее выскакивающее значение будет 0, и в этот момент «@» завершит программу.
> 25 * "! Dlrow, olleH" : v v :, _ @ > ^
Список инструкций Befunge-93 [ править ]
0-9 | Положите это число в стек |
+ | Дополнение: Pop и б , а затем нажмите на + б |
- | Вычитание: нажмите a и b , затем нажмите b - a |
* | Умножение: выберите a и b , затем нажмите a * b |
/ | Целочисленное деление: выберите a и b , затем нажмите b / a с округлением до 0. |
% | По модулю: выберите a и b , затем нажмите остаток от целочисленного деления b / a . |
! | Логическое НЕ: введите значение. Если значение равно нулю, нажмите 1; в противном случае нажмите ноль. |
` | Больше чем: выберите a и b , затем нажмите 1, если b > a , в противном случае - ноль. |
> | Начни двигаться вправо |
< | Начать движение влево |
^ | Начать движение вверх |
v | Начать движение вниз |
? | Начать движение в произвольном направлении света |
_ | Вставить значение; двигаться вправо, если значение = 0, влево в противном случае |
| | Вставить значение; двигаться вниз, если значение = 0, в противном случае вверх |
" | Запуск строкового режима: сдвигайте значение ASCII каждого символа до следующего " |
: | Повторяющееся значение на вершине стека |
\ | Поменять местами два значения поверх стека |
$ | Извлечь значение из стека и сбросить его |
. | Извлечь значение и вывести как целое число, за которым следует пробел |
, | Всплывающее значение и вывод в виде символа ASCII |
# | Мост: переход к следующей ячейке |
p | Вызов "пут" (способ сохранить значение для последующего использования). Вытяните y , x и v , затем измените символ в ( x , y ) в программе на символ со значением ASCII v. |
g | Вызов "получить" (способ получить данные из хранилища). Вытяните y и x , затем вставьте значение ASCII символа в эту позицию в программе. |
& | Спросите у пользователя номер и нажмите его |
~ | Спросите у пользователя символ и введите его значение ASCII |
@ | Завершить программу |
(космос) | Нет-оп. Ничего не делает |
Большинство одномерных языков программирования требуют некоторого синтаксического различия между текстом комментария и исходным кодом - хотя это различие может быть столь же тривиальным, как правило Brainfuck , согласно которому любой символ, не входящий в набор, +-[]<>,.
является комментарием. Такие языки, как Lisp и Python, обрабатывают строки как комментарии в контекстах, где значения не используются. Точно так же в Befunge нет синтаксиса комментариев: чтобы встроить документацию в код, программист просто направляет поток управления вокруг области «комментариев», так что текст в этой области никогда не выполняется.
См. Также [ править ]
- Brainfuck
- Carnage Heart - игра для программирования PlayStation на похожем языке
- ИНТЕРКАЛ
- Пробел
- Мальболге
- Пит
Ссылки [ править ]
- ^ https://esolangs.org/wiki/Befunge
- ^ "Часто задаваемые вопросы о Befunge v.4" . 1997-11-04. Архивировано из оригинала на 2001-04-17 . Проверено 23 января 2014 .
- ^ Рэймонд, Эрик (2003-12-29). «Файл жаргона 4.4.7» . Архив текста файла жаргона . Архивировано из оригинала на 2016-01-05 . Проверено 16 января 2012 .
- ^ Ais523 (2008-12-18). «Крис Пресси» . Эсоланг . Проверено 23 января 2014 .
- ^ Oerjan (2014-01-18). «Разговор: Befunge» . Эсоланг . Проверено 23 января 2014 .
Внешние ссылки [ править ]
- Befunge-93 Технические характеристики
- Эталонная реализация Befunge-93
- Funge-98 Технические характеристики