О проекте Qumir
История создания
Изначально я начал писать свой собственный язык программирования с нуля. Однако в процессе работы стало ясно, что проект далёк от завершения и требует значительных усилий на проектирование синтаксиса и семантики языка.
Осознав это, я решил взять уже готовый, компактный и хорошо проработанный синтаксис КуМир и адаптировать его для своей уже готовой инфраструктуры компилятора. Так родился Qumir — современная реализация учебного алгоритмического языка на базе собственной компиляторной инфраструктуры.
Философия проекта
Данный сайт я делал прежде всего для себя, чтобы можно было быстро тестировать программы и отлаживать компилятор. Поэтому сайт содержит режим разработчика с выводом внутреннего представления компилятора (AST, IR, LLVM IR).
Некоммерческий характер
Сайт принципиально некоммерческий. Здесь нет, не было и не будет рекламы. Проект развивается исключительно энтузиазмом автора и открытым сообществом.
Приоритеты разработки
Я прежде всего реализую корректную и полную реализацию языка КуМир. Цель — создать работающую альтернативу оригинальной системе КуМир, которая будет:
- Совместима с учебными материалами и задачами
- Работать в любом современном браузере без установки
- Иметь открытый исходный код
Качество и тестирование
Каждый коммит автоматически прогоняется через набор регрессионных тестов в GitHub Actions. При этом тестируется:
- Сам язык и его корректность
- JavaScript runtime для исполнителей (Черепаха, Робот, Чертёжник)
- Корректность компиляции в WebAssembly
- Совместимость с Node.js окружением
Тесты включают проверку вывода программ, корректности работы алгоритмов, обработки ошибок и других аспектов языка.
Архитектура и технологии
Проект написан полностью на языке C++ с использованием современных возможностей C++23.
Лексический анализ
Лексер написан вручную — это имплементированный руками конечный автомат. Такой подход даёт полный контроль над обработкой ошибок и производительностью.
Синтаксический анализ
Парсер классический рекурсивный нисходящий, написанный вручную без использования генераторов (yacc/bison/ANTLR). Это позволяет:
- Выдавать качественные сообщения об ошибках
- Полностью контролировать построение AST
- Легко расширять синтаксис языка
Промежуточное представление
После построения AST (абстрактного синтаксического дерева) строится промежуточное представление (IR). Из IR может генерироваться:
- Собственный байткод для виртуальной машины (интерпретатор)
- LLVM IR, из которого генерируется:
- Машинный код для различных платформ (x86-64, ARM, etc.)
- WebAssembly для выполнения в браузере
Оптимизации
Компилятор выполняет несколько проходов оптимизации:
- Построение SSA-формы (Static Single Assignment)
- Свёртка констант (constant folding)
- Анализ потока управления (control flow analysis)
- Дополнительные оптимизации через LLVM
Веб-сервер
Сервис, обслуживающий веб-API для компиляции и других операций, также написан на C++ с использованием моего легковесного фреймворка coroio.
Coroio — это современный асинхронный сетевой фреймворк на C++, использующий корутины (C++20) для написания высокопроизводительного серверного кода. Это позволяет:
- Обрабатывать тысячи одновременных подключений
- Писать асинхронный код в синхронном стиле (без callback hell)
- Иметь минимальные накладные расходы
- Использовать единую кодовую базу на C++ для всего проекта
Ссылки на coroio:
- Сайт: coroio.dev
- GitHub: github.com/resetius/coroio
Исполнение в браузере
Веб-версия работает по следующей схеме:
- Сервер компилирует исходный код КуМир в WebAssembly
- Клиент (браузер) получает скомпилированный WebAssembly модуль и исполняет его локально
Таким образом, выполнение программ происходит исключительно в браузере пользователя. Это сделано намеренно по двум причинам:
1. Снижение нагрузки на сервер
Серверу нужно только скомпилировать код в WebAssembly — это быстрая операция. Само выполнение программы, которое может занимать много времени и ресурсов, происходит на стороне клиента. Это позволяет масштабировать сервис без дополнительных затрат на вычислительные ресурсы.
2. Безопасность
На сервере не исполняется пользовательский код, поэтому не надо решать задачи изоляции и безопасности:
- Нет риска выполнения вредоносного кода на сервере
- Не нужны контейнеры или виртуальные машины для изоляции
- Нет проблем с квотами на ресурсы (CPU, память)
- Пользователи не могут навредить друг другу
Каждый пользователь работает в песочнице своего браузера, что обеспечивает естественную изоляцию.
Уникальность
На текущий момент это единственная работающая реализация языка КуМир онлайн в браузере.[^1]
Файловый ввод-вывод в браузере
Qumir — единственная онлайн реализация КуМир с поддержкой файлового ввода/вывода в браузере!
В отличие от других онлайн-сред программирования, где файлы либо не поддерживаются, либо требуют загрузки/скачивания, Qumir предоставляет встроенный файловый менеджер прямо в интерфейсе браузера. Вы можете:
- Создавать файлы вручную через специальную вкладку
- Открывать файлы на чтение/запись/добавление из программы
- Просматривать и редактировать файлы в реальном времени
- Скачивать файлы на диск
Файлы сохраняются в localStorage браузера и доступны для всех программ в рамках проекта. Это делает возможным полноценную работу с файловым вводом-выводом без установки какого-либо ПО.
Подробнее см. Работа с файлами.
[^1]: Если вы знаете другую полнофункциональную реализацию, дайте мне знать в гостевой книге на GitHub. Учтите, что реализация должна проходить все регрессионные тесты Qumir для сравнения.
Открытый исходный код
Проект полностью открыт и доступен на GitHub:
- Репозиторий: github.com/resetius/qumir
- Лицензия: BSD-2-Clause
- Разработка: публичная, все коммиты видны в истории
Вы можете:
- Изучать исходный код
- Предлагать улучшения через Pull Request
- Сообщать об ошибках через Issues
- Форкнуть проект для своих нужд