Язык программирования brainf ck

Национальная библиотека им. Н. Э. Баумана
Bauman National Library

Персональные инструменты

Brainfuck

Brainfuck (название примерно соответствует русскому изнасилование мозга) — один из известнейших эзотерических языков программирования, придуман Урбаном Мюллером для забавы. Язык имеет восемь команд, каждая из которых записывается одним символом.

Содержание

История

Машина, которой управляют команды Brainfuck, состоит из упорядоченного набора ячеек и указателя текущей ячейки, напоминая ленту и головку машины Тьюринга. Кроме того, подразумевается устройство общения с внешним миром (см. команды . и ,) через поток ввода и поток вывода.

Описание команд языка

Язык Brainfuck можно описать с помощью эквивалентов языка Си:

Команда BrainfuckЭквивалент на СиОписание команды
Начало программыint i = 0;
char arr[30000];
memset(arr, 0, sizeof(arr));
выделяется память под 30 000 ячеек
>i++;перейти к следующей ячейке
i—;перейти к предыдущей ячейке
+arr[i]++;увеличить значение в текущей ячейке на 1
arr[i]—;уменьшить значение в текущей ячейке на 1
.putchar(arr[i]);напечатать значение из текущей ячейки
,arr[i] = getchar();ввести извне значение и сохранить в текущей ячейке
[while(arr[i]) <если значение текущей ячейки ноль, перейти вперёд по тексту программы на ячейку, следующую за соответствующей ] (с учётом вложенности)
]>если значение текущей ячейки не нуль, перейти назад по тексту программы на символ [ (с учётом вложенности)

Несмотря на внешнюю примитивность, Brainfuck с бесконечным набором ячеек имеет тьюринговскую полноту, а, следовательно, по потенциальным возможностям не уступает языкам общего назначения.

В «классическом» Brainfuck, описанном Мюллером, размер ячейки — один байт, количество ячеек 30 000. В начальном состоянии указатель находится в крайней левой позиции, а все ячейки заполнены нулями. Увеличение/уменьшение значений ячеек происходит по модулю 256. Ввод-вывод также происходит побайтно, с учётом кодировки ASCII (то есть в результате операции ввода (,) символ 1 будет записан в текущую ячейку как число 0x31 (49), а операция вывода (.), совершённая над ячейкой, содержащей 0x41 (65), напечатает латинскую А). В других вариантах языка размер и количество ячеек может быть другим (бо́льшим). Есть версии, где значение ячеек не целочисленно (с плавающей точкой).

Пример программы

Подготовка в памяти (с ячейки 1) массива значений, близких к ASCII-кодам символов, которые необходимо вывести (70, 100, 30, 10), через повторение 10 раз приращения ячеек на 7, 10, 3 и 1, соответственно
++++++++++присваивание ячейке 0 (счетчику) значения 10
[повторять, пока значение текущей ячейки (ячейки 0) больше нуля
>+++++++приращение ячейки 1 на 7
>++++++++++приращение ячейки 2 на 10
>+++приращение ячейки 3 на 3
>+приращение ячейки 4 на 1
возврат к ячейке 0 (счетчику), и его уменьшение на 1
]вернуться к началу цикла
Получение кодов букв и их вывод
>++.Вывод «Н». Получение кода «H» (72) из 70 в ячейке 1 и вывод
>+.Вывод «e». Получение кода «e» (101) из 100 в ячейке 2 и вывод
+++++++..Вывод «ll». Получение кода «l» (108) из 101 в ячейке 2 и вывод дважды
+++.Вывод «o». Получение кода «o» (111) из 108 в ячейке 2 и вывод
>++.Вывод пробела. Получение кода пробела (32) из 30 в ячейке 3 и вывод
Вывод «W». Получение кода «W» (87) из 72 в ячейке 1 и вывод
>.Вывод «o». Код «o» (111) уже находится в ячейке 2, просто его выводим
+++.Вывод «r». Получение кода «r» (114) из 111 в ячейке 2 и вывод
——.Вывод «l». Получение кода «l» (108) из 114 в ячейке 2 и вывод
———.Вывод «d». Получение кода «d» (100) из 108 в ячейке 2 и вывод
>+.Вывод «!». Получение кода «!» (33) из 32 в ячейке 3 и вывод
>.Вывод кода перевода строки (10) из ячейки 4

В принципе, печать «Hello World!» можно реализовать проще, но программа будет в три с лишним раза больше, чем приведённый выше оптимизированный вариант:

Интерпретатор Brainfuck

Пример интерпретатора Brainfuck’а, написанный на языке C++

Программирование на языке Brainfuck

Полнота по Тьюрингу означает, что в языке могут быть реализованы привычные для других языков действия:

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

Источник

Мои маленькие реле: Тройной Brainfuck, или что такое безумие

Язык программирования brainf ck. Смотреть фото Язык программирования brainf ck. Смотреть картинку Язык программирования brainf ck. Картинка про Язык программирования brainf ck. Фото Язык программирования brainf ck
Рис.1: Релейный компьютер BrainfuckPC на фоне его автора

Продолжая славную традицию ежегодного дайджеста моих самых безумных компьютерных проектов, представляю вам третью и заключительную статью о проекте релейного компьютера BrainfuckPC.

Под катом звенящие релейные блоки, самые быстрые в мире вычисления на реле, монтаж накруткой, вакуумные индикаторы, и многое другое.

Язык программирования brainfuck

Язык программирования brainfuck — пожалуй, самый популярный в мире эзотерический язык программирования. А заодно самая настоящая Тьюринг-полная трясина. Всего лишь 8 инструкций, на которых можно написать все что угодно, но очень долго.
К примеру, у меня ушло три дня на то, чтобы написать и отладить программу деления 355/113, которая печатает в терминал 6 знаков после запятой.
Язык программирования brainf ck. Смотреть фото Язык программирования brainf ck. Смотреть картинку Язык программирования brainf ck. Картинка про Язык программирования brainf ck. Фото Язык программирования brainf ck
Рис.2: Инструкции языка brainfuck

Весь синтаксис языка строится вокруг ОЗУ на 30 тысяч ячеек памяти, с разрядностью 8 бит.

brainfuck++

Язык программирования brainf ck. Смотреть фото Язык программирования brainf ck. Смотреть картинку Язык программирования brainf ck. Картинка про Язык программирования brainf ck. Фото Язык программирования brainf ck
Рис.3: Инструкции языка brainfuck++

От теории к практике

Как результат — в ячейке RbPos окажется старое значение плюс то, что было по исходному адресу. класс Memory — контейнер с 65к целочисленных ячеек. Главное его свойство — переполнение значения указателя вернет его в начало массива. Как в моем реальном железе.

Недостаток описанной функции — потеря исходного значения — оно обнулится. Добавим еще одну переменную Rc, чтобы сохранить его:

В результате в ячейке RcPos будет лежать скопированное слагаемое. Ну, в том случае если раньше там был нуль.

Поскольку использованная мной нотация очень сильно напоминает brainfuck++ — просто перепишем нашу функцию в символах bfpp, приняв для примера RbPos за 4 и RcPos за 5:

[
>>>>
+
>>>>
+

Описав все примитивы, можно начать комбинировать их в более сложные конструкции и получать программу необходимого функционала. В итоге, можно получить программу, которая делит 355 на 113 (или любые другие числа друг на друга в пределах 16 бит)

Архитектура релейного компьютера

Центральным элементом релейного процессора является 16-разрядный полный сумматор с параллельным переносом. К нему на вход подключены два регистра. TMP — временный регистр, в который помещается старое значение, и CMD — командный регистр, в котором хранится инструкция и константа, на которую будет изменяться старое значение.

Посему я могу исполнять операции оптимизированного brainfuck++, а заодно получить полноценные условные переходы — Jump If Zero и Jump If Not Zero в любую сторону программы.

Результат операции суммирования может быть выгружен либо в один из контектных регистров — AP — с номером текущей ячейки данных, или IP — с номером текущей инструкции. Кроме того, результат может быть выгружен в текущую ячейку ОЗУ, если речь идет об инструкциях + и

Язык программирования brainf ck. Смотреть фото Язык программирования brainf ck. Смотреть картинку Язык программирования brainf ck. Картинка про Язык программирования brainf ck. Фото Язык программирования brainf ck
Рис.4: Архитектура релейного компьютера в работе. Стадия загрузки новой инструкции сменяется стадией ее исполнения.

Первым делом, нам необходимо вычислить номер следующей инструкции — т.е. выполнить операцию IP++. Для этого, к старому значению IP-регистра прибавляется единица, результат записывается обратно в IP-регистр, и по этому новому адресу, в CMD-регистр, загружается очередная инструкция.

Вторым этапом начинается исполнение только что загруженной инструкции. Если она работает с сумматором, то процесс ее выполнения выглядит примерно так же как и процесс загрузки новой инструкции — старое значение во временный регистр, прибавляем лежающую в младших битах CMD-регистра константу, результат записываем обратно в регистр или текущую ячейку данных.
Таким образом, инструкция исполняется за один тик тактового генератора. По спадающему фронту загружаем очередную инструкцию, по нарастающему — исполняем ее.

И вот тут вскрылась одна особенность. После включения компьютера первый фронт тактового генератора будет нарастающим, а следовательно — мы должны будем исполнить текущую инструкцию, которую еще никто в CMD-регистр не загрузил — там нули.

Выполнили пустую инструкцию и… делаем IP++!

В итоге, нулевая ячейка памяти программы содержит нуль и никогда не будет исполнена. Первой загруженной из памяти инструкцией станет инструкция по адресу 0x0001.

Набор инструкций

Язык программирования brainf ck. Смотреть фото Язык программирования brainf ck. Смотреть картинку Язык программирования brainf ck. Картинка про Язык программирования brainf ck. Фото Язык программирования brainf ck
Рис.5: Набор инструкций релейного компьютера

Инструкции — 16-разрядные, где 4 старших бита отвечают за тип инструкции и 12 младших бит — полезная нагрузка. В большинстве случаев это константа.

Технические характеристики

BrainfuckPC — это 16-разрядный компьютер с процессором на базе герконовых реле, с архитектурой Фон-Неймана и набором инструкций Brainfuck++

Изначально предполагалось, что компьютер будет работать на частотах до 100Гц… А это — на минуточку — 4 пианинные октавы. К сожалению первые тесты показали, что 40Гц — это потолок, но и этого для релейной схемы безумно много. тем более что при внешнем тактировании необходимо подать два импульса на такт — из-за особенностей работы схемы синхронизации с внешним сигналом. 80Гц для музыки — уже что-то.

Состав компьютера

Язык программирования brainf ck. Смотреть фото Язык программирования brainf ck. Смотреть картинку Язык программирования brainf ck. Картинка про Язык программирования brainf ck. Фото Язык программирования brainf ck
Рис.6: Основные узлы релейного компьютера.

Рассмотрим компьютер поближе. Практически весь объем машины занимают блоки релейного процессора. В настоящий момент все уместилось в пять блоков, однако место есть для шести — так что если очень хочется, то впоследствии функционал процессора можно будет расширить.
Каждый такой блок содержит 32 модуля, в каждом модуле 3 или 4 герконовых реле РЭС55 и РЭС64. Питание каждого блока 5В, 3А.

Язык программирования brainf ck. Смотреть фото Язык программирования brainf ck. Смотреть картинку Язык программирования brainf ck. Картинка про Язык программирования brainf ck. Фото Язык программирования brainf ck
Рис.7: Комплект блоков и модулей релейного процессора, готовый к установе на раму.

Каждый модуль — унифицирован. 60х44мм, разъем на 16 выводов. При сборке блоков логики я вставлял требуемый модуль в свободный разъем и прошивал соединения.

Язык программирования brainf ck. Смотреть фото Язык программирования brainf ck. Смотреть картинку Язык программирования brainf ck. Картинка про Язык программирования brainf ck. Фото Язык программирования brainf ck
Рис.8: Модули D-триггеров проверяются на работоспособность.

Центральный ряд — блоки сумматора и регистровые блоки. Над ними и под ними — 16-разрядные защелки на базе РЭС43, комутирующие поток данных между блоками. Все данные крутятся именно тут.

Нижний ряд — ряд блоков логики процессора. Сейчас частично заполнены два блока, но если очень захочется — то модификация и расширение функционала за счет свободного места более чем возможна.

Язык программирования brainf ck. Смотреть фото Язык программирования brainf ck. Смотреть картинку Язык программирования brainf ck. Картинка про Язык программирования brainf ck. Фото Язык программирования brainf ck
Рис.9: Рама собрана из листового 2мм алюминия, из-под лазерной резки. На фото — уже сваренная и загрунтованная рама, готовая к покраске.

Верхняя часть — индикаторная. Слева — блок состояния машины — индикаторы на базе ИВ-6 отображают номер текущей ячейки памяти и ночер текущей инструкции, непосредственно саму исполняемую инструкцию, а также общий счетчик исполненных инструкций. Последнее очень кстати, ибо если эмулятор, например, говорит, что до первого символа в консоли надо выполнить 30 тысяч инструкций, счетчик наглядно покажет где машина сейчас и когда закончит считать.

Язык программирования brainf ck. Смотреть фото Язык программирования brainf ck. Смотреть картинку Язык программирования brainf ck. Картинка про Язык программирования brainf ck. Фото Язык программирования brainf ck
Рис.10: Итоговый вид индикаторной области. В процессе изготовления.

Справа — располагается плата памяти — самый спорный элемент машины. Хоть я и считаю, что компьютер таки релейный, однозначно 100% релейным является именно процессор. Периферия более современная. В частности — ОЗУ — это статические микросхемы памяти. Но так делают практически все современные создатели релейных компьютеров.

Язык программирования brainf ck. Смотреть фото Язык программирования brainf ck. Смотреть картинку Язык программирования brainf ck. Картинка про Язык программирования brainf ck. Фото Язык программирования brainf ck
Рис.11: Программатор. 16 линий адреса, 16 линий данных, питание, земля и линии чтения записи. Итого 36 контактов.

Поскольку память программ и данных — общая, то кто-то или что-то, каждый раз при включеннии компьютера, должен загружать программу в ОЗУ. Эта задача и возложена на программатор. В настоящий момент программатор располагается на самой плате памяти. Сейчас у него ровно две задачи.

Язык программирования brainf ck. Смотреть фото Язык программирования brainf ck. Смотреть картинку Язык программирования brainf ck. Картинка про Язык программирования brainf ck. Фото Язык программирования brainf ck
Рис.12: Структурная схема периферии процессора.

Так в ближайшем будущем будет выглядеть схемотехника периферии процессора. На плате памяти останутся только сами микросхемы памяти и цепи согласования сигналов с релейной схемой.

Через 36-контактный разъем программирования можно будет подключить программатор и загрузить прошивку в компьютер. Кроме программатора, имея необходимый преобразователь интерфейса, можно будет воспользоваться любым другим устройством. Хоть считывателем перфолент (у меня, кстати, имеется один, в комплекте с перфоратором перфолент и даже одной катушкой ленты), хоть панелью с тумблерами.

В итоге, релейная логика обеспечивает некий интерфейс, а преобразователь интерфейса может быть любым. К слову, параллельный разъем интерфейса будет совместим с LPT…

Демонстрация работы и текущий статус

В первую очередь, на компьютере была исполнена программа Hello World из статьи в википедии.

Исходный код выглядит следующим образом:

Хотя и на частоте 25Гц сложно уследить за тем, что происходит в ОЗУ.

Более полезной и практической задачей является расчет знаков числа Pi после запятой. Понятно что современные компьютеры решили эту задачу вплоть до 31,4 трлн знаков. Но сам факт того, что BrainfuckPC способен выполнять эту операцию, говорит о том, что релейный компьютер бесполезен не на 100%, а всего лишь на 99.9.

Язык программирования brainf ck. Смотреть фото Язык программирования brainf ck. Смотреть картинку Язык программирования brainf ck. Картинка про Язык программирования brainf ck. Фото Язык программирования brainf ck
Рис.13: Время, затрачиваемое на вывод N знаков числа Pi после запятой.

4 знака после запятой придется ждать почти полтора часа…

Рис.14: — Пи=3! — Как грубо!

Впрочем, даже два знака толком вывести не удалось, вместо них компьютер заявил что Пи равен 4 и завершил работу.

Язык программирования brainf ck. Смотреть фото Язык программирования brainf ck. Смотреть картинку Язык программирования brainf ck. Картинка про Язык программирования brainf ck. Фото Язык программирования brainf ck
Рис.15: Он явно знает про ту шутку, что в условии военного положения пи может доходить до четырех.

Я решил пойти другим путем и написал программу вычисления дроби
Язык программирования brainf ck. Смотреть фото Язык программирования brainf ck. Смотреть картинку Язык программирования brainf ck. Картинка про Язык программирования brainf ck. Фото Язык программирования brainf ck. Точность — 6 знаков числа пи после запятой! Это самый точный результат для дробей с числами адекватного размера.

Спустя три бессонные ночи я таки написал программу на brainfuck, способную поделить два числа друг на друга и выводить полученный результат с плавающей точкой в терминал. Вердикт эмулятора следующий — потребуется исполнить 60 тысяч инструкций. В следнем по 10 тысяч на знак:

Язык программирования brainf ck. Смотреть фото Язык программирования brainf ck. Смотреть картинку Язык программирования brainf ck. Картинка про Язык программирования brainf ck. Фото Язык программирования brainf ck
Рис.16: Время, затрачиваемое на вывод очередного знако после запятой при вычислении дроби.

Как быстро будут появляться очередные значения. Надо сказать весьма быстро по сравнению с прошлой программой!

Но счастье было недолгим — компьютер начал сбоить в 16-разрядном режиме. Диагностирование показало, что дурит плата памяти — постоянно выставляет 13-й бит. Сделаю новую плату памяти и все пройдет, а пока ограничусь дробью Язык программирования brainf ck. Смотреть фото Язык программирования brainf ck. Смотреть картинку Язык программирования brainf ck. Картинка про Язык программирования brainf ck. Фото Язык программирования brainf ckдвумя знаками после запятой и 8 разрядным режимом работы. Самое главное — она требует выполнить всего лишь 1600 инструкций! На частоте в 25Гц это — чуть более одной минуты.

Неоднократно и со свистом компьютер справляется с поставленной задачей.

To be continued.

Сейчас на компьютере можно исполнять программы, которые не требуют ввода данных пользователем. Я банально до сих пор не накрутил инструкцию CTRLIO.CIN 🙂 И не собираюсь делать это в ближайшее время. В настоящий момент компьютер завершен на 98%. И после двух лет работы накопилось множество проектов, которые ждут момента, когда я ими займусь.

Язык программирования brainf ck. Смотреть фото Язык программирования brainf ck. Смотреть картинку Язык программирования brainf ck. Картинка про Язык программирования brainf ck. Фото Язык программирования brainf ck

В первую очередь это ламповый компьютер на базе коммутаторных декатронов. У меня уже есть и перфоратор перфолент и сами декатроны (правда в основном А101 — на них компьютер выйдет еще медленнее чем релейный — нужны А103). Даже 700 вакуумных ламп уже имеется и много всего…

Язык программирования brainf ck. Смотреть фото Язык программирования brainf ck. Смотреть картинку Язык программирования brainf ck. Картинка про Язык программирования brainf ck. Фото Язык программирования brainf ck

Про пневмонику я тоже не забываю — мой товарищ Антон занимается натур. экспериментами, но об этом — в следующий раз.

… оставляя следующие недоделки. Часть задачу решу к фестивалю в конце мая, часть — нет:

Вся документация по релейному компьютеру есть в репозитории на GitHub, а следить за его статусом можно в любой соцсети по ссылкам у меня в профиле.

UPD: От участия в фестивале я отказался.
И еще — 25–26 мая в Москве, на территории «Хлебозавода», пройдет первый фестиваль крафтовых производств и DIY-культуры Antifactory. Я там буду присутствовать с релейным компьютером и релейный контроллер автополива тоже привезу. Вход на мероприятие свободный, так что будете в эти дни в Москве — не упустите шанс увидеть моего релейного монстра вживую. Если довезу в целости и сохранности — обязательно продемонстрирую в работе.

Источник

Brainfuck

Brainfuck — один из известнейших эзотерических языков программирования, придуман Урбаном Мюллером (нем. Urban Müller ) в 1993 году, известен своим минимализмом. Название языка можно перевести на русский как вынос мозга, оно напрямую образовано от английского выражения brainfuck (brain — мозг, fuckиметь половое сношение), т. е. заниматься ерундой. Язык имеет восемь команд, каждая из которых записывается одним символом. Исходный код программы на Brainfuck представляет собой последовательность этих символов без какого-либо дополнительного синтаксиса.

Одним из мотивов Урбана Мюллера было создание языка с как можно меньшим компилятором. Отчасти он был вдохновлён языком FALSE, для которого существовал компилятор размером 1024 байта. Существуют компиляторы языка Brainfuck размером меньше 200 байт. [1] Программы на языке Brainfuck писать сложно, за что его иногда называют языком для мазохистов. Но при этом важно отметить, что Brainfuck является вполне естественным, полным и простым языком и может использоваться при определении понятия вычислимости.

Машина, которой управляют команды Brainfuck, состоит из упорядоченного набора ячеек и указателя текущей ячейки, напоминая ленту и головку машины Тьюринга. Кроме того, подразумевается устройство общения с внешним миром (см. команды . и ,) через поток ввода и поток вывода.

Язык Brainfuck можно описать с помощью эквивалентов языка Си:

Команда BrainfuckЭквивалент на СиОписание команды
Начало программыint i = 0;
char arr[30000];
memset(arr, 0, sizeof(arr));
выделяется память под 30 000 ячеек с нулевыми начальными значениями
>i++;перейти к следующей ячейке
i—;перейти к предыдущей ячейке
+arr[i]++;увеличить значение в текущей ячейке на 1
arr[i]—;уменьшить значение в текущей ячейке на 1
.putchar(arr[i]);напечатать значение из текущей ячейки
,arr[i] = getchar();ввести извне значение и сохранить в текущей ячейке
[while(arr[i]) <если значение текущей ячейки ноль, перейти вперёд по тексту программы на ячейку, следующую за соответствующей ] (с учётом вложенности)
]>если значение текущей ячейки не нуль, перейти назад по тексту программы на символ [ (с учётом вложенности)

Несмотря на внешнюю примитивность, Brainfuck с бесконечным набором ячеек имеет тьюринговскую полноту, а, следовательно, по потенциальным возможностям не уступает «настоящим» языкам, подобным Си, Паскалю или Java.

Brainfuck подходит для экспериментов по генетическому программированию из-за простоты синтаксиса, и, соответственно, генерации исходного кода.

В «классическом» Brainfuck, описанном Мюллером, размер ячейки — один байт, количество ячеек 30 000. В начальном состоянии указатель находится в крайней левой позиции, а все ячейки заполнены нулями. Увеличение/уменьшение значений ячеек происходит по модулю 256. Ввод-вывод также происходит побайтно, с учётом кодировки ASCII (то есть в результате операции ввода (,) символ 1 будет записан в текущую ячейку как число 0x31 (49), а операция вывода (.), совершённая над ячейкой, содержащей 0x41 (65), напечатает латинскую А). В других вариантах языка размер и количество ячеек может быть другим (бо́льшим). Есть версии, где значение ячеек не целочисленно (с плавающей точкой).

Содержание

Пример программы

Подготовка в памяти (с ячейки 1) массива значений, близких к ASCII-кодам символов, которые необходимо вывести (70, 100, 30, 10), через повторение 10 раз приращения ячеек на 7, 10, 3 и 1, соответственно
++++++++++присваивание ячейке 0 (счетчику) значения 10
[повторять, пока значение текущей ячейки (ячейки 0) больше нуля
>+++++++приращение ячейки 1 на 7
>++++++++++приращение ячейки 2 на 10
>+++приращение ячейки 3 на 3
>+приращение ячейки 4 на 1
возврат к ячейке 0 (счетчику), и его уменьшение на 1
]вернуться к началу цикла
Получение кодов букв и их вывод
>++.Вывод «Н». Получение кода «H» (72) из 70 в ячейке 1 и вывод
>+.Вывод «e». Получение кода «e» (101) из 100 в ячейке 2 и вывод
+++++++..Вывод «ll». Получение кода «l» (108) из 101 в ячейке 2 и вывод дважды
+++.Вывод «o». Получение кода «o» (111) из 108 в ячейке 2 и вывод
>++.Вывод пробела. Получение кода пробела (32) из 30 в ячейке 3 и вывод
Вывод «W». Получение кода «W» (87) из 72 в ячейке 1 и вывод
>.Вывод «o». Код «o» (111) уже находится в ячейке 2, просто его выводим
+++.Вывод «r». Получение кода «r» (114) из 111 в ячейке 2 и вывод
——.Вывод «l». Получение кода «l» (108) из 114 в ячейке 2 и вывод
———.Вывод «d». Получение кода «d» (100) из 108 в ячейке 2 и вывод
>+.Вывод «!». Получение кода «!» (33) из 32 в ячейке 3 и вывод
>.Вывод кода перевода строки (10) из ячейки 4

В принципе, печать «Hello World!» можно реализовать проще, но программа будет в три с лишним раза больше, чем приведённый выше оптимизированный вариант:

Интерпретатор Brainfuck

Пример интерпретатора Brainfuck, написанный на языке Perl

Пример интерпретатора Brainfuck, написанный на языке C++

Программирование на языке Brainfuck

Каждый начинающий программировать на Brainfuck немедленно сталкивается со следующими проблемами:

Эти проблемы могут быть решены.

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

Языки на основе Brainfuck

Ook!COWBrainfuckОписание
Ook. Ook.MoO+Значение текущей ячейки увеличивает на 1
Ook! Ook!MOoЗначение текущей ячейки уменьшают на 1
Ook. Ook?moO>Следующая ячейка
Ook? Ook.mOoСм. также

Диалекты и реализации

Ещё описание множества диалектов этого языка можно найти в вики-энциклопедии эзотерических языков [2]

Другие абстрактные исполнители и формальные системы вычислений

Примечания

Ссылки

Что такое wiki2.info Вики является главным информационным ресурсом в интернете. Она открыта для любого пользователя. Вики это библиотека, которая является общественной и многоязычной.

Основа этой страницы находится в Википедии. Текст доступен по лицензии CC BY-SA 3.0 Unported License.

Wikipedia® — зарегистрированный товарный знак организации Wikimedia Foundation, Inc. wiki2.info является независимой компанией и не аффилирована с Фондом Викимедиа (Wikimedia Foundation).

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *