RusLang — самый русский и суверенный язык программирования.
Автор и основатель проекта — ez4gotit.
Это не перевод английского языка и не русифицированная оболочка над привычным
синтаксисом. RusLang изначально мыслит по-русски: зависимости здесь
призывают, программой правит Царь, значения есть, сравнение бывает
точно, а компилятор получает команды собрать, запустить и проверить.
В исходном коде не нужны английские ключевые слова, служебные скобки и запятые.
Суверенность RusLang означает контроль над языком, его синтаксисом, форматом
исполняемых файлов и способом распространения. Один автономный rusc.exe
превращает .rus в самостоятельный .exe: пользователю и разработчику
программ на RusLang не требуется отдельно устанавливать .NET, runtime, DLL или
другие компоненты.
Проект развивается как русская системная альтернатива C++. Текущий backend использует .NET 10 и Roslyn, но это деталь реализации компилятора, а не источник синтаксиса или пользовательского интерфейса языка.
Текущий MVP поддерживает Windows x64 (win-x64) и консольные приложения.
- язык проектируется на русском, а не локализуется после создания;
- исходный код, команды компилятора и диагностика используют русский язык;
- компилятор распространяется одним самодостаточным файлом;
- созданные программы также являются самодостаточными;
- сборка детерминирована и не исполняет пользовательский код;
- формат RusPack и RuntimeHost находятся внутри открытого репозитория;
- архитектура допускает замену backend без изменения сущности языка.
- компиляция
.rusв C# и далее в управляемую сборку через Roslyn; - компиляция полностью в памяти, без запуска
csc, MSBuild или пользовательского кода; - автономный single-file компилятор
rusc.exe; - встроенные reference assemblies .NET 10 и RuntimeHost;
- контейнер RusPack v1 с CRC-32, SHA-256 и Brotli;
- запуск сборки непосредственно из памяти;
- команды
собрать,запустить,раскрыть,осмотреть,проверить,здравие,версияиправо; - кириллица в исходных файлах, именах и выводе;
- объектные
роды, наследование, сокрытие, зачины, умения и порождение объектов; - детерминированная компиляция;
- тесты формата, упаковщика, компилятора и RuntimeHost.
Для сборки самого проекта требуется:
- Windows x64;
- PowerShell 7 или Windows PowerShell;
- .NET SDK 10.0.300.
Из корня репозитория выполните:
.\eng\build.ps1Скрипт последовательно восстанавливает зависимости, собирает solution, запускает тесты и публикует RuntimeHost и автономный компилятор.
Готовый компилятор появится здесь:
artifacts/rusc/win-x64/rusc.exe
Скомпилируйте пример:
.\artifacts\rusc\win-x64\rusc.exe собрать .\examples\hello.rus
.\examples\hello.exeОжидаемый вывод:
Привет из RusLang
После публикации rusc.exe можно перенести на другую Windows x64 машину. Для его
работы не нужны .NET SDK и .NET Runtime.
Для разработки программ на RusLang также достаточно одного rusc.exe: и сам
компилятор, и созданные им .exe полностью самодостаточны. .NET SDK требуется
только участникам, которые пересобирают компилятор RusLang из исходного кода.
Стандартные возможности RusLang доступны сразу и не требуют лишних призывов.
призвать предназначено для будущих внешних дружин. Точкой входа может служить
Князь, Царь или Государь.
Князь
наречь числа суть строй 3 да 1 да 2
ступай место от 0 до мера числа
молви числа на месте место
аминь
аминь
Полное описание команд, выражений, встроенных функций и ограничений находится
в справочнике языка. Рабочая пузырьковая сортировка:
examples/sort.rus.
Объектная модель описана в справочнике ООП. Рабочий пример:
examples/oop.rus.
Официальное расширение находится в editors/vscode. Оно
добавляет:
- подсветку современного, древнерусского и объектного синтаксиса;
- автоотступы, сворачивание блоков и комментарии через
#; - сниппеты для программ, циклов, родов, зачинов и умений;
- дерево родов, черт и умений в Outline;
- диагностику
ruscв панели Problems; - команды сборки, запуска, раскрытия C# и проверки EXE.
Установка готового VSIX:
code --install-extension .\editors\vscode\ruslang-0.1.0.vsixРасширение автоматически ищет компилятор в
artifacts/rusc/win-x64/rusc.exe. Другой путь задаётся настройкой
ruslang.compilerPath.
Для пересборки пакета расширения:
cd .\editors\vscode
npm run check
npx @vscode/vsce package --no-dependenciesОбщий формат:
rusc <команда> [аргументы]
Создаёт автономный исполняемый файл:
rusc собрать <файл.rus> [параметры]Примеры:
rusc собрать .\hello.rus
rusc собрать .\hello.rus --выход .\out\hello
rusc собрать .\hello.rus --режим отладка --перезаписать
rusc собрать .\application.rus --ссылка .\Library.dllПоддерживаемые параметры:
| Параметр | Назначение |
|---|---|
-в, --выход <путь> |
Путь выходного файла |
-ц, --цель <rid> |
Целевой RID; в MVP доступен win-x64 |
-р, --режим <отладка|выпуск> |
Режим компиляции |
--ссылка <путь> |
Добавить управляемую DLL; параметр можно повторять |
--основа <путь> |
Использовать указанную основу RuntimeHost |
--без-сжатия |
Отключить Brotli-сжатие содержимого |
--сохранить-отладку |
Сохранить portable PDB в отладочной сборке |
--раскрыть-код |
Записать сгенерированный .generated.cs |
--повторяемо |
Явно запросить детерминированную сборку |
--подробно |
Зарезервирован для расширенной диагностики |
--перезаписать |
Разрешить замену существующего результата |
Если --выход не задан, файл создаётся рядом с исходником и получает имя
исходного файла. Для Windows расширение .exe добавляется автоматически.
Существующий результат не перезаписывается без --перезаписать. Запись выполняется через
временный файл, затем контейнер повторно открывается и полностью проверяется.
Только после успешной проверки временный файл атомарно становится output.
Компилирует программу во временный каталог, запускает её и возвращает её код завершения:
rusc запустить .\hello.rus
rusc запустить .\args.rus --режим отладка -- первый второй "третье значение"Аргументы после -- передаются пользовательской программе.
Показывает C#, сгенерированный из .rus, но не компилирует и не запускает его:
rusc раскрыть .\hello.rusКоманда полезна при разработке frontend и диагностике source mapping.
Показывает manifest и entries готового RusPack-файла:
rusc осмотреть .\hello.exeосмотреть не загружает и не выполняет пользовательскую сборку.
Проверяет footer, CRC-32, границы, manifest, SHA-256 payload и каждой entry, а также корректность Brotli:
rusc проверить .\hello.exeУспешный результат:
ИСПРАВЕН: C:\полный\путь\hello.exe
Показывает параметры установленного компилятора:
rusc здравиеВ вывод входят версии компилятора и языка, TFM, RID, версия RusPack, протокол RuntimeHost и количество встроенных reference assemblies.
rusc версия
rusc --версияПоказывает автора, лицензию компилятора и свободы программ пользователя:
rusc правоУправляемая зависимость передаётся явно:
rusc собрать .\application.rus `
--ссылка .\libs\Library.dll `
--ссылка .\libs\Library.Dependency.dllDLL используется как Roslyn metadata reference и включается в RusPack как
ManagedAssembly. Компилятор не загружает её через reflection и не выполняет код
из неё.
На текущем этапе транзитивные зависимости нужно перечислять явно. Нативные DLL и P/Invoke пока не поддерживаются.
Обычный rusc.exe содержит host template для своего RID и автоматически извлекает
его в безопасный временный кэш:
%TEMP%\RusLang\host-templates\
Для разработки можно переопределить template параметром:
rusc собрать .\hello.rus --основа .\RuntimeHost.exeили переменной окружения:
$env:RUSLANG_HOST_TEMPLATE = 'C:\path\RuntimeHost.exe'
rusc собрать .\hello.rusОбычным пользователям задавать template не требуется.
Полная автоматическая сборка:
.\eng\build.ps1 -Configuration Release -Rid win-x64Отдельные этапы:
dotnet restore .\RusLang.slnx
dotnet build .\RusLang.slnx -c Release --no-restore
dotnet test .\RusLang.slnx -c Release --no-build
dotnet publish .\src\RusLang.RuntimeHost\RusLang.RuntimeHost.csproj `
-c Release -r win-x64 --self-contained true `
-o .\artifacts\host-templates\win-x64
dotnet publish .\src\RusLang.Cli\RusLang.Cli.csproj `
-c Release -r win-x64 --self-contained true `
-o .\artifacts\rusc\win-x64Важно: сначала публикуется RuntimeHost, затем rusc. При публикации компилятора
готовый host template встраивается в rusc.exe.
Проверка форматирования:
dotnet format .\RusLang.slnx --verify-no-changes --no-restoreОсновные каталоги:
artifacts/
├── host-templates/
│ └── win-x64/
│ └── RusLang.RuntimeHost.exe
├── rusc/
│ └── win-x64/
│ └── rusc.exe
└── test-output/
artifacts не входит в Git.
program.rus
↓
RusLang frontend
↓
C# + source mapping
↓
Roslyn Emit в память
↓
Program.dll + optional portable PDB
↓
RusPackWriter
↓
[self-contained RuntimeHost][entries][manifest][footer]
↓
один executable
При запуске RuntimeHost:
- получает собственный путь через
Environment.ProcessPath; - читает фиксированный footer с конца executable;
- проверяет CRC, версии, offsets, limits и SHA-256;
- читает и валидирует manifest;
- распаковывает и проверяет управляемые entries;
- загружает entry assembly через отдельный
AssemblyLoadContext; - вызывает
Assembly.EntryPoint; - передаёт аргументы и возвращает код завершения программы.
Поддерживаются точки входа void, int, Task и Task<int> с параметром
string[] args или без него.
src/
├── RusLang.Compiler/ # frontend и Roslyn compilation
├── RusLang.Pack.Format/ # модели, footer, manifest, reader
├── RusLang.Pack.Writer/ # атомарная упаковка executable
├── RusLang.RuntimeHost/ # проверка, загрузка и запуск
└── RusLang.Cli/ # команды rusc
tests/
├── RusLang.Compiler.Tests/
├── RusLang.Pack.Format.Tests/
├── RusLang.Pack.Writer.Tests/
└── RusLang.RuntimeHost.Tests/
docs/ # архитектура, формат и модель безопасности
eng/build.ps1 # release pipeline для локальной сборки
examples/hello.rus # минимальный пример
Tasks.md # полный roadmap проекта
Во время rusc собрать:
- пользовательский код не выполняется;
- пользовательские DLL не загружаются через reflection;
- не запускаются analyzers, source generators, MSBuild и NuGet scripts;
- не создаются дочерние процессы
dotnet,cscили shell; - manifest и offsets считаются недоверенными;
- проверяются переполнения, пересечения, размеры и пути entries;
- managed DLL не извлекаются рядом с executable.
SHA-256 обнаруживает повреждение, но не подтверждает происхождение файла. Authenticode должен применяться только после завершения упаковки.
Ошибки frontend имеют коды RUS1xxx, CLI — RUSC1xxx, среды компиляции —
RUSC2xxx, формата — RUSP1xxx, RuntimeHost — RUSH1xxx.
Пример:
C:\project\bad.rus(2,1): error RUS1001: Неизвестная конструкция: ...
Неизвестные ошибки Roslyn сохраняют исходный код CSxxxx.
Для трассировки загрузки сборок RuntimeHost установите:
$env:RUSLANG_HOST_TRACE = '1'
.\program.exe- официально проверен только
win-x64; - поддерживаются только консольные приложения;
- frontend языка пока содержит минимальный набор конструкций;
- нативные зависимости и P/Invoke не поддерживаются;
- транзитивные managed dependencies указываются вручную;
- resources и Release PDB ещё не завершены;
- Linux, macOS, ARM64, signing и notarization находятся в roadmap;
- проверка на чистой VM без .NET должна выполняться перед релизом.
Полный план развития и критерии готовности находятся в Tasks.md.
docs/architecture.md— архитектура;docs/adr/0001-runtime-host-and-appended-payload.md— архитектурное решение;docs/ruspack-format-v1.md— формат RusPack v1;docs/runtime-host.md— RuntimeHost;docs/security-model.md— модель безопасности;docs/reproducible-builds.md— воспроизводимые сборки;docs/language-reference.md— полный справочник синтаксиса языка;docs/oop.md— роды, наследование, сокрытие и полиморфизм;docs/releasing.md— выпуск автономного компилятора;docs/spikes/appended-payload.md— результаты Windows spike.
RusLang распространяется по модели AGPL-3.0-or-later с RusLang Output Exception 1.0:
- форки и изменения разрешены при сохранении авторства
ez4gotit; - изменённый форк обязан оставаться открытым и не выдавать себя за официальный;
- закрытый сетевой сервис на изменённом компиляторе также должен предоставить соответствующий исходный код;
- программы, написанные на RusLang, и созданные
.exeпринадлежат их авторам и могут быть закрытыми, коммерческими и распространяться под любой лицензией.
Полные условия находятся в LICENSE, сведения об авторстве — в
NOTICE.