Skip to content

ez4gotit/RusC

Repository files navigation

RusLang

RusLang — самый русский и суверенный язык программирования.

Автор и основатель проекта — ez4gotit.

Это не перевод английского языка и не русифицированная оболочка над привычным синтаксисом. RusLang изначально мыслит по-русски: зависимости здесь призывают, программой правит Царь, значения есть, сравнение бывает точно, а компилятор получает команды собрать, запустить и проверить. В исходном коде не нужны английские ключевые слова, служебные скобки и запятые.

Суверенность RusLang означает контроль над языком, его синтаксисом, форматом исполняемых файлов и способом распространения. Один автономный rusc.exe превращает .rus в самостоятельный .exe: пользователю и разработчику программ на RusLang не требуется отдельно устанавливать .NET, runtime, DLL или другие компоненты.

Проект развивается как русская системная альтернатива C++. Текущий backend использует .NET 10 и Roslyn, но это деталь реализации компилятора, а не источник синтаксиса или пользовательского интерфейса языка.

Текущий MVP поддерживает Windows x64 (win-x64) и консольные приложения.

Почему RusLang суверенный

  • язык проектируется на русском, а не локализуется после создания;
  • исходный код, команды компилятора и диагностика используют русский язык;
  • компилятор распространяется одним самодостаточным файлом;
  • созданные программы также являются самодостаточными;
  • сборка детерминирована и не исполняет пользовательский код;
  • формат 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

Стандартные возможности RusLang доступны сразу и не требуют лишних призывов. призвать предназначено для будущих внешних дружин. Точкой входа может служить Князь, Царь или Государь.

Князь
    наречь числа суть строй 3 да 1 да 2
    ступай место от 0 до мера числа
        молви числа на месте место
    аминь
аминь

Полное описание команд, выражений, встроенных функций и ограничений находится в справочнике языка. Рабочая пузырьковая сортировка: examples/sort.rus.

Объектная модель описана в справочнике ООП. Рабочий пример: examples/oop.rus.

Visual Studio Code

Официальное расширение находится в 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 <команда> [аргументы]

собрать

Создаёт автономный исполняемый файл:

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 право

Использование сторонних DLL

Управляемая зависимость передаётся явно:

rusc собрать .\application.rus `
    --ссылка .\libs\Library.dll `
    --ссылка .\libs\Library.Dependency.dll

DLL используется как Roslyn metadata reference и включается в RusPack как ManagedAssembly. Компилятор не загружает её через reflection и не выполняет код из неё.

На текущем этапе транзитивные зависимости нужно перечислять явно. Нативные DLL и P/Invoke пока не поддерживаются.

RuntimeHost template

Обычный 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:

  1. получает собственный путь через Environment.ProcessPath;
  2. читает фиксированный footer с конца executable;
  3. проверяет CRC, версии, offsets, limits и SHA-256;
  4. читает и валидирует manifest;
  5. распаковывает и проверяет управляемые entries;
  6. загружает entry assembly через отдельный AssemblyLoadContext;
  7. вызывает Assembly.EntryPoint;
  8. передаёт аргументы и возвращает код завершения программы.

Поддерживаются точки входа 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.

About

No description, website, or topics provided.

Resources

License

Stars

1 star

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors