В первой статье мы рассказывали про сферу, компилируемый язык, где всё построено на русском языке: ключевые слова, типы, стандартная библиотека. Компилятор написан на Rust и выдаёт машинный код через LLVM 18. С тех пор прошло несколько версий, и накопилось достаточно, чтобы рассказать отдельно. Сразу предупредим, что статья длинная: здесь и смена синтаксиса, и сборки под все платформы, и Android‑приложение с компилятором внутри, и сайт, который написан на сфере.
Репозиторий: github.com/nikitosklim/Sfera, лицензия MIT. Сайт с уроками и загрузками: языксфера.рф.

Что не давало покоя: русские слова и не русская пунктуация
Любой, кто пробовал писать на сфере, упирался в одно и то же. Слова русские, а скобки {}, стрелка ->, &&, <>, [] и $ приходилось набирать на английской раскладке. Язык, который заставлял писать код на двух раскладках сразу. Так быть не должно, поэтому пришлось менять привычные {} скобки на иной подход.
функция главная() -> целое { Список<целое> числа = Список<целое>(); числа.добавить(10); если (числа.получить(0) > 5 && !(числа.размер() == 0)) { вывести("ok"); } вернуть 0; }
Стало:
функция главная(): целое Список из целых числа = Список из целых(); числа.добавить(10); если (числа.получить(0) больше 5 и не (числа.размер() == 0)) вывести("ok"); конец вернуть 0; конец
Что именно поменялось:
Блок закрывается словом
конец. Открывающего слова нет: блок начинается сразу после заголовка. Цепочкаесли … иначе если … иначезакрывается однимконец.Тип возврата пишется после двоеточия, стрелка не нужна.
Обобщённые типы пишутся словами:
Список из целых,Словарь из текста и целого,результат из целого,канал из текста.Операторы словами:
и,или,не,меньше,больше,не меньше,не больше.Подстановка в строках:
"Сумма: %сумма%, вдвое: %(сумма * 2)%"вместо$имя.Побитовые операции стали функциями:
включить_биты(1, сдвинуть_влево(1, 4))даёт 17.
Если вы считаете что данное обновление может приносить дискомфорт или это не удобно, или же у вас есть предложения как можно сделать лучше, то пожалуйста оставьте свой коментарий под этой статьей. Будем вместе думать и вносить изменения, чтобы добится лучшего варианта!
Старая запись продолжает работать, даже в одном проекте. А для переезда есть конвертер:
запустить --в-русский файл.код # результат в стандартный вывод запустить --в-русский файл.код --на-месте # перезаписать файл
Он не заменяет текст регулярками. Конвертер разбирает программу настоящим парсером, запоминает, какие токены перевести, а после преобразования проверяет, что дерево программы не изменилось. Если проверка не прошла, файл остаётся как был. Так мы и перевели весь репозиторий: примеры, тесты, стандартную библиотеку, сайт и панель разработчика.
Цена у этого решения тоже есть:
Слова
конец,из,и,или,не,меньше,большетеперь зарезервированы. У меня в собственной панели нашлась переменная с именемви несколько с именеми, пришлось переименовывать.%имя%внутри любой строки теперь подстановка. Если нужен буквальный процент, пишется%%.Операторы
ииилине вычисляют правую часть лениво. Если вы привыкли писатьх != 0 && 10 / х > 1, здесь так делать нельзя, нужны вложенныеесли. Я наступил на это сам: программа падала там, где в другом языке всё было бы в порядке. Это в списке того, что надо исправить.Фраза «иначе если» превращается в цепочку только тогда, когда оба слова стоят на одной строке. Иначе парсер не отличит её от вложенного условия.
Если обобщённый тип вложен в другой и стоит не последним аргументом, пока остаются угловые скобки.
Один язык — пять платформ
Раньше «Сфера» жила у нас на MacBook или Windows. Теперь у каждой системы есть своя сборка:
Windows. Установщик и панель разработчика. Пришлось переписать сокеты на Winsock, переключать консоль в UTF-8 и подменять недостающие POSIX‑вызовы (
snprintf,clock_gettime, потоки). На Windows было потрачено больше времени, чем на что‑либо другое: подряд идёт десяток коммитов с названием «Fix» про линковку, LLVM‑символы и условную компиляцию.macOS. Отдельные сборки для Intel (собираемые у себя на MacBook) и Apple Silicon (собирается в GitHub Actions).
Linux. Панель и компилятор в архиве.
Android. Об этом отдельный рассказ ниже.

