Brainfuck

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

Brainfuck (англ. brain+fuck) — одна з найвідоміших езотеричних мов програмування, вигадана Урбаном Мюллером (Urban Müller) заради забави. Складається з восьми команд, кожна з яких записується одним символом. Вихідний код програми на Brainfuck є послідовність символів мови без жодного синтаксису.

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

Команди мови[ред.ред. код]

8 команд мови Brainfuck:
> перейти до наступної комірки
< перейти до попередньої комірки
+ збільшити значення в поточній комірці на 1
- зменшити значення в поточній комірці на 1
. надрукувати значення поточної комірки
, ввести ззовні значення і зберегти в поточну комірку
[ якщо значення поточної комірки - нуль, перейти вперед по тексту програми до ] з урахуванням вкладеності
] якщо значення поточної комірки не нуль, перейти назад по тексту програми до [ з урахуванням вкладеності

Незважаючи на зовнішню примітивність, Brainfuck з нескінченним набором комірок є повною за Тюрингом, а отже, не поступається можливостями іншим сучасним мовам, подібним C, Паскалю або Java.

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

У «класичному» Brainfuck, що описаний Мюллером, розмір комірки — один байт, кількість комірок — 30000.

У початковому стані покажчик знаходиться в крайній лівій позиції, а всі осередки заповнені нулями. Збільшення/зменшення значень комірок відбувається по модулю 256. Введення та виведення також відбувається побайтно, з урахуванням кодування ASCII (тобто в результаті операції введення (,) символ 1 буде записаний у поточний комірці як число 0x31, а операція виведення (.), зроблена над коміркою, що містить 0x41, надрукує латинську А). В інших варіантах мови розмір і кількість комірок можуть бути іншими (бі́льшими). Є версії, де значення комірок не є цілочисельним (із крапкою, що плаває).

Відповідність команд brainfuck до команд мови С[ред.ред. код]

Команди brainfuck C еквівалент
(Початок програми) char array[30000];
char *ptr=array;
> ++ptr;
< --ptr;
+ ++*ptr;
- --*ptr;
. putchar(*ptr);
, *ptr=getchar();
[ while (*ptr) {
] }

Приклад програми[ред.ред. код]

Програма мовою Brainfuck, що виводить «Hello World!»:
     ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++
     .>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.
     ------.--------.>+.>.

Розбір програми:

Підготовка у пам'яті (із комірки 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

Див. також[ред.ред. код]

Посилання[ред.ред. код]