Компилятор qumirc
qumirc — компилятор языка Qumir. Преобразует исходный код в машинный код, ассемблер, LLVM IR или WebAssembly.
Использование
qumirc [опции] <входной_файл.kum>
Опции командной строки
| Опция | Описание |
|---|---|
-o FILE |
Имя выходного файла |
-c |
Только компиляция (без линковки) |
-S |
Генерировать ассемблер |
-O[0|1|2|3] |
Уровень оптимизации |
--ast |
Вывести AST в файл .ast |
--ir |
Вывести IR в файл .ir |
--llvm |
Вывести LLVM IR в файл .ll |
--wasm |
Компиляция в WebAssembly |
-v, --version |
Показать версию |
-h, --help |
Показать справку |
Режимы компиляции
Нативный исполняемый файл
По умолчанию компилятор создаёт исполняемый файл для текущей платформы:
qumirc программа.kum
./a.out
С указанием имени:
qumirc программа.kum -o программа
./программа
Объектный файл
qumirc -c программа.kum
# Создаёт программа.o
Ассемблер
qumirc -S программа.kum
# Создаёт программа.s
LLVM IR
qumirc --llvm программа.kum
# Создаёт программа.ll
Или с указанием имени:
qumirc --llvm -o output.ll программа.kum
WebAssembly
qumirc --wasm программа.kum -o программа.wasm
Требования: установленный wasm-ld (часть LLVM).
Уровни оптимизации
| Уровень | Описание |
|---|---|
-O0 |
Без оптимизаций (по умолчанию) |
-O1 |
Базовые оптимизации |
-O2 |
Стандартные оптимизации |
-O3 |
Агрессивные оптимизации |
Пример:
qumirc -O3 программа.kum -o программа_opt
Примеры
Компиляция простой программы
# Создаём файл hello.kum
cat > hello.kum << 'EOF'
алг
нач
вывод "Привет, мир!", нс
кон
EOF
# Компилируем
qumirc hello.kum -o hello
# Запускаем
./hello
Просмотр промежуточных представлений
# AST (абстрактное синтаксическое дерево)
qumirc --ast программа.kum
cat программа.ast
# IR (внутреннее представление)
qumirc --ir программа.kum
cat программа.ir
# LLVM IR
qumirc --llvm программа.kum
cat программа.ll
Компиляция для веба
qumirc --wasm программа.kum -o программа.wasm
Полученный .wasm файл можно использовать в браузере с JavaScript:
const bytes = await fetch('программа.wasm').then(r => r.arrayBuffer());
const { instance } = await WebAssembly.instantiate(bytes, imports);
instance.exports.main();
Оптимизированная сборка
# Максимальная оптимизация
qumirc -O3 benchmark.kum -o benchmark
# Сравнение размера
qumirc -O0 benchmark.kum -o benchmark_O0
qumirc -O3 benchmark.kum -o benchmark_O3
ls -la benchmark_O0 benchmark_O3
Выходные файлы
| Режим | Расширение | Описание |
|---|---|---|
| По умолчанию | a.out или указанное |
Исполняемый файл |
-c |
.o |
Объектный файл |
-S |
.s |
Ассемблер |
--llvm |
.ll |
LLVM IR (текст) |
--ir |
.ir |
Внутреннее IR |
--ast |
.ast |
AST (дерево разбора) |
--wasm |
.wasm |
WebAssembly модуль |
Коды возврата
| Код | Описание |
|---|---|
| 0 | Успешная компиляция |
| 1 | Ошибка компиляции |
Интеграция с другими инструментами
Использование объектных файлов
# Компиляция в объектный файл
qumirc -c модуль1.kum
qumirc -c модуль2.kum
# Линковка с помощью clang/gcc
clang модуль1.o модуль2.o -o программа
Просмотр ассемблера
qumirc -S -O3 программа.kum
less программа.s