Jump to content

Бефунге

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

Befunge — это двумерный, основанный на стеке , рефлексивный , эзотерический язык программирования . [1] Он отличается от обычных языков тем, что программы расположены в двухмерной сетке. Инструкции «стрелки» направляют поток управления влево, вправо, вверх или вниз, а циклы создаются путем отправки потока управления в цикле. Его описывают как «помесь Форта и леммингов ». [2]

Befunge был создан Крисом Пресси в 1993 году для Amiga. Язык был спроектирован так, чтобы его было как можно сложнее компилировать, он имел самомодифицирующийся код и многомерное игровое поле. Несмотря на это, для языка написано несколько компиляторов. Первоначальная спецификация Befunge-93 ограничивала программы сеткой 80x25, и, хотя она и не была полной по Тьюрингу, последующие расширения, такие как Funge-98, расширили концепцию для достижения полноты по Тьюрингу.

Название «Befunge» возникло из-за опечатки в онлайн-обсуждении. Несмотря на то, что он был спроектирован так, чтобы его было сложно компилировать, такие компиляторы, как bef2c и Betty, сумели реализовать этот язык, используя различные методы. Программы Befunge характеризуются использованием стрелок для изменения потока управления и могут выдавать выходные данные, такие как последовательности случайных чисел или классическое «Привет, мир!» сообщения.

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

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

Этимология

[ редактировать ]

Слово Befunge произошло из -за опечатки в онлайн-дискуссии, где подразумевалось слово «до». [ нужна ссылка ]

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

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

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

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

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

[ редактировать ]

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

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

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

>                v  v    ,,,,,  "Привет"  <  >  48  *  ,            v  v  ,,,,,,  "Мир!"  <  >  25  *  ,  @ 

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

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

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

[ редактировать ]
0-9Поместите это число в стек.
+Дополнение: нажмите a и b , затем нажмите a + b.
-Вычитание: нажмите 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Вызов «put» (способ сохранить значение для последующего использования). Вставьте y , x и v , затем измените символ в ( x , y ) в программе на символ со значением ASCII v.
gВызов «get» (способ получения данных из хранилища). Вставьте y и x , затем нажмите значение ASCII символа в этой позиции в программе.
&Запросите у пользователя номер и нажмите его
~Запросите у пользователя символ и введите его значение ASCII.
@Завершить программу
(космос) Нет-оп . Ничего не делает

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

См. также

[ редактировать ]
  1. ^ «Бефунге – Эсоланг» .
  2. ^ «Часто задаваемые вопросы по Befunge, версия 4» . 04.11.1997. Архивировано из оригинала 17 апреля 2001 г. Проверено 23 января 2014 г.
  3. ^ Аис523 (18 декабря 2008 г.). «Крис Пресси» . Эсоланг . Проверено 23 января 2014 г. {{cite web}}: CS1 maint: числовые имена: список авторов ( ссылка )
  4. ^ Оэрджан (18 января 2014 г.). «Разговор: Befunge» . Эсоланг . Проверено 23 января 2014 г.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: b2adb300047204cacff039398c2657b6__1701371160
URL1:https://arc.ask3.ru/arc/aa/b2/b6/b2adb300047204cacff039398c2657b6.html
Заголовок, (Title) документа по адресу, URL1:
Befunge - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)