Деякі речі здаються чимось надзвичайно страшним і складним, аж поки не спробуєш з ними розібратися. Словом, «вивчив» я мову програмування
Мозкойоб. Мову цю придумав Урбан Мюллер з метою створити таку мову програмування, для якої буде потрібен найменший у світі компілятор.
Мова складається з таких простих операторів:
> — пересунути вказівник на дані на наступну комірку («праворуч»),,
< — пересунути вказівник на дані «ліворуч»,,
+ — збільшити на одиницю значення у поточній комірці,,
– — зменшити на одиницю значення у поточній комірці,,
. — надрукувати значення поточної комірки,,
, — зняти з пристрою вводу один байт даних і записати його в поточну комірку,,
[ — якщо у поточній комірці 0, то перейти вперед до команди, що слідує відразу після найближчого оператора «]»,
] — якщо у поточній комірце не 0, то назад до команди, що слідує після оператора «[».
Простішими словами, дужки [...] — це аналог циклу while (i<>0) {...}, в якому виконання умови перевіряється двічі: на початку і в кінці циклу.
На початку ми маємо певну послідовність однобайтових комірок, заповнених нулями. «Однобайтових» означає, що туди можна записувати лише значення від 0 до 255 (здогадайтесь, чому?), а відтак збільшення значення 255 на одиницю призведе до того, що там буде нуль і vice versa: зменшення нуля на одиницю дасть 255.
Проста програма «Hello, world!» виглядає цією мовою так:
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
Правда, гарно? Але нічого не зрозуміло. А тепер розіб’ємо її на частини і прокоментуємо:
++++++++++ #Десять разів застосували + до комірки №0, записавши туди число 10, таким чином
[ #цим циклом ми зробимо так, щоб у наступних чотирьох комірках були числа 100, 70, 30 та 10
> +++++ ++ # перейти до комірки 1, записати туди число 7
> +++++ +++++ # перейти до комірки 2, записати туди 10
> +++ #перейти до комірки 3, записати туди 3
> + # перейти до комірки 4, записати туди 1
<<<< - # перейти до комірки 0, відняти одиницю
] #оскільки в комірці 0 було 10, то цикл буде повторюватися 10 разів, поки в комірці 0 не стане нуль.
#отже, в комірці 1 буде 70, в комірці 2 — 100, в комірці 3 — 30, і в комірці 4 — 10
> ++ . #перейти до комірки 1, збільшити значення на 2, надрукувати літеру «H» (яка має код 72)
> + . #перейти до комірки 2, збільшити значення на 1, надрукувати літеру «e» (яка має код 11)
+++++ ++ . #в комірці 2 зробити щоб було 19 і надрукувати це — літеру «l»
. #ще раз надрукувати літеру «l»
+++ . #надрукувати «о»
>++ . #надрукувати пропуск
<< +++++ +++++ +++++ . #надрукувати «W»
> . #знову надрукувати «o»
+++ . #надрукувати «r»
----- - . #надрукувати «l»
----- --- . #надрукувати «d»
> + . #надрукувати «!»
> . #надрукувати перехід на інший рядок (\n)
Як бачите, не так вже й складно! За бажанням цією мовою можна написати якісь нескладні програми а ля калькулятор. І чому його не вивчають у школі, а?
Корисні посилання:
Конвертер з Brainfuck на PHP
Про Brainfuck у Вікіпедії
Компілятор Brainfuck на асемблері, для лінукса
Бібілотека компіляторів, утиліт та програм на цій мові
Купа цікавих посилань в каталозі Ґуґла
FuckBrainFuck — мова програмування, код якої компілюється в код Brainfuck
Процесор, який вміє виконувати код Brainfuck-а без компіляції (нативно)