Создание интерпретатора BrainFuck на D

Создание интерпретатора BrainFuck на D

BrainFuck — это минималистичный язык программирования, созданный в 1993 году Урбаном Мюллером. Он состоит из всего восьми команд и использует машиноподобный синтаксис, что делает его отличным выбором для изучения создания интерпретаторов. В этой статье мы рассмотрим процесс создания интерпретатора для BrainFuck на языке D, включая описание структуры кода, классов, методов, а также пример программы, которая выводит «Hello World».

Структура кода

Интерпретатор BrainFuck будет состоять из нескольких основных частей:

  1. Чтение и хранение кода BrainFuck.
  2. Создание памяти и указателя данных.
  3. Реализация команд BrainFuck.
  4. Запуск интерпретатора.

Описание классов и методов

Для начала создадим класс BrainFuckInterpreter, который будет содержать всю логику интерпретатора.

import std.stdio;

class BrainFuckInterpreter {
    private string code;
    private int[] memory;
    private int pointer;
    private size_t codeIndex;

    this(string code) {
        this.code = code;
        this.memory = new int[30000]; // Инициализация памяти размером в 30,000 ячеек
        this.pointer = 0;
        this.codeIndex = 0;
    }

    void interpret() {
        while (codeIndex < code.length) {
            switch (code[codeIndex]) {
                case '>':
                    pointer++;
                    if (pointer >= memory.length) {
                        pointer = 0; // Зацикливание указателя
                    }
                    break;
                case '<':
                    pointer--;
                    if (pointer < 0) {
                        pointer = cast(int) memory.length - 1; // Зацикливание указателя с приведением типа
                    }
                    break;
                case '+':
                    memory[pointer]++;
                    break;
                case '-':
                    memory[pointer]--;
                    break;
                case '.':
                    writef("%c", cast(char) memory[pointer]);
                    break;
                case ',':
                    memory[pointer] = getchar();
                    break;
                case '[':
                    if (memory[pointer] == 0) {
                        int loops = 1;
                        while (loops > 0) {
                            codeIndex++;
                            if (code[codeIndex] == '[') loops++;
                            else if (code[codeIndex] == ']') loops--;
                        }
                    }
                    break;
                case ']':
                    if (memory[pointer] != 0) {
                        int loops = 1;
                        while (loops > 0) {
                            codeIndex--;
                            if (code[codeIndex] == '[') loops--;
                            else if (code[codeIndex] == ']') loops++;
                        }
                    }
                    break;
                default: break;
            }
            codeIndex++;
        }
    }
}

Пример программы «Hello World»

Теперь мы можем создать пример программы на BrainFuck, которая ывводит «Hello World»:

void main() {
    string helloWorld = "++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.";
    BrainFuckInterpreter interpreter = new BrainFuckInterpreter(helloWorld);
    interpreter.interpret();
}

Карпов Ярослав

Автор статьи:

Обновлено:

11.06.2024


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *