EnglishРусский Map

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. Лицензия в репозитории.

Связанные страницы

Sub-pages