bf.md

Личный сайт Go-разработчика из Казани

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

Вы можете испытать brainfuck в вашем браузере с помощью brainfuck-визуализатора.

1Любой символ, кроме "><+-.,[]", игнорируется, за исключением кавычек. 2 3Brainfuck представлен массивом из 30000 ячеек, инициализированных нулями, 4и указателем с позицией в текущей ячейке. 5 6Всего восемь команд: 7+ : Увеличивает значение на единицу в текущей ячейке. 8- : Уменьшает значение на единицу в текущей ячейке. 9> : Смещает указатель данных на следующую ячейку (ячейку справа). 10< : Смещает указатель данных на предыдущую ячейку (ячейку слева). 11. : Печатает ASCII символ из текущей ячейки (напр. 65 = 'A'). 12, : Записывает один входной символ в текущую ячейку. 13[ : Если значение в текущей ячейке равно нулю, то пропустить все команды 14 до соответствующей ] . В противном случае, перейти к следующей инструкции. 15] : Если значение в текущей ячейке равно нулю, то перейти к следующей инструкции. 16 В противном случае, вернуться назад к соответствующей [ . 17 18[ и ] образуют цикл while. Естественно, они должны быть сбалансированы. 19 20Давайте рассмотрим некоторые базовые brainfuck-программы. 21 22++++++ [ > ++++++++++ < - ] > +++++ . 23 24Эта программа выводит букву 'A'. Сначала программа увеличивает значение 25ячейки №1 до 6. Ячейка №1 будет использоваться циклом. Затем программа входит 26в цикл ([) и переходит к ячейке №2. Ячейка №2 увеличивается до 10, переходим 27назад к ячейке №1 и уменьшаем ячейку №1. Этот цикл проходит 6 раз (ячейка №1 28уменьшается до нуля, и с этого места пропускает инструкции до соответствующей ] 29и идет дальше). 30 31В этот момент мы находимся в ячейке №1, которая имеет значение 0, значение 32ячейки №2 пока 60. Мы переходим на ячейку №2, увеличиваем 5 раз, до значения 65, 33и затем выводим значение ячейки №2. Код 65 является символом 'A' в кодировке ASCII, 34так что 'A' выводится на терминал. 35 36 37, [ > + < - ] > . 38 39Данная программа считывает символ из пользовательского ввода и копирует символ 40в ячейку №1. Затем мы начинаем цикл. Переходим к ячейке №2, увеличиваем значение 41ячейки №2, идем назад к ячейке №1 и уменьшаем значение ячейки №1. Это продолжается 42до тех пор, пока ячейка №1 не равна 0, а ячейка №2 сохраняет старое значение 43ячейки №1. Мы завершаем цикл на ячейке №1, поэтому переходим в ячейку №2 и 44затем выводим символ ASCII. 45 46Также имейте в виду, что пробелы здесь исключительно для читабельности. Вы можете 47легко написать и так: 48 49,[>+<-]>. 50 51Попытайтесь разгадать, что следующая программа делает: 52 53,>,< [ > [ >+ >+ << -] >> [- << + >>] <<< -] >> 54 55Программа принимает два числа на вход и умножает их. 56 57Суть в том, что программа сначала читает два ввода. Затем начинается внешний цикл, 58сохраняя ячейку №1. Затем программа перемещается в ячейку №2, и начинается 59внутренний цикл с сохранением ячейки №2, увеличивая ячейку №3. Однако появляется 60проблема: В конце внутреннего цикла ячейка №2 равна нулю. В этом случае, 61внутренний цикл не будет работать уже в следующий раз. Чтобы решить эту проблему, 62мы также увеличим ячейку №4, а затем копируем ячейку №4 в ячейку №2. 63Итак, ячейка №3 - результат.

Это и есть brainfuck. Не так уж сложно, правда? Забавы ради, вы можете написать свою собственную brainfuck-программу или интерпретатор на другом языке. Интерпретатор достаточно легко реализовать, но если вы мазохист, попробуйте написать brainfuck-интерпретатор… на языке brainfuck.