Brainfuck - один з найвідоміших езотеричних мов програмування, що відрізняється особливим мінімалізмом. Складається з восьми команд, кожна з яких записується одним символом.
Brainfuck породив безліч діалектів, що відрізняються набором команд, способом їх записи або деталями реалізації, наприклад, максимальним значенням числа, що зберігається в осередку, або ситуаціями, що викликають помилку інтерпретації.
Теоретично Brainfuck дійсно має властивість Тьюринг-повноти і отже, може виконати будь-яке завдання. На практиці, втім, ця мова зовсім непридатний для вирішення завдань з реального життя; виконання навіть найпростіших завдань стає викликом для розробника. Тому Brainfuck використовується виключно як математична модель або для розваги.
Творця Brainfuck надихнув мову FALSE. а його 6 команд (за винятком команд вводу-виводу) в точності збігаються з командами мови P ", але залишається невідомим, впливав чи останній на розробку Brainfuck.
Brainfuck використовує модель машини, що нагадує машину Тьюринга і складається з наступних елементів:
- програма - послідовність односимвольних команд мови і, можливо, інших символів (при обробці ігноруються);
- покажчик інструкцій - вказує на команду, яка буде виконана на наступному кроці, після її виконання пересувається на іншу (зазвичай наступну праворуч) команду;
- пам'ять - моделюється одновимірним масивом осередків, в кожній клітинці зберігається один байт; початкове значення осередки - нуль;
- покажчик даних - вказує на поточну комірку пам'яті; початкове значення - найлівіша осередок масиву; по команді рухається або змінює значення, що зберігається в поточному осередку;
- потоки введення і виведення - послідовності байтів в кодуванні ASCII.
Слід зазначити, що через специфіку мови команди умовного переходу [і] використовуються при реалізації практично всіх операцій, які є елементарними в інших мовах (привласнення значення, математичні і логічні операції і т.д.).
Елементи синтаксису:
Hello, World !:
Існує багато способів сказати "Hello, World!" На Brainfuck. Нижче наведено найпростіший з них: використовувати тільки одну комірку пам'яті і послідовно змінювати її значення на ASCII-код кожної літери повідомлення. Кожен рядок прикладу виводить один символ.
Hello, World !:
У цьому прикладі використовується три основні осередки пам'яті - перша для великих літер 'H' і 'W', друга для малих літер і третя для розділових знаків ',', '' і '!' - і три додаткові індексні осередки для скорочення запису змін ASCII-кодів. Використана пам'ять виглядає наступним чином:
(Індексна осередок 1) (осередок великих літер) (індексна осередок 2) (осередок малих літер) (індексна осередок 3) (осередок розділових знаків)
Числа Фібоначчі:
Класичний інтерпретатор Brainfuck використовує змінні типу byte для зберігання значень в осередках пам'яті, і 14-16 числа Фібоначчі викличуть помилку переповнення. Написання довгої арифметики на Brainfuck - завдання досить трудомістка, тому в прикладі передбачається, що в осередках пам'яті можуть зберігатися числа типу integer.
Факторіал:
Класичний інтерпретатор Brainfuck використовує змінні типу byte для зберігання значень в осередках пам'яті, і вже 6! викличе помилку переповнення. Написання довгої арифметики на Brainfuck - завдання досить трудомістка, тому в прикладі передбачається, що в осередках пам'яті можуть зберігатися числа типу integer.
Hello, World !:
Hello, World !:
Цей приклад є перекладом на Spoon цього прикладу. Відзначимо, що Spoon дозволяє не розділяти окремі команди пробілами, але поточна версія EsCo вимагає, щоб команди поділялися пробілами.
Hello, World !:
Цей приклад є перекладом на Brainloller цього прикладу. Оскільки Brainloller - мова чисто графічний, в ролі вихідного коду виступають зображення.
"Hello, World!" на Brainloller
"Hello, World!" на Brainloller (збільшення 10x)
Hello, World !:
Цей приклад є перекладом на Unary цього прикладу. Сам код занадто великий, щоб приводити його повністю, тому вказана тільки його довжина.
Числа Фібоначчі:
Цей приклад є перекладом на Unary цього прикладу. Сам код занадто великий, щоб приводити його повністю, тому вказана тільки його довжина.