Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

52 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Brainfuck Compiler

Компилятор языка Brainfuck в нативный код для Linux x86-64 и ARM64 (AArch64), написанный на Go.

Описание

Данный проект транслирует исходный код на Brainfuck напрямую в ассемблер, после чего собирает и компонует его в исполняемый ELF-файл. Компиляция происходит в три этапа:

  1. Токенизация — исходный код разбивается на токены.
  2. Генерация кода — по токенам генерируется ассемблерный код (out.s). Целевая архитектура определяется автоматически по архитектуре хоста (runtime.GOARCH).
  3. Сборка и компоновка — ассемблер собирает .s в объектный файл, ld компонует его со стандартной библиотекой (bfstd-<arch>.a) в исполняемый файл.

Поддерживаемые команды Brainfuck

Команда Описание
> Переместить указатель данных вправо
< Переместить указатель данных влево
+ Увеличить значение текущей ячейки на 1
- Уменьшить значение текущей ячейки на 1
. Вывести значение текущей ячейки как ASCII-символ
D Расширение: вывести значение текущей ячейки как число (отладка)
[ Начало цикла: если текущая ячейка равна 0, перейти к ]
] Конец цикла: вернуться к соответствующей [

Примечание: стандартная команда , (ввод) пока что не реализована.

Использование

brainfuck [--оptions] <input> [-o output]

Аргументы

Аргумент Описание
<input> Путь к исходному файлу Brainfuck (обязательный)
-o <file> Имя выходного исполняемого файла (по умолчанию: a.out)
-S Только компиляция (генерация .s-файла, без ассемблирования и компоновки)
-c Компиляция и ассемблирование (до .o-файла, без компоновки)

Примеры

# Скомпилировать и запустить
brainfuck hello.bf -o hello
./hello

# Только сгенерировать ассемблерный код
brainfuck hello.bf -S

# Скомпилировать до объектного файла
brainfuck hello.bf -c

Зависимости

Сборки

  • Go 1.26+
  • x86-64: NASM — ассемблер для x86-64
  • ARM64: GAS (GNU Assembler, as) — входит в состав binutils
  • ld — компоновщик GNU

Библиотеки

  • go-arg — парсинг аргументов командной строки

Сборка

go build -o brainfuck

Структура проекта

Файл Назначение
main.go Точка входа: чтение файла, вызов токенизатора и кодогенератора, запуск ассемблера и компоновщика
tokenizer.go Токенизатор: разбивает исходный код на токены
tokenizer_test.go Тесты токенизатора
codegen.go Генератор кода: превращает токены в ассемблерный код (NASM для x86-64, GAS для ARM64)
bfstd-x86_64.a Статическая библиотека с рантайм-функциями для x86-64
bfstd-arm64.a Статическая библиотека с рантайм-функциями для ARM64

Статические библиотеки (bfstd-x86_64.a / bfstd-arm64.a)

Проект использует предварительно собранные статические библиотеки под целевую архитектуру. Выбор библиотеки происходит автоматически на этапе компоновки в зависимости от архитектуры хоста. Библиотеки предоставляют следующие рантайм-функции:

  • vector_init — инициализация вектора (ленты памяти)
  • read_cell — чтение значения текущей ячейки
  • next_cell / prev_cell — перемещение по ленте
  • add_cell / sub_cell — инкремент/декремент ячейки
  • print_cell — вывод ячейки как ASCII-символ
  • print_cell_num — вывод ячейки как числа (отладка)

Поддерживаемые архитектуры

Архитектура Ассемблер Статическая библиотека Динамический компоновщик
x86-64 (amd64) NASM (nasm -felf64) bfstd-x86_64.a /lib64/ld-linux-x86-64.so.2
ARM64 (AArch64) GAS (as) bfstd-arm64.a /lib/ld-linux-aarch64.so.1

Архитектура определяется автоматически во время компиляции через runtime.GOARCH — никаких дополнительных флагов или переменных окружения не требуется.

Благодарности

Большое спасибо Чайке, который добавил поддержку генерации кода ARM64 и скомпилировал std для этой архитектуры

Важно

Данный README.md был сгенерирован при помощи ИИ. Больше нигде в проекте ИИ для генерации чего-либо использован не был.

About

BrainFuck compiler writen in Golang

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages