ргз по матлогике. Федеральное государственное
Скачать 348.29 Kb.
|
МИНОБРНАУКИ РОССИИ Федеральное государственное бюджетное образовательное учреждение высшего образования «Белгородский государственныйТехнологический университет им. В.Г.Шухова» (БГТУ им. В.Г. Шухова) Кафедрапрограммногообеспечения вычислительнойтехникии автоматизированных систем Дисциплина: математическая логика и теория алгоритмов РГЗ “Интерпретатор языка Brainfuck”Выполнил: ст. группы ПВ-211 Ковалев Дмитрий Сергеевич Проверил: Куценко Д.А. Белгород, 2022 г. Создание интерпретатора языка Brainfuck на языке С Задачи: Изучение синтаксиса языка Brainfuck. Реализация интерпретатора языка Brainfuck на языке С. Подбор тестовых данных для проверки работы программы. Описание предметной области Интерпрета́тор — программа, выполняющая интерпретацию. Интерпрета́ция — построчный анализ, обработка и выполнение исходного кода программы или запроса. Brainfuck — один из известнейших эзотерических языков программирования, отличающийся особым минимализмом. Состоит из восьми команд, каждая из которых записывается одним символом. Brainfuck был создан в 1993 году Урбаном Мюллером (Urban Müller), и авторская реализация остается фактическим стандартом языка. Его базовая спецификация достаточно проста, и он не был стандартизирован. Существует ряд любительских реализаций, ни одна из которых не представляет коммерческой ценности. Brainfuck породил множество диалектов, отличающихся набором команд, способом их записи или деталями реализации, например, максимальным значением числа, хранящегося в ячейке, или ситуациями, вызывающими ошибку интерпретации. Brainfuck был изобретен при попытке создать Тьюринг-полный язык программирования с наименьшим возможным компилятором. Авторский компилятор имел размер 240 байт, а более поздние реализации достигают менее 200 байт. Теоретически Brainfuck действительно обладает свойством Тьюринг-полноты и следовательно, может выполнить любую задачу. На практике, впрочем, этот язык совершенно непригоден для решения задач из реальной жизни; выполнение даже простейших заданий становится вызовом для разработчика. Поэтому Brainfuck используется исключительно как математическая модель или для развлечения. Brainfuck использует модель машины, напоминающую машину Тьюринга и состоящую из следующих элементов: программа — последовательность односимвольных команд языка и, возможно, других символов (при обработке игнорируются); указатель инструкций — указывает на команду, которая будет исполнена на следующем шагу, после ее исполнения передвигается на другую (обычно следующую справа) команду; память — моделируется одномерным массивом ячеек, в каждой ячейке хранится один байт; начальное значение ячейки — ноль; указатель данных — указывает на текущую ячейку памяти; начальное значение — самая левая ячейка массива; по команде двигается либо изменяет значение, хранящееся в текущей ячейке; потоки ввода и вывода — последовательности байтов в кодировке ASCII. Главная идея – манипулирование памятью. Вам выдается 30.000 массив 1 байтовых блоков, хотя на самом деле размер массива зависит от компилятора или интерпретатора, но стандартный размер - 30.000. Внутри этого массива вы можете увеличивать указатель, значение в ячейке и так далее. Для работы, как я уже говорил, используется 8 операторов: > - увеличение указателя памяти или смещение право на 1 блок < - уменьшение или смещение влево на 1 блок + - увеличение значения в ячейке памяти, на которую ссылается указатель - - соответственно уменьшение на единиц [ - начало цикла, который выполняется пока текущая ячейка не ноль. ] - если значение в ячейке на которую указывает указатель не равно нулю, то переход на [ , - аналог getchar(), ввод одного символа . - аналог putchar(), вывод одного символа на консоль Спецификация функции BrainfuckInter Заголовок: BrainfuckInter(char*ptr,char*tier) Назначение: Выполняет команды языка Brainfuck, записанные в строке по указателю ptr.tier – количество скобок. #include #include #include #define N 30000 void BrainfuckInter (char* ptr, char* tier){ int loop = 0; while (*ptr) { switch (*ptr) { case '>': ++tier; break; case '<': --tier; break; case '+': ++ * tier; break; case '-': -- * tier; break; case '.': putchar(*tier); break; case ',': *tier = getchar(); break; case '[': if (!*tier) { loop = 1; while (loop) { ptr++; if (*ptr == '[') loop++; if (*ptr == ']') loop--; } } break; case ']': loop = 1; while (loop) { ptr--; if (*ptr == '[') loop--; if (*ptr == ']') loop++; } ptr--; break; }; ptr++; } printf("\n"); } int main() { SetConsoleOutputCP(CP_UTF8); char BrCode[N]; char ReadyCode[N]; char* tier = ReadyCode; printf("Введите код на Brainfuck\n"); gets(BrCode); char* ptr = BrCode; BrainfuckInter(ptr, tier); return 0; } Пример выполнения заданий на языке Brainfuck: Рис. 1 пример вывода английского алфавита в обратном порядке Рис. 2 пример вывода английского алфавита строчный и прописной Рис. 3 пример вывода «Hello world» Вывод: изучил интерпретатор языка Brainfuck, реализовал его на языке C (Си), проверил несколько решений задач для языка Brainfuck. |