Глава 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 Принципы проектирования

Первая фаза проектируется по таким приоритетам:

  1. Сначала переносимость. BuF компилируется один раз и работает на любом адаптированном хосте. Слои исполнения и адаптации развязаны через стабильную Universal_Instruction.
  2. Многоязычные реализации. Слой исполнения выставляет языконезависимый Runtime_Interface, что позволяет реализациям на Rust, Go, TypeScript и других языках сосуществовать и заменяться без привязки к одной экосистеме.
  3. Доказуемая корректность. Парсинг и сериализация BuF удовлетворяют эквивалентности «туда-обратно»; конечный автомат жизненного цикла удовлетворяет свойствам легальных переходов; поведение между платформами удовлетворяет эквивалентности последовательностей. Эти свойства сформулированы так, чтобы их можно было проверять property-based-тестированием (PBT).
  4. Безопасность и наблюдаемость по умолчанию. Безопасные значения по умолчанию (доступен режим обязательной подписи), тихие значения по умолчанию (отладочные события выключены) и структурированные ошибки (единая модель с тегом исходного слоя и цепочкой причин).

1.4 Обзор трёх слоёв

Fayger вертикально разделён на три слоя:

  • Loader Layer. Граница между BuF и внешним миром. Отвечает за чтение, запись, проверку и согласование версий.
  • Runtime Layer. Исполнитель семантики BuF. Поддерживает несколько языковых реализаций, взаимозаменяемых через единый контракт.
  • Adapter Layer. Граница между Fayger и хостом. Отвечает за двунаправленный перевод между универсальными инструкциями и системными вызовами.

У каждого слоя — чёткий внешний контракт и внутреннее распределение ролей. Подробности — в следующей главе.

1.5 Сопоставление с существующими системами

Существующая системаСоответствие в Fayger
JVM ClassLoader → Verifier → ExecutionEngineLoader Layer → Runtime Layer
Class file JVM (magic / version / constant pool)Артефакт BuF (Header / Manifest / Sections / Trailer)
OCI Image Manifest + LayersBuF_Manifest + Sections
OCI Runtime SpecRuntime_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. Дорожная карта