Користувач:Sophia Shuvar/Befunge

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
Befunge
ПарадигмаStack-based, 2-dimensional, Self-modifying
Дата появи1993
РозробникChris Pressey
Вебсайтcatseye.tc/article/Languages.md#befunge-93

Befunge є стекова езотерична мова програмування . Вона відрізняється від звичайних мов тим, що програми розташовані на двовимірній сітці. Рахується двовимірною, так як програма на Befunge записується в таблицю з сшитими краями, по якій в різних напрямках переміщується інтерпретатор, виконуючи команди, розміщені в її клітинках.

Історія

[ред. | ред. код]

Мова була створена Крісом Пресі [1] у 1993 році для «Аміги» як спроба розробити мову, яку важко скомпілювати. Зауважте, що команда p дозволяє самостійно змінювати код . Проте згодом було написано ряд компіляторів . Також існує низка розширень до оригінальної специфікації "Befunge-93", особливо Funge-98, яка розширює концепцію до довільної кількості вимірів і може бути багатопоточною, з декількома вказівниками інструкцій, що працюють одночасно на одному просторі. Розширення та варіанти Befunge називаються Fungeoids або просто Funges .

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

Компіляція

[ред. | ред. код]

Як зазначалося, основною причиною створення Befunge було бажання створити мову, яку складно компілювати. Це було зроблено за допомогою впровадження мінливого коду, (інструкція 'p' може записувати нові вказівки на поле) та багатовимірного поля (одна і та ж інструкція може виконуватися в чотирьох різних напрямках).

Тим не менше ці перешкоди були певною мірою подолані, через компілятори Befunge написані за допомогою відповідних методик.

Компілятор bef2c, що входить до стандартного дистрибутива Befunge-93, використовує потоковий код. Кожна інструкція компілюється в фрагмент коду С, а управління протікає через фрагменти так само, як це робиться в інтерпретаторі Befunge. Це не надає цьому інтерпретатору значної переваги. Зауважте, що компілятор bef2c є невірним, оскільки він не обробляє ані 'p', ані рядкового режиму, але зробити це не було б неможливо (хоча мова С може просто не буті підходящою для цього).

Іншим прикладом може бути компілятор Betty. Цей компілятор розглядає всі можливі прямі вказівки як підпрограму, і якщо інструкція 'p' змінює цю підпрограму, ця підпрограма перекомпілюється. Це цікавий варіант JIT-компіляції, який більше того призводить до набагато більшої переваги над перекладачем, оскільки багато вказівок можна виконувати в готовому коді, не втручаючись при цьому у рішення щодо реєстру напрямків.

Зразок коду 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" - другим, "l" - третім тощо. Для друку символів програма стартує цикл, який спочатку дублює верхнє значення на стеку (тому тепер стек виглядатиме як " \ n ! Dlrow, olleHH"). Тоді операція "_" видасть дубльоване значення і піде праворуч, якщо це нуль, у противному випидку - ліворуч. (Це передбачає сумісний інтерпретатор, який "повертає" 0 при появі порожнього стеку. ) Коли значення рухається ліворуч, верхнє значення виводиться як символ ASCII . Потім він дублює наступний символ і циклічно повертається до тесту "_", продовжуючи друкувати решту стеку, поки він непорожній, і тому наступне значення, що з'явилося, дорівнює 0, після чого "@" закінчує програму.

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

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

[ред. | ред. код]
0-9 Розміщення даного числа в стек
+ Додавання
- Віднімання
* Множення
/ Цілочисельне ділення
% Остача від ділення
! Логічне НЕ: Якщо значення на вершині стеку дорівнює нулю, то воно заміняєтьсяна 1; в іншому випадку на нуль.
` Більше, ніж: порівняння a і b, в стек поміщається 1, якщо b > a, інакше нуль.
> Зсув праворуч
< Зсув ліворуч
^ Рух вгору
v Рух вниз
? Рух у випадковому напрямку
_ Рухатись праворуч, якщо значення = 0, інакше ліворуч
| Рухатись вниз, якщо значення = 0, інакше вгору
" Режим запуску рядка: поміщає в стек значення ASCII кожного символу до наступного "
: Поміщає в стек дублікат вершини
\ Змінює два значення на вершині стека
$ Вивід вершини стеку та видалення її
. Вивід вершини стеку у вигляді цілого числа, а потім пробіл
, Вивід символа, що відповідає ASCII-коду на верхівці стеку
# Пропуск наступної клітинки
p "PUT": зі стеку витягуються координати x, y та ASCII-код символа, з цими координатимию
g "GET": зі стеку витягуються координати x та y. У стек поміщається ASCII-код символа з цими координатами.
& Розміщення у стеку числа заданого коритстувачем
~ Розміщення у стеку числа заданого коритстувачемстувачем у вигляді у ASCII коду
@ Кінець програми
(пробіл) Нічого не робить

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

Дивитися також

[ред. | ред. код]

Список літератури

[ред. | ред. код]
  1. Ais523 (18 грудня 2008). Chris Pressey. Esolang. Процитовано 23 січня 2014.
  2. Oerjan (18 січня 2014). Talk:Befunge. Esolang. Процитовано 23 січня 2014.

Посилання

[ред. | ред. код]

[[Категорія:Езотеричні мови програмування]] [[Категорія:Мови програмування]]