«Сфера»: русскоязычный язык программирования с компилятором для Android

«Сфера» — экспериментальный язык программирования, в котором на русском языке записаны ключевые слова, типы и элементы стандартной библиотеки. Компилятор проекта написан на Rust и генерирует машинный код через LLVM 18. После нескольких обновлений автор представил новый синтаксис, поддержку пяти платформ и Android-приложение со встроенным компилятором.
Синтаксис без второй раскладки
Главной причиной переработки стала неоднозначная особенность прежнего синтаксиса: несмотря на русские слова, разработчику приходилось постоянно переключаться на английскую раскладку ради фигурных и угловых скобок, стрелок, квадратных скобок и логических операторов. В новой записи блоки закрываются словом «конец», тип возвращаемого значения указывается после двоеточия, а стрелка больше не используется.
Обобщённые типы теперь записываются словами: например, «Список из целых», «Словарь из текста и целого» или «канал из текста». Логические и сравнительные операции также получили русские названия — «и», «или», «не», «меньше», «больше», «не меньше» и «не больше». Для подстановки значений в строки применяются конструкции вроде «%имя%», а побитовые операции оформлены как функции.
Старая форма записи сохраняет работоспособность, в том числе в проектах, где смешаны оба варианта синтаксиса. Для переноса кода предусмотрен конвертер. Он анализирует программу полноценным парсером, переводит нужные токены и затем проверяет, что структура программы не изменилась. Если проверка не проходит, исходный файл не перезаписывается.
У нового подхода есть ограничения. Слова «конец», «из», «и», «или», «не», «меньше» и «больше» стали зарезервированными, а знак процента внутри строк используется для подстановки — буквальный символ нужно экранировать. Кроме того, операции «и» и «или» пока не вычисляют правую часть лениво. Это означает, что привычная проверка с защитой от деления на ноль в одну строку может привести к ошибке. В некоторых сложных обобщённых типах угловые скобки также пока сохраняются.
Сборки для пяти платформ
Проект выпускает версии для Windows, macOS, Linux и Android, а для macOS доступны отдельные варианты под Intel и Apple Silicon. Windows потребовала наибольшего объёма доработок: автору пришлось адаптировать сетевой код под Winsock, настроить UTF-8 в консоли и заменить отсутствующие POSIX-вызовы. Сборки для Linux, Apple Silicon и Android создаются в GitHub Actions, а готовые файлы публикуются вместе с контрольными суммами SHA-256.
Компилятор на Android
Android-приложение позволяет писать и запускать программы на «Сфере» непосредственно на телефоне — без root, Termux и компьютера. В APK находятся компилятор под ARM64, линковщик ld.lld и небольшая замена clang. Приложение компилирует исходный код в объектный файл, выполняет линковку и запускает итоговую программу в собственной песочнице.
При разработке пришлось учитывать ограничения Android. Начиная с API 29 система запрещает запускать исполняемые файлы из домашнего каталога приложения, поэтому инструменты хранятся в APK в виде библиотек lib*.so: операционная система распаковывает их в каталог, откуда запуск разрешён. Для программ, собранных непосредственно на телефоне, используется targetSdk 28, из-за чего приложение распространяется через сайт проекта, а не через Google Play.
Среда разработки для Android тоже написана на «Сфере». В неё входят редактор с подсветкой синтаксиса, работа с файлами, справочные материалы, уроки, примеры и консоль. Графический интерфейс подключается через SDL по FFI. На практике пользователь может открыть исходник, нажать кнопку запуска и получить на телефоне полный цикл сборки и выполнения программы.
Сайт на собственном языке
Сайт проекта стал испытанием языка в реальной задаче и также написан на «Сфере». В нём используется HTTP-сервер из стандартной библиотеки с пулом из 16 потоков, поддержкой докачки файлов через Range, ETag и ответов 304. Отдельные модули отвечают за разбор Markdown, оглавление, подсветку кода и поиск по материалам.
Сервер также умеет принимать релизы потоковой загрузкой, формирует карту сайта и robots.txt, считает посещения и поддерживает русскоязычные адреса страниц. Проект работает на обычном VPS: nginx с сертификатом Let's Encrypt проксирует запросы к серверу на «Сфере», запущенному как systemd-служба. На сайте опубликованы 32 раздела документации, семь уроков и 11 примеров.
Ошибки, обнаруженные в процессе
Разработка крупного проекта на собственном языке помогла выявить проблемы компилятора и среды выполнения. Исправлена проверка обязательного возврата из функций: бесконечный цикл, который гарантированно не завершается, теперь корректно учитывается анализатором. Также устранена утечка стека, возникавшая при объявлении переменных внутри циклов: после сотен тысяч итераций программа могла завершиться с ошибкой.
В ходе работы исправлялись случаи use-after-free и double-free. Отдельное ограничение связано со строковыми полями структур: строки копируются таким образом, что буферы с нулевыми байтами могут обрезаться. Поэтому для некоторых дескрипторов пришлось использовать целочисленные значения.
Текущее состояние и планы
«Сфера» находится на ранней стадии развития: актуальная версия проекта — 0.3.3, а совместимость между версиями пока не гарантируется. В отладчике ещё нельзя просматривать значение переменной по имени, неподписанный установщик Windows вызывает системное предупреждение, а сообщество проекта остаётся небольшим.
В ближайших планах — пакетный индекс для менеджера пакетов «сфера_пакеты», просмотр значений переменных в отладчике, ленивое вычисление логических операций, подписанные установщики и автоматическая сборка для Windows. Автор также собирается расширить набор уроков и примеров и добавить на сайт раздел с проектами сообщества. Исходный код распространяется под лицензией MIT, а собрать компилятор самостоятельно можно с помощью Cargo при наличии LLVM 18.


