learnxinyminutes-docs/ru-ru/bf.html.markdown

86 lines
6.1 KiB
Markdown
Raw Normal View History

---
2016-02-12 22:42:25 +03:00
language: bf
contributors:
- ["Prajit Ramachandran", "http://prajitr.github.io/"]
- ["Mathias Bynens", "http://mathiasbynens.be/"]
translators:
- ["Dmitry Bessonov", "https://github.com/TheDmitry"]
lang: ru-ru
---
Brainfuck (пишется маленькими буквами, кроме начала предложения) - это очень
маленький Тьюринг-полный язык программирования лишь с 8 командами.
Вы можете испытать brainfuck в вашем браузере с помощью [brainfuck-визуализатора](http://fatiherikli.github.io/brainfuck-visualizer/).
```
2015-01-13 19:19:24 +03:00
Любой символ, кроме "><+-.,[]", игнорируется, за исключением кавычек.
Brainfuck представлен массивом из 30000 ячеек, инициализированных нулями,
2015-01-13 19:19:24 +03:00
и указателем с позицией в текущей ячейке.
Всего восемь команд:
+ : Увеличивает значение на единицу в текущей ячейке.
- : Уменьшает значение на единицу в текущей ячейке.
> : Смещает указатель данных на следующую ячейку (ячейку справа).
< : Смещает указатель данных на предыдущую ячейку (ячейку слева).
. : Печатает ASCII символ из текущей ячейки (напр. 65 = 'A').
, : Записывает один входной символ в текущую ячейку.
[ : Если значение в текущей ячейке равно нулю, то пропустить все команды
до соответствующей ] . В противном случае, перейти к следующей инструкции.
] : Если значение в текущей ячейке равно нулю, то перейти к следующей инструкции.
В противном случае, вернуться назад к соответствующей [ .
2015-01-13 19:19:24 +03:00
[ и ] образуют цикл while. Естественно, они должны быть сбалансированы.
2015-01-13 19:19:24 +03:00
Давайте рассмотрим некоторые базовые brainfuck-программы.
++++++ [ > ++++++++++ < - ] > +++++ .
2015-01-13 19:19:24 +03:00
Эта программа выводит букву 'A'. Сначала программа увеличивает значение
ячейки №1 до 6. Ячейка №1 будет использоваться циклом. Затем программа входит
в цикл ([) и переходит к ячейке №2. Ячейка №2 увеличивается до 10, переходим
назад к ячейке №1 и уменьшаем ячейку №1. Этот цикл проходит 6 раз (ячейка №1
уменьшается до нуля, и с этого места пропускает инструкции до соответствующей ]
и идет дальше).
2015-01-13 19:19:24 +03:00
В этот момент мы находимся в ячейке №1, которая имеет значение 0, значение
ячейки №2 пока 60. Мы переходим на ячейку №2, увеличиваем 5 раз, до значения 65,
и затем выводим значение ячейки №2. Код 65 является символом 'A' в кодировке ASCII,
так что 'A' выводится на терминал.
, [ > + < - ] > .
Данная программа считывает символ из пользовательского ввода и копирует символ
в ячейку №1. Затем мы начинаем цикл. Переходим к ячейке №2, увеличиваем значение
ячейки №2, идем назад к ячейке №1 и уменьшаем значение ячейки №1. Это продолжается
2015-01-13 19:19:24 +03:00
до тех пор, пока ячейка №1 не равна 0, а ячейка №2 сохраняет старое значение
ячейки №1. Мы завершаем цикл на ячейке №1, поэтому переходим в ячейку №2 и
затем выводим символ ASCII.
2015-01-13 19:19:24 +03:00
Также имейте в виду, что пробелы здесь исключительно для читабельности. Вы можете
легко написать и так:
,[>+<-]>.
Попытайтесь разгадать, что следующая программа делает:
,>,< [ > [ >+ >+ << -] >> [- << + >>] <<< -] >>
Программа принимает два числа на вход и умножает их.
Суть в том, что программа сначала читает два ввода. Затем начинается внешний цикл,
сохраняя ячейку №1. Затем программа перемещается в ячейку №2, и начинается
внутренний цикл с сохранением ячейки №2, увеличивая ячейку №3. Однако появляется
2015-01-13 19:19:24 +03:00
проблема: В конце внутреннего цикла ячейка №2 равна нулю. В этом случае,
внутренний цикл не будет работать уже в следующий раз. Чтобы решить эту проблему,
мы также увеличим ячейку №4, а затем копируем ячейку №4 в ячейку №2.
Итак, ячейка №3 - результат.
```
Это и есть brainfuck. Не так уж сложно, правда? Забавы ради, вы можете написать
2015-01-13 19:19:24 +03:00
свою собственную brainfuck-программу или интерпретатор на другом языке.
Интерпретатор достаточно легко реализовать, но если вы мазохист, попробуйте
2015-01-13 19:19:24 +03:00
написать brainfuck-интерпретатор... на языке brainfuck.