Компілятор (інтерпретатор) Brainfuck - AlterVision
Компілятор (інтерпретатор) Brainfuck
Іноді викладачі університету дають дуже цікаві завдання. Цього разу ідеєю вельмишановного Едуарда Емільєвіча Александрова, який вже наштовхнув мене на створення менеджера пам'яті MC Heappie та OpenGL-генератора Landscape Winter, було створення компілятора... Одне «але» — зрозуміло, він спочатку не уточнив, якого саме) Мій хороший товариш Тім свого часу говорив про чудову мову програмування, яка «трахає мозок»… Погортавши свою улюблену Вікіпедію, я натрапив на вкрай цікаву мову програмування — Brainfuck!
Brainfuck (англ. brain мозок + fuck) — одна з найвідоміших езотеричних мов програмування, придумана Урбаном Мюллером (Urban Muller) у 1993 році для забави. Мова має вісім команд, кожна із яких записується одним символом. Вихідний код програми на Brainfuck є послідовністю цих символів без будь-якого додаткового синтаксису.
Одним із мотивів Урбана Мюллера було створення мови з якнайменшим компілятором. Частково він був натхненний мовою FALSE, для якого існував компілятор розміру 1024 байт. Існують компілятори мови Brainfuck розміром менше 200 байт. Програми на мові Brainfuck писати складно, за що іноді називають мовою для мазохістів. Але при цьому важливо відзначити, що Brainfuck є цілком природною, повною та простою мовою і може використовуватися при визначенні поняття обчислюваності.
Машина, якою керують команди Brainfuck, складається з впорядкованого набору осередків та покажчика поточного осередку, нагадуючи стрічку та головку машини Тьюринга. Крім того, мається на увазі пристрій спілкування із зовнішнім світом (див. команди . і ) через потік введення і потік виведення.
Головне, що потрібно знати для написання компілятора, це інтерпретація команд мови.
| > | ++p; | перейти до наступного осередку |
| » рухають поточний покажчик по простору осередків машини Тьюринга. При цьому якщо покажчик намагається переміститися в негативну область або виходить за межі простору, він обнулюється. Команди зміни значення «+» та «-» відповідають за інкремент і декремент значення в комірці, на якій знаходиться покажчик. Команда виведення інформації «.» друкує вміст поточної комірки на екрані. Так як осередки є байтами, то вміст легко друкується як символ, що відповідає даному значенню ASCII. Команда введення «,» зчитує один символ з основного введення - тобто користувачеві необхідно натиснути якусь клавішу. Команда початку циклу «[» записує поточний покажчик команди у стек і починає виконання циклу, якщо значення поточної комірки більше нуля. Команда закінчення циклу «]» зчитує зі стека останній покажчик команди та повертається на нього. |
Після закінчення програми виконується очищення стека у разі, якщо виникли якісь помилки. На цьому робота функції закінчується і вважається, що програма завершилася успішно... або майже успішно)
А тепер – найголовніше – «Hello World! » на BrainFuck!!
Зберігаємо це у файл hw.bf і запускаємо його як run hw.bf з командного рядка. Що ми бачимо? Hello World! Значить, компілятор вдався!
Завантажити : вихідні коди програми та сам компілятор, а також пара прикладів.