Rye
- title
- Rye
- type
- entity
- summary
- Гомоиконичный язык общего назначения на чистом Go для встраивания как слой конфигурации с регистрацией прав для каждого слова
- tags
- language, go, embedded-scripting, homoiconic
- language
- Go
- created
- 2026-05-11
- updated
- 2026-05-11
- lang
- ru
- translation_of
- rye-lang
- source_updated
- 2026-05-11
- translated
- 2026-09-01
- translator
- lllm/antigravity/gemini-3.7-flash-medium
Rye - язык общего назначения, написанный на чистом Go (без CGO), который разрабатывается организацией refaktor. Он распространяется и как отдельный интерпретатор, и как библиотека Go, которую можно импортировать для встраивания в собственное приложение. Сайт проекта - ryelang.org, а канонический блог - ryelang-blog.
Необычное проектное решение: в Rye нет зарезервированных конструкций. В вычислителе нет зашитых if, fn, loop или арифметики. Каждое активное слово - это функция уровня библиотеки. Базовый вычислитель умеет лишь загружать исходный текст в блоки значений Rye и связывать значения со словами (различные типы слов - set-words, mod-words - являются частью синтаксиса). Всё остальное добавляется регистрацией builtin'ов.
Именно это позволяет подходу whitelist-capability-config работать. Когда вы встраиваете Rye в приложение на Go, автор конфигурации начинает с пустого набора возможностей, а вы через RegisterBuiltinsFilter пошагово определяете, что ему разрешено делать.
Типы слов и особенности синтаксиса
В Rye есть несколько разновидностей слов, несущих смысл непосредственно в синтаксисе:
name:- set-word, связывает значение с именем (по умолчанию const)name::- mod-word, повторно связывает существующее имяName- с заглавной буквы, обобщённая диспетчеризация методов_+,_*- префикс с подчёркиванием обозначает "op-word", вызов в операторном стиле- Ограничители блока
{ ... }создают блок значений,( ... )группирует выражения
Язык нечувствителен к пробельным символам, но требует пробелов между каждым токеном, в том числе вокруг скобок. Пример конфигурации из статьи визуально напоминает YAML, но вычисляется как код.
API для встраивания
На стороне Go используются три пакета:
import (
"github.com/refaktor/rye/env"
"github.com/refaktor/rye/evaldo"
"github.com/refaktor/rye/loader"
)
ps := env.NewProgramState()
blk := loader.LoadString(raw, false, ps)
// type-check blk for env.Error, then:
evaldo.EvalBlock(ps, blk.(env.Block))
// inspect ps.Ctx for bound names, ps.Res for the last result
Регистрация возможностей состоит из двух функций:
evaldo.RegisterBuiltinsFilter(ps, []string{"if", "_+", "any"})- белый список из пула встроенных функцийps.RegisterBuiltin(name, arity, doc, fn)- добавление собственной функции Go в качестве слова Rye
Ограничения на выполнение задаются в состоянии программы: ps.MaxCallDepth, ps.MaxOps. Ноль по умолчанию означает отсутствие ограничений.
Интерактивный REPL
enter-console - регистрируемый builtin, который переключает работающий процесс Go в REPL Rye с заполненным текущим контекстом вычисления. Оттуда можно посмотреть список привязок (lc), проинспектировать значения (probe) или переопределить их с помощью mod-words. По Ctrl-c хост-процесс продолжает выполнение с изменённым контекстом. Это удобно для отладки конфигурации при разработке; в production такую регистрацию убирают.
Сравнение со Starlark
Оба языка спроектированы для встраивания. Starlark более зрелый, синтаксически похож на Python и масштабно используется в Bazel, Buck и аналогичных инструментах. Различия, которые выделяет автор Rye:
- Starlark предоставляет
if,for,defбезусловно - их нельзя отобрать - Модули Starlark в основном подключаются по принципу "всё или ничего"
- Rye позволяет дать доступ к
_+без_*, а кif- безloop - Rye стремится быть языком общего назначения, тогда как Starlark намеренно остаётся DSL для конфигураций
Статус и ограничения
Автор называет Rye "языком в процессе разработки", а в заключении ryelang-whitelist-config прямо говорится: "это управление возможностями, исследование, а не песочница безопасности или то, что стоит брать в работу прямо сейчас". Код на Rye выполняется внутри вашего процесса; небезопасные builtin'ы сразу дают эскалацию. Интерес представляет сам паттерн проектирования, а не заявление о готовности к production.
Репозиторий: github.com/refaktor/rye. Чистый Go, без зависимостей от CGO. Лицензия в репозитории.
Связанные страницы
- ryelang-whitelist-config - статья, объясняющая паттерн регистрации возможностей
- whitelist-capability-config - общая концепция
- ryelang-blog - страница блога для отслеживания будущих статей