Линукс, Apple Silicon и Android собирает GitHub Actions: запуск вручную или при выпуске тега версии. Сборки для Intel Mac и Windows пока делаются скриптами. Дальше все файлы выкладываются на сайт, и рядом с каждым показана контрольная сумма SHA-256.
Компилятор внутри Android‑приложения
Это самое неожиданное, что получилось. Идея в том, чтобы писать и запускать код сферы на телефоне, без root, без Termux и без компьютера.

Устроено так. В APK лежит сам компилятор, собранный под ARM64, линковщик ld.lld и небольшая замена clang, которая нужна для линковки. Всё это приложение вызывает как обычные программы: компилирует код в объектный файл, линкует и запускает получившийся бинарник в собственной песочнице.
Пришлось решить несколько неприятных задач:
Откуда запускать бинарники. Android запрещает исполнять файлы из домашней папки приложения, начиная с API 29. Поэтому инструменты лежат в APK под видом библиотек
lib*.so: система сама распаковывает их в каталог, откуда запуск разрешён. А для собранных на телефоне программ приходится собирать приложение сtargetSdk 28. Из‑за этого в Google Play такое приложение не попадёт, поэтому распространяется оно через сайт.Целевая тройка. LLVM, который я собрал под Android, не знал нужную тройку, пришлось указывать её явно.
Путь к библиотекам. Приложение определяет каталог с библиотеками при первой подготовке и сохраняет его в файл. Сначала я вычислял его на лету, и фоновый запуск терял цепочку родительских процессов: пользователь видел сообщение «В этом APK нет компилятора», хотя компилятор там был.

Сама среда разработки тоже написана на сфере: редактор с подсветкой синтаксиса, файлы, справка, уроки и примеры внутри приложения, консоль с выводом. Графика идёт через SDL по FFI. Приложение подписывается постоянным ключом, значок и версия берутся из Cargo.toml.
Проверка на живом телефоне выглядит так: открываю многопоточность.код, нажимаю «Запустить», в консоли появляется «сборка, готово, запуск, 4, код выхода: 0». Программа компилируется и исполняется на устройстве.
функция главная(): целое канал из целого канал_результата = создать_канал(); параллельно целое вычислено = 2 + 2; канал_результата.отправить(вычислено); конец целое значение = канал_результата.получить(); вывести(целое_в_текст(значение)); вернуть 0; конец
Сайт, написанный на сфере

Сайт обязательно должен был быть написан на нашем языке программирования. Это хороший способ найти его слабые места: если чего‑то не хватает для настоящего сервера, это сразу видно.
Что внутри:
HTTP‑сервер из стандартной библиотеки: пул из 16 потоков, каждый принимает подключения с общего слушающего сокета. Загрузка большого файла занимает только один поток.
Раздача файлов с докачкой (
Range),ETagи ответами 304.Собственный разбор Markdown (модуль
разметка.код), оглавление и подсветка кода.Поиск по всем материалам: индекс отдаётся одним текстом, поиск делает страница.
Загрузка установщиков на сервер через
PUTпо токену прямо потоком в файл, для этого есть скриптupload-release.sh.Счётчик посещений, карта сайта,
robots.txt.
Маршрутизация выглядит так:
функция маршрутизировать(целое32 клиент, Запрос з): целое текст сегмент = первый_сегмент(з.путь); текст остаток = остаток_пути(з.путь); ... текст раздел = раздел_по_сегменту(сегмент); если (длина(раздел) больше 0) текст русский_раздел = раздел_в_адрес(раздел); если (длина(остаток) == 0) если (сегмент != русский_раздел) вернуть на_русский_адрес(клиент, з, "/" + русский_раздел); конец вернуть показать_каталог(клиент, раздел); конец ...
Домен у сайта тоже русский: языксфера.рф. Адреса страниц между прочем тоже на русском языке: /уроки/быстрый-старт, /документация/многопоточность, /загрузки, а служебные пути называются /статика и /загрузить. Старые латинские адреса, которые мы писали вначале разработки сайта, отвечают кодом 301 и перенаправляют на русские, так что ссылки не сломались.
Работает всё на обычном VPS: nginx с сертификатом Let's Encrypt проксирует запросы на сервер на «Сфере», который запущен как systemd‑служба. Релиз сайта собирает GitHub Actions, на сервере его разворачивает один скрипт.
На сайте сейчас 32 раздела документации, семь уроков (от первой программы до своего веб‑сервера), 11 примеров и поиск. Можете перейти и глянуть, я думаю это удобный способ просмотра того как устроен язык, всё разделено по разделам и также имеется поиск по словам, так что можно найти любую учебную информацию для справки, по тому как устроен язык. Обязательно перейдите на сайт и сами зацените, если есть пожелания, то пожалуйста напишите их в комментарии.
Что нашлось по нашему пути
Писать большой проект на своём языке полезно в основном из‑за ошибок, которые он вытаскивает наружу. Из недавних:
Проверка обязательного возврата из функций и методов работала неправильно. Бесконечный цикл
пока (да)теперь считается возвратом, а ошибочные срабатывания исправлены.Структуры с текстовыми полями копируют строку, поэтому нельзя хранить в них указатель на буфер, который может содержать нулевые байты: он обрезается. Для дескрипторов я использовал целые числа.
Через переменную, объявленную внутри цикла, на каждой итерации утекал стек. Это одна из самых неприятных ошибок за всё время: после полумиллиона итераций программа падала без единого предупреждения. Теперь все переменные размещаются в начале функции.
Подробный список найденных и исправленных use‑after‑free и double‑free есть в дневнике разработки в репозитории.
Чего ещё нет
Честно о слабых местах:
Язык молодой (версия 0.3.3), совместимость между версиями пока не гарантируется.
В отладчике нельзя посмотреть значение переменной по имени, а точки останова и шаги работают в обычных lldb и gdb.
Установщик для Windows не подписан, система покажет предупреждение.
Операторы
ииилине ленивые, об этом выше.Сообщества почти нет: нужна заинтересованность людей в нашем проекте.
Что дальше
Пакетный индекс для менеджера пакетов
сфера_пакеты.Значения переменных в отладчике.
Ленивые
ииили.Подписанные установщики и автоматическая сборка для Windows.
Больше уроков и примеров, раздел с проектами сообщества на сайте.

Скачайте сборку для своей системы на языксфера.рф/загрузки. Для каждой системы там есть короткая инструкция.
Пройдите быстрый старт, это около десяти минут.
Или соберите из исходников:
cargo build --release(нужен LLVM 18).
Если попробуете и что‑то сломается, напишите в issues. Такая обратная связь для нашего проекте ценнее всего! А если проект кажется полезным, его можно поддержать или же рассказать о нём знакомым.
Комментарии (52)

Dimsml
02.11.2026 11:03Список из текстов
Как-то не вяжется с:
для каждого имя

rodial
02.11.2026 11:03Список из текстов = string[]
для каждого = foreach
Но это не отменяет того что выглядит это ... странно, не могу найти смайлик "глаза вытекли"

Dimsml
02.11.2026 11:03для каждого = foreach
Для каждого окно среди окна? Или для каждого окна среди окон? Как отличить в данном случае окно от окон? В английском window и windows это окно и список окон соответственно. В русском языке окна и (кусок) окна это разные сущности.
Скрытый текст
Вопрос с подвохом, если что. Английский потому и работает настолько хорошо как основа для языков высокого уровня, т.к. он аналитический и изолирующий.
Не нужно сильно заморачиваться с токенизацией и вычленением смысла из этого, т.к. язык уже зависит от того какие слова и в каком порядке пишут (аналитический) и не блещет производством новых слов методом добавь суффикс и измени окончание, получи новое значение (изолирующий.)
Вы же понимаете что когда вы определяете метод findById(), то это звучит как определяем метод "найти_по_идентифкатору()", а когда вы вызываете метод findById() у объекта, то это фактически повелительное наклонение, адресованное объекту, т.е. "найди_по_идентифкатору()"?
А теперь представьте как это должно выглядеть в компиляторе для языка, основанного на русском языке.
Это не формальный язык, а какой-то великий секретный слог для гуру, где один из пятидесяти знает как написать так, чтобы оно не упало ещё на моменте лексикосемантического анализа.

Int_13h
02.11.2026 11:03Ошибся с падежом - получил ошибку компиляции.
Вообще, учитывая некую грамматическую сложность русского литературного по сравнению с английским, использовать его витееватый слог для программирования - это либо получить 1ц или формулы из русского пакета экселя, либо одно из двух.
интересна кстати мнемоника команд импортозамещенного ассемблера, ненуачо?
ДОБ / ВЫЧ
ДОБП / ВЫЧЗ
СРВ
ЗАГР
СРВН
ПРЫГ / ПРЫГН / ПРЫГБ / ПРЫГБР
СДВЛ / СДВП
ОТР
УМ / УВ
ЗАС / ВЫС

aol-nnov
02.11.2026 11:03СДВЛ / СДВП / СДВГ
ПРЫГБ / ПРЫГБР / АБЫРВАЛГЗАС / ВЫС - засунуть и высунуть, простите? )) какой интересный у вас асс…емблер, однако

Ndochp
02.11.2026 11:03Нормально вяжется. [основное] Имя переменной - существительное в именительном падеже. Можно было бы и
для каждого имя гостянаписать. Все равно склонять никто не будет.

aegoroff
02.11.2026 11:03а в чем ценность языка с русскими ключевыми словами? просто "шоб" было? импортозамещение на максималках?

Ndochp
02.11.2026 11:03Ну с учетом сайтов в качестве примера - наверное писать русскоязычные сайты без переключения раскладки в течение дня.

Savvva
02.11.2026 11:03100% ценность - например в обучении детей
да и просто чайнику побаловаться
zum
02.11.2026 11:03в обучении детей
А чему дети должны научиться, используя данный ЯП? И чему они не научатся, если будут использовать, я не знаю, ДРАКОН, например?
чайнику побаловаться
«Чайник» может побаловаться и с LLM, как мне кажется.

Ivan_shev
02.11.2026 11:03Обучить их компьютерной логики, пусть вначале увидят как выглядит компьютерная логика, а потом можно и выбрать английский язык и яп. Детей обучают программированию и в маинкрафте так-то, но там язык вообще отличается от яп

Miller777
02.11.2026 11:03В мое время учили на basic. Незнание языка препятствием мне было, в basic ключевых слов меньше, чем в словаре Эллочки-людоедки.
Кому надо - выучились. Кто не выучился, тем не надо.
А вот это вот - я правда не понимаю, зачем. Потом переучиваться на нормальный синтаксис?
Впрочем, вы не первый. Есть, например, 1С.
Как хобби, как "патамушта могу" - да.
Но детям-то за что?

Vydra77
02.11.2026 11:03Мы учились на паскале, проблем вообше не было. Дети довольно легко схватывают любые правила игры, для этого не нужно городить новую рапиру.

Rubiorif
02.11.2026 11:03Автор прямым текстом пишет про свой интерес к компиляторам. Человек просто захотел разобраться в LLVM и сделал это) Но если так подумать, то для школьников младших классов такой язык отлично подойдет в качестве первого шага в программирование

StrausZloy
02.11.2026 11:03Есть уже Scratch. Самое главное что эти дети должны усвоить - это необходимость учить английский, а с предлагаемым подходом они и программирование возненавидят, потому что все равно столкнутся с этой необходимостью в будущем. Вы ведь не думаете, что русский язык в программировании кому то нужен?

eugenk
02.11.2026 11:03Не подойдёт. Во всех существующих языках ключевые слова почти одинаковы. И их не так уж много, пара десятков. Если школьник в состоянии усвоить понятие цикла или подпрограммы, то уж выучить пару десятков общепринятых ключевых слов, сможет и подавно. Это лучше чем потом мучительно переучиваться. Идентификаторы и сообщения компилятора на русском - да, имело бы смысл. Но ключевые слова на русском это безусловный вред.

Dr_Faksov
02.11.2026 11:03Ещё один "недостаток" русского языка по сравнению с английским - более длинные слова.
Сравните "делать" и "do", "если" и "if". Вроде мелочь но когда кода много...

artrades
02.11.2026 11:03Есть с чем сравнить.
Мы живём в мире, где всё делится и умножается на 10. Однако есть страны с нестандартными единицами измерения. Футы и фунты могут с ума всех свести. А ещё они таблицу Менделеева придумали не как у Менделеева (зачем?). Я удивлён, что у них доллар - это не 72 цента, - ведь такое было бы в их стиле.
А вот их достижения говорят сами за себя. Парадокс! Эдакая научно-технологическая контрадекватность их не останавливает.
На этом фоне «делать» и «do», «если» и «if» - незначительный лингвистический нюанс...

Voknemilk Автор
02.11.2026 11:03Это не замена существующим языкам, а интересный эксперимент. Хотелось писать целиком на русском. На сфере можно написать программы под большинство ОС, свой сайт, а на телефоне код можно писать и запускать без компьютера. То есть большой простор для экспериментов. Если для вас это не решает проблему, это нормально, язык не для всех. Но если решает, буду рад, что попробуете.

Vydra77
02.11.2026 11:03Тем более, что язык ключевых слов – это наименьшая проблема в программировании из всех возможных. Даже неудобный стул как-то весомее.

gudvinr
02.11.2026 11:03Обязательно нужна поддержка падежей, склонений и прочих норм русского языка
Без этого получается такой же "русскоязычный" ЯП, как си с #define

Voknemilk Автор
02.11.2026 11:03Абсолютно согласен, в этом направлении будем и дальше работать. Компилятор будет принимать разные падежные формы (текст, текста, текстов), чтобы ошибка в окончании не ломала сборку. Конечно задача сложная и большая, но стремится есть куда. Спасибо, что заметили.

hssergey
02.11.2026 11:03Если у вас есть отступы и нет зарезервированного слова для начала блока, то почему бы не сделать как в питоне, что блок отделяется отступами?

Ndochp
02.11.2026 11:03Отступы зло. Мое чувство прекрасного обычно не совпадает с отступами когда начинаются многострочные конструкции в рамках одного выражения. Явные скобки лучше. Здесь явная скобка получается из
Если (условие) текст блока из любого числа строк; конец

Rubiorif
02.11.2026 11:03Питоновские отступы постоянно ломаются при копировании кусков кода с форумов, явные маркеры конца блока как-то понадежнее будут)

Voknemilk Автор
02.11.2026 11:03Был выбран вариант со словом
конецкак раз из-за того, о чём написали Ndochp и Rubiorif, отступы теряются при копировании с форумов и в чатах. Скобки тоже можно, старый синтаксис остаётся рабочим, и есть конвертер между записями. Но принципиальная цель в том, чтобы всё набиралось на русской раскладке.

ZamirHa
02.11.2026 11:03А чего бы вместо языческого "=" не писать "равно"?
Вообще избавиться от всех этих "+", "-", "/", "*" и т.п. Так будет еще прикольнее. Почти чистый русский язык.
А вместо з.путь - путь из з.
Будем уж последовательны))))))
Еще скобки заменить...
Но прикиньте, как будет клево-то!
функция маршрутизировать открываем целое32 клиент дальше Запрос з закрываем возвращаем целое
текст сегмент равно первый_сегмент открываем путь из з закрываем сброс
текст остаток равно остаток_пути открываем путь из з закрываем сброс
Песня!

technomancer
02.11.2026 11:03Непременно нужна обработка ошибок с применением "поелику".

Miller777
02.11.2026 11:03А логи тоже будут такие? Стектрейсы всякие?

technomancer
02.11.2026 11:03Давайте говорить на родном языке правильно. Росписи. Родословия претыканий.

iliasm
02.11.2026 11:03тут у ребят поинтереснее получилось: https://yopta.space/

eugenk
02.11.2026 11:03Чоткий ты пацан, братэло ! Респект за сцыль !
Тут на хабре статья про него была. Давно правда, но думаю найти ещё можно.

deema35
02.11.2026 11:03А зачем это нужно? В синтаксисе языка используется буквально три слова, все это учится за пару минут даже если человек никогда не знал Английский язык. Это ведь не Шекспира в оригинале читать.

Nuflyn
02.11.2026 11:03Недостаточно исконно
Ꙗть сїѥ 0;
повторъ {
коль Ꙗть болѣѥ 5 {
Молвить("{}", Ꙗть);
коль Ꙗть болѣѥ {выходъ};
Ꙗть прибавь сїѥ 1;
}

classx
02.11.2026 11:03я не понимаю какую проблему это решает? извините - но кроме распила ничего в голову не приходит

Rubiorif
02.11.2026 11:03Все равно непривычно читать код с русскими ключевыми словами вроде "Список из целых" , глаз постоянно спотыкается о такие длинные конструкции

ArtyomOchkin
02.11.2026 11:03Выглядит неплохо, но если бы я занимался его разработкой, первое, что поменял бы - заменил "конец на фигурные скобки { } как для циклов, так и для функций. Меньше писать и быстрее писать.

Voknemilk Автор
02.11.2026 11:03Конечно это привычней использовать {} но есть проблема в русской расскладке. Таких символов в ней нет...(

artrades
02.11.2026 11:03Есть способ добавить символы в раскладку и не один.
https://habr.com/ru/articles/1100914/

1024rk
02.11.2026 11:03Повторю не единожды сказанное: грамматика русского языка не подходит для языков программирования. Вообще. Совсем. Никак. Ни в каком формате. Это не будет удобно. Не будет читаемо. Никогда. Ни при каких ухищрениях. У этого языка не будет комьюнити, потому что писать на этом в здравом уме никто не будет. Закопайте стюардессу, не гневите бога.

Terverus
02.11.2026 11:03Я так понимаю, американская нейросеть вырвалась на свободу и ругается на кириллицу, брысь.

eugenk
02.11.2026 11:03Да почему не подходит-то ! Всё прекрасно подходит. Другое дело что смысла в этом ноль. А вообще язык по виду(в стремлении быть похожим на естественный) напомнил cobol. Как мы помним, забылся он довольно быстро.

asoneofus
02.11.2026 11:03Учебный был язык в школах. В 80х. Если то иначе всё, алгол?
ЧЕго велосипед изобретать? ИнтерТрепатор и компилятор, вроде, был.

Voknemilk Автор
02.11.2026 11:03Спасибо за комментарий. Про Кумир и ИнтерТрепатор знаю, это отличные учебные проекты. Сфера от них отличается тем, что генерирует нативный код через LLVM и умеет работать как обычный язык общего назначения.

eugenk
02.11.2026 11:03В целом труд автора могу только приветствовать. Разобраться в LLVM и написать работающий компилятор это безусловно круто и автор молодец. Но практически... Идентификаторы на русском это полезно и понятно. Сообщения компилятора на русском - тоже полезно и понятно. Но КЛЮЧЕВЫЕ СЛОВА... Их не так уж много, можно и запомнить. и они почти одинаковы во всех языках программирования. Если проект предназначен для обучения детей, зачем же их сразу подсаживать на русскоязычные ключевые слова, нигде более не применяемые ??? Если для программистов - русскоязычные ключевые слова будут резать им глаз. В качестве фичи проекта куда полезней был бы работающий лингвистический сервер и плагин для vscode.
P.S. И да, если автор всё-таки хочет чтобы программа на русском выглядела почти естественно, по-моему лучше обратить внимание на Forth. Тут на хабре есть блог ему посвященный. Там возможны например такие определения
: маневр танк башня 60 градусов повернуть ;

redballtoy
02.11.2026 11:03А зачем нам эти англицизмы, предлагаю и знаки заменить, скобка открыть, скобка закрыть, плюс, минус, взять в кавычки. Ляпота!
Raly
спорили, что лучше:
{},begin/endили отступы. Сфера: конец. Всё. Дискуссия окончена.