Увидел подобное на другом языке программирования и решил реализовать на D интерпретатор BrainFuck. Смотрим что получилось…
Сразу код всего приложения:
class brainfuckInterpreter { // лента ячеек BrainFuck'а private char[] _memory; // создаем экземпляр интерпретатора с количеством ячеек size this(uint size = 30_000) { _memory.length = size; _memory[] = 0; } // интерпретирование программы void interpret(string program) { // указатель на текущую ячейку памяти uint currentCell = 0; // счетчик скобок uint brackets = 0; // интерпретация программы for (uint i = 0; i < program.length; i++) { // на ячейку вперед if (program[i] == '>') currentCell++; // на ячейку назад if (program[i] == '<') currentCell--; // увеличить значение в текущей ячейке if (program[i] == '+') _memory[currentCell]++; // уменьшить значение в текущей ячейке if (program[i] == '-') _memory[currentCell]--; // вывод значения из текущей ячейки if (program[i] == '.') write(_memory[currentCell]); // ввод значения в текущую ячейку if (program[i] == ',') { char tmp; readf("%c", &tmp); _memory[currentCell] = tmp; } // если значение текущей ячейки ноль, перейти вперёд по тексту программы на ячейку, // следующую за соответствующей ] (с учётом вложенности) if (program[i] == '[') { if (!_memory[currentCell]) { ++brackets; while(brackets) { ++i; if (program[i] == '[') ++brackets; if (program[i] == ']') --brackets; } } else continue; } // если значение текущей ячейки не нуль, // перейти назад по тексту программы на символ [ (с учётом вложенности) else if (program[i] == ']') { if (!_memory[currentCell]) continue; else { if (program[i] == ']') brackets++; while (brackets) { --i; if (program[i] == '[') --brackets; if (program[i] == ']') ++brackets; } --i; } } } } }
Возьмем простейшую программу на BrainFuck, выводящую надпись «Hello World»:
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++ .>+.+++++++..+++.>++.<<+++++++++++++++.>.+++. ------.--------.>+.>.
И запустим интерпретатор:
import std.stdio; void main() { // интерпретатор с памятью на 5 ячеек brainfuckInterpreter bvm = new brainfuckInterpreter(5); // интерпретация программы 'Hello !world !' bvm.interpret("++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>."); }
Вот и все. Попробуйте сами, это весьма прикольно!