Befunge - Befunge

Befunge
РазработчикКрис Пресси
Впервые появился1993 (1993)
Интернет сайткошачий глаз.tc/узел/ Befunge-93.html
Под влиянием
Четвертый, ЛОЖНЫЙ

Befunge это на основе стека, отражающий, эзотерический язык программирования. Он отличается от обычных языков тем, что программы расположены на двумерной сетке. Инструкции «стрелка» направляют поток управления влево, вправо, вверх или вниз, а циклы создаются путем отправки потока управления в цикле. Это было описано как "нечто среднее между Четвертый и Лемминги ".[1]

Достойный компаньон ИНТЕРКАЛ; семейство компьютерных языков, которое избегает банальных ограничений линейного потока управления и включает счетчики программ, летающие по множеству измерений с экзотическими топологиями.

История

Изначально язык был создан Крис Пресси[3] в 1993 году для Amiga, как попытка разработать язык, который будет настолько сложен для компиляции, насколько это возможно. Обратите внимание, что п команда позволяет самомодифицирующийся код. Тем не менее, ряд компиляторы были впоследствии написаны. Также существует ряд расширений к исходной спецификации «Befunge-93», в первую очередь Funge-98, который расширяет концепцию до произвольного числа измерений и может быть многопоточным, при этом несколько указателей команд работают одновременно в одном и том же пространстве. Befunge-расширения и варианты называются Fungeoids или просто Грибы.

Спецификация Befunge-93 ограничивает каждую допустимую программу сеткой из 80 инструкций по горизонтали и 25 инструкций по вертикали. Выполнение программы, превышающее эти пределы "оборачивается" в соответствующую точку на другой стороне сетки; программа Befunge таким образом топологически эквивалентно тор. Поскольку программа Befunge-93 может иметь только один стек и ее массив хранения ограничен, язык Befunge-93 не является Полный по Тьюрингу (однако было показано, что Befunge-93 является полным по Тьюрингу с неограниченным размером слова в стеке).[4] Более поздняя спецификация Funge-98 предусматривает Полнота по Тьюрингу сняв ограничения по размеру программы; вместо того, чтобы ограничиваться фиксированным пределом, движение указателя инструкций Funge-98 следует модели, получившей название «Lahey-space» в честь ее создателя, Криса Лэхи. В этой модели сетка ведет себя как тор конечного размера по отношению к обертыванию, при этом позволяя неограниченно расширяться.

Компиляция

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

Тем не менее, эти препятствия до некоторой степени были преодолены, и компиляторы Befunge были написаны с использованием соответствующих технологий.

Компилятор bef2c, входящий в стандартный дистрибутив Befunge-93, использует многопоточный код: каждая инструкция компилируется в фрагмент кода C, и управление передается через фрагменты так же, как в интерпретаторе Befunge (то есть, условно на значении некоторого регистра «направления»). Это не дает существенного преимущества перед хорошим переводчиком. Обратите внимание, что компилятор bef2c неверен, поскольку он не обрабатывает ни 'p', ни строковый режим, но сделать это не невозможно (хотя язык C может не подходить для этого).

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

Пример кода Befunge-93

Техника использования стрелок для изменения потока управления демонстрируется в программе генератора случайных чисел ниже. Указатель инструкции Befunge начинается в верхнем левом углу и перемещается вправо, если его не перенаправить. Следуя стрелкам вокруг, ? инструкции отправляют указатель инструкции в произвольном кардинальном направлении, пока указатель не достигнет цифры, проталкивая ее в стек. Затем стрелки переходят к . для вывода цифры из стека и возврата указателя на первый направленный рандомизатор. Здесь нет @ чтобы завершить эту программу, чтобы она произвела бесконечный поток случайных чисел от 1 до 9.

 v >>>>> v  12345  ^?^ > ? ?^  v? v  6789  >>>> v ^    .<

Следующий код - это пример классического "Привет мир!" программа. Сначала буквы "olleH" помещаются в стек как ASCII числа. Затем они извлекаются из стека в LIFO порядок и вывод в виде текстовых символов, чтобы передать «Привет». Пробел - это символ номер 32 в ASCII, который здесь создается путем умножения 4 и 8 перед выводом в виде текста. Оставшийся код затем выводит "World!" аналогичным образом, за которым следует символ ASCII 10 (a перевод строки символ, перемещающий курсор вывода на новую строку).

>              vv  ,,,,,"Здравствуйте"<>48*,          vv,,,,,,"Мир!"<>25*,@

Следующий код - немного более сложная версия. Он добавляет символ ASCII 10 (a перевод строки символ) в стек, а затем помещает в стек "! dlrow, olleH". Очередной раз, LIFO порядок означает, что «H» теперь находится наверху стопки и будет напечатана первой, «e» - второй и так далее. Чтобы напечатать символы, программа вводит петля который сначала дублирует верхнее значение в стеке (так что теперь стек будет выглядеть как " п! dlrow, olleHH "). Затем операция" _ "вытолкнет дублированное значение и перейдет вправо, если оно равно нулю, и влево в противном случае (это предполагает совместимый интерпретатор, который" возвращает "0 при извлечении пустого стека). идет влево, он появляется и печатает верхнее значение как ASCII характер. Затем он дублирует следующий символ и возвращается к тесту «_», продолжая печатать оставшуюся часть стека, пока он не станет пустым, и поэтому следующее выталкиваемое значение будет 0, и в этой точке «@» завершит программу.

 >25*"! dlrow, olleH":v                  v:,_@                  >  ^

Список инструкций для Befunge-93

0-9Положите это число в стек
+Дополнение: Pop а и б, затем нажмите а+б
-Вычитание: Pop а и б, затем нажмите б-а
*Умножение: Поп а и б, затем нажмите а*б
/Целочисленное деление: Pop а и б, затем нажмите б/а, округлено в сторону 0.
%Модуло: поп а и б, затем нажмите оставшуюся часть целочисленного деления б/а.
!Логическое НЕ: вставьте значение. Если значение равно нулю, нажмите 1; в противном случае нажмите ноль.
`Больше, чем: Поп а и б, затем нажмите 1, если б>а, иначе ноль.
>Начни двигаться вправо
<Начать движение влево
^Начать движение вверх
vНачать движение вниз
?Начать движение в произвольном направлении света
_Добавить значение; двигаться вправо, если значение = 0, влево в противном случае
|Добавить значение; двигаться вниз, если значение = 0, иначе вверх
"Запуск строкового режима: сдвигайте значение ASCII каждого символа до следующего "
:Повторяющееся значение на вершине стека
\Поменять местами два значения поверх стека
$Вынуть значение из стека и сбросить его
.Извлечь значение и вывести как целое число, за которым следует пробел
,Всплывающее значение и вывод в виде символа ASCII
#Мост: переход к следующей ячейке
пВызов "пут" (способ сохранить значение для последующего использования). Поп у, Икс, и v, затем измените символ на (Икс,у) в программе к символу со значением ASCII v
гВызов "get" (способ получить данные из хранилища). Поп у и Икс, затем вставьте значение ASCII символа в эту позицию в программе
&Спросите у пользователя номер и нажмите его
~Спросите пользователя о символе и вставьте его значение ASCII
@Завершить программу
(Космос)Нет-op. Ничего не делает

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

Смотрите также

использованная литература

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

внешние ссылки