Глава 1. Введение
1.1 Контекст
Экосистеме Fay нужна основа исполнения, которая скрывает различия между терминалами и хостами и позволяет одному и тому же артефакту Fay согласованно работать на настольных компьютерах, серверах, в браузерах и встраиваемых хостах. Эта основа — Fayger.
По аналогии:
- Чем JVM является для Java-байткода, тем Fayger является для BuF.
- Чем Docker / OCI Runtime является для образов контейнеров, тем Fayger является для BuF.
Fayger не предписывает, как пишется семантика самого Fay. Он предписывает только то, как Fay-артефакт загружается, проверяется, планируется и исполняется и как он остаётся изолированным от хоста.
1.2 Позиционирование
Fayger — это виртуальная среда исполнения (Virtual Runtime Environment):
- Принимает как вход упакованную сущность под названием BuF (Built-up Fay).
- Выполняет чтение, проверку структуры, согласование версий, проверку подписи и загрузку.
- Запускает BuF в режиме интерпретации в одной из языковых реализаций исполняющего слоя.
- Через слой адаптации переводит «универсальные инструкции», возникающие во время исполнения, в системные возможности целевого терминала.
С точки зрения пользователя: передаёшь BuF в Fayger, и Fayger его запускает.
1.3 Принципы проектирования
Первая фаза проектируется по таким приоритетам:
- Сначала переносимость. BuF компилируется один раз и работает на любом адаптированном хосте. Слои исполнения и адаптации развязаны через стабильную Universal_Instruction.
- Многоязычные реализации. Слой исполнения выставляет языконезависимый Runtime_Interface, что позволяет реализациям на Rust, Go, TypeScript и других языках сосуществовать и заменяться без привязки к одной экосистеме.
- Доказуемая корректность. Парсинг и сериализация BuF удовлетворяют эквивалентности «туда-обратно»; конечный автомат жизненного цикла удовлетворяет свойствам легальных переходов; поведение между платформами удовлетворяет эквивалентности последовательностей. Эти свойства сформулированы так, чтобы их можно было проверять property-based-тестированием (PBT).
- Безопасность и наблюдаемость по умолчанию. Безопасные значения по умолчанию (доступен режим обязательной подписи), тихие значения по умолчанию (отладочные события выключены) и структурированные ошибки (единая модель с тегом исходного слоя и цепочкой причин).
1.4 Обзор трёх слоёв
Fayger вертикально разделён на три слоя:
- Loader Layer. Граница между BuF и внешним миром. Отвечает за чтение, запись, проверку и согласование версий.
- Runtime Layer. Исполнитель семантики BuF. Поддерживает несколько языковых реализаций, взаимозаменяемых через единый контракт.
- Adapter Layer. Граница между Fayger и хостом. Отвечает за двунаправленный перевод между универсальными инструкциями и системными вызовами.
У каждого слоя — чёткий внешний контракт и внутреннее распределение ролей. Подробности — в следующей главе.
1.5 Сопоставление с существующими системами
| Существующая система | Соответствие в Fayger |
|---|---|
| JVM ClassLoader → Verifier → ExecutionEngine | Loader Layer → Runtime Layer |
| Class file JVM (magic / version / constant pool) | Артефакт BuF (Header / Manifest / Sections / Trailer) |
| OCI Image Manifest + Layers | BuF_Manifest + Sections |
| OCI Runtime Spec | Runtime_Interface |
| containerd vs runc | Оркестрация Runtime_Layer vs исполнение Runtime_Implementation |
| WASI capability-based security | Усечение возможностей в Adapter_Layer |
| JNI / extism host functions | Категория host в Universal_Instruction |
1.6 Глоссарий
- Fayger. Виртуальная среда исполнения, определяемая этим планом.
- BuF (Built-up Fay). Распространяемая и загружаемая сущность Fay. Единица входа Fayger.
- BuF_Manifest. Каталог метаданных внутри BuF (версии, точка входа, зависимости, capabilities, квоты, подпись и т. д.).
- Loader_Layer / Runtime_Layer / Adapter_Layer. Три слоя Fayger.
- Runtime_Interface. Стабильный внешний контракт исполняющего слоя.
- Runtime_Implementation. Конкретная языковая реализация исполняющего слоя.
- Platform_Adapter. Адаптер для одной терминали / ОС в слое адаптации.
- Universal_Instruction. Платформонезависимая инструкция между исполняющим слоем и слоем адаптации.
- BuF_Instance. Сущность BuF, загруженная в исполняющий слой, исполняемая или исполняющаяся.
- Lifecycle_State. Состояние жизненного цикла BuF_Instance.
- Host_Environment. Терминаль, ОС или хост-приложение, где Fayger фактически работает.
- BuF_Source. Абстракция бэкенда хранения BuF (локальный файл, сеть, объектное хранилище, пользовательский бэкенд). Минимально предоставляет чтение со случайным доступом.
- LoadProfile. Профиль среды исполнения, передаваемый вызывающей стороной при загрузке. Управляет выбором Sections. Включает как минимум класс терминали, набор capabilities, ограничения по размеру и биты функций времени исполнения.
- SectionVisibility. Уровень видимости Section:
Required(отсутствие → отказ) илиOptional(отсутствие → деградация). - LoadStrategy. Стратегия загрузки:
Eager(читает все выбранные Sections заранее) илиLazy(читает только заголовок + индекс; тела Sections подгружаются при первом обращении).
1.7 Структура плана
Последующие главы — в таком порядке:
- Глава 2. Общая архитектура
- Глава 3. Слой загрузки
- Глава 4. Слой исполнения
- Глава 5. Слой адаптации
- Глава 6. Ошибки и наблюдаемость
- Глава 7. Модель безопасности
- Глава 8. Дорожная карта
