Почитав хабру, я не нашёл хорошей вводной статьи про эзотерический язык программирования Brainfuck. В этой статье я опишу синтаксис и основные принципы написания программ на этом языке.
Организация памяти
Память в языке Brainfuck представляет собой «бесконечную» ленту начинающуюся в первом элементе. В некоторых реализациях языка лента может быть зациклена. Язык Brainfuck — это фактически реализация машины Тьюринга. Есть указатель, который указывает на текущую ячейку в этой ленте. В каждой ячейке храниться число от 0 до 255. Сначала во всех ячейках значение — ноль.
Доступны операции: переместить указатель вправо, влево, вывести значение текущей ячейки в виде символа, считать значение в ячейку, увеличить и уменьшить значение в ячейке на 1. Также в языке присутствуют циклы, которые выполняются пока значение в текущей ячейке не ноль.
Синтаксис
Всего в языке восемь операторов:
< — сдвинуть указатель на предыдущую ячейку в ленте.
> — сдвинуть указатель на следующую ячейку.
+ — увеличить значение текущей ячейки на 1.
— — уменьшить значение текущей ячейки на 1.
. — вывести значение текущей ячейки.
, — считать значение текущей ячейки.
[ — начало цикла, который выполняется пока текущая ячейка не ноль.
] — конец цикла. Если значение текущей ячейки ноль, то цикл прекращается, иначе — выполняется от предыдущего знака [.
Собственно, это все операторы языка. Все остальные символы считаются комментариями. Хоть язык содержит всего восемь операторов, он обладает полнотой по Тьюрингу, что означает, что на нём можно реализовать любой алгоритм.
Hello, world!
Напишем простую программу, выводящую надпись «Hello, world!». Для этого нам понадобиться знать ASCII код каждого символа, который мы хотим вывести.
Код программы:
Будем работать в одной ячейке. Сначала получим ASCII код символа H — 72. Выведем его оператором точка. Далее получим следующий символ и т. д.
Пример простой программы с вводом
Напишем программу, которая копирует поток ввода в поток вывода пока введённый символ не имеет ASCII кода 0:
Будем использовать одну ячейку и пока её значение не ноль — считываем и выводим.
Методы программирования
Один из самых известных методов — создание цикла со счётчиком.
Счётчик будем хранить в одной ячейке и на каждой итерации уменьшать его. Перед циклом нужно установить требуемое значение.
Ещё один метод — копирование значения. Для этого используем цикл и уменьшаем текущее значение в ячейке увеличивая две другие ячейки. Код:
Предполагается, что копирование идёт в два соседних элемента. Обратите внимание, что значение в исходной ячейке станет нулём.
Заметьте, что в языке Brainfuck нет арифметических и условных операторов. Их придётся реализовывать вручную.
Интерпретаторы языка Braifuck
Существует множество реализаций языка. Некоторые интерпретаторы весят менее 200 байт.
Один из самых популярных и удобных реализаций языка — BFdev. В этой среде разработке есть редактор, интерпретатор и даже отладчик.
Также реализации:
bfrun
Существуют даже онлайн интерпретаторы. К примеру: brainfuck.tk
Организация памяти
Память в языке Brainfuck представляет собой «бесконечную» ленту начинающуюся в первом элементе. В некоторых реализациях языка лента может быть зациклена. Язык Brainfuck — это фактически реализация машины Тьюринга. Есть указатель, который указывает на текущую ячейку в этой ленте. В каждой ячейке храниться число от 0 до 255. Сначала во всех ячейках значение — ноль.
Доступны операции: переместить указатель вправо, влево, вывести значение текущей ячейки в виде символа, считать значение в ячейку, увеличить и уменьшить значение в ячейке на 1. Также в языке присутствуют циклы, которые выполняются пока значение в текущей ячейке не ноль.
Синтаксис
Всего в языке восемь операторов:
< — сдвинуть указатель на предыдущую ячейку в ленте.
> — сдвинуть указатель на следующую ячейку.
+ — увеличить значение текущей ячейки на 1.
— — уменьшить значение текущей ячейки на 1.
. — вывести значение текущей ячейки.
, — считать значение текущей ячейки.
[ — начало цикла, который выполняется пока текущая ячейка не ноль.
] — конец цикла. Если значение текущей ячейки ноль, то цикл прекращается, иначе — выполняется от предыдущего знака [.
Собственно, это все операторы языка. Все остальные символы считаются комментариями. Хоть язык содержит всего восемь операторов, он обладает полнотой по Тьюрингу, что означает, что на нём можно реализовать любой алгоритм.
Hello, world!
Напишем простую программу, выводящую надпись «Hello, world!». Для этого нам понадобиться знать ASCII код каждого символа, который мы хотим вывести.
Код программы:
+++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++.+++++++++++++++++
++++++++++++.+++++++..+++.-------------------
---------------------------------------------
---------------.+++++++++++++++++++++++++++++
++++++++++++++++++++++++++.++++++++++++++++++
++++++.+++.------.--------.------------------
---------------------------------------------
----.-----------------------.
Будем работать в одной ячейке. Сначала получим ASCII код символа H — 72. Выведем его оператором точка. Далее получим следующий символ и т. д.
Пример простой программы с вводом
Напишем программу, которая копирует поток ввода в поток вывода пока введённый символ не имеет ASCII кода 0:
[,.]
Будем использовать одну ячейку и пока её значение не ноль — считываем и выводим.
Методы программирования
Один из самых известных методов — создание цикла со счётчиком.
Счётчик будем хранить в одной ячейке и на каждой итерации уменьшать его. Перед циклом нужно установить требуемое значение.
Ещё один метод — копирование значения. Для этого используем цикл и уменьшаем текущее значение в ячейке увеличивая две другие ячейки. Код:
[->+>+<<]
Предполагается, что копирование идёт в два соседних элемента. Обратите внимание, что значение в исходной ячейке станет нулём.
Заметьте, что в языке Brainfuck нет арифметических и условных операторов. Их придётся реализовывать вручную.
Интерпретаторы языка Braifuck
Существует множество реализаций языка. Некоторые интерпретаторы весят менее 200 байт.
Один из самых популярных и удобных реализаций языка — BFdev. В этой среде разработке есть редактор, интерпретатор и даже отладчик.
Также реализации:
bfrun
Существуют даже онлайн интерпретаторы. К примеру: brainfuck.tk