Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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 [ править ]

Большинство одномерных языков программирования требуют некоторого синтаксического различия между текстом комментария и исходным кодом - хотя это различие может быть столь же тривиальным, как правило Brainfuck , согласно которому любой символ, не входящий в набор, +-[]<>,.является комментарием. Такие языки, как Lisp и Python, обрабатывают строки как комментарии в контекстах, где значения не используются. Точно так же в Befunge нет синтаксиса комментариев: чтобы встроить документацию в код, программист просто направляет поток управления вокруг области «комментариев», так что текст в этой области никогда не выполняется.

См. Также [ править ]

  • Brainfuck
  • Carnage Heart - игра для программирования PlayStation на похожем языке
  • ИНТЕРКАЛ
  • Пробел
  • Мальболге
  • Пит

Ссылки [ править ]

  1. ^ https://esolangs.org/wiki/Befunge
  2. ^ "Часто задаваемые вопросы о Befunge v.4" . 1997-11-04. Архивировано из оригинала на 2001-04-17 . Проверено 23 января 2014 .
  3. ^ Рэймонд, Эрик (2003-12-29). «Файл жаргона 4.4.7» . Архив текста файла жаргона . Архивировано из оригинала на 2016-01-05 . Проверено 16 января 2012 .
  4. ^ Ais523 (2008-12-18). «Крис Пресси» . Эсоланг . Проверено 23 января 2014 .
  5. ^ Oerjan (2014-01-18). «Разговор: Befunge» . Эсоланг . Проверено 23 января 2014 .

Внешние ссылки [ править ]

  • Befunge-93 Технические характеристики
  • Эталонная реализация Befunge-93
  • Funge-98 Технические характеристики