Компилятор языка Brainfuck в нативный код для Linux x86-64 и ARM64 (AArch64), написанный на Go.
Данный проект транслирует исходный код на Brainfuck напрямую в ассемблер, после чего собирает и компонует его в исполняемый ELF-файл. Компиляция происходит в три этапа:
- Токенизация — исходный код разбивается на токены.
- Генерация кода — по токенам генерируется ассемблерный код (
out.s). Целевая архитектура определяется автоматически по архитектуре хоста (runtime.GOARCH). - Сборка и компоновка — ассемблер собирает
.sв объектный файл,ldкомпонует его со стандартной библиотекой (bfstd-<arch>.a) в исполняемый файл.
| Команда | Описание |
|---|---|
> |
Переместить указатель данных вправо |
< |
Переместить указатель данных влево |
+ |
Увеличить значение текущей ячейки на 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 |
Проект использует предварительно собранные статические библиотеки под целевую архитектуру. Выбор библиотеки происходит автоматически на этапе компоновки в зависимости от архитектуры хоста. Библиотеки предоставляют следующие рантайм-функции:
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 был сгенерирован при помощи ИИ. Больше нигде в проекте ИИ для генерации чего-либо использован не был.