第 1 章 はじめに

1.1 背景

Fay エコシステムには、端末とホストの差異を遮蔽し、同じ Fay 成果物がデスクトップ・サーバー・ブラウザ・組み込みホスト上で一貫して動作するための実行基盤が必要です。その基盤が Fayger です。

既存の体系との対比:

  • Java バイトコードに対する JVM と同じ役割を、BuF に対して Fayger が果たします。
  • コンテナイメージに対する Docker / OCI Runtime と同じ役割を、BuF に対して Fayger が果たします。

Fayger は Fay 自体の意味論をどう書き表すかは規定せず、Fay 成果物がどのように読み込まれ、検証され、スケジュールされ、実行されるか、そしてホストとどのように互いに汚染しないかだけを規定します。

1.2 位置付け

Fayger は 仮想実行環境(Virtual Runtime Environment) です:

  • BuF(Built-up Fay) と呼ばれるパッケージ実体を入力として受け取ります。
  • BuF の読み取り、構造検証、バージョン交渉、署名検証、ロードを完了します。
  • 複数の言語実装からなるランタイム層のいずれかで BuF を解釈実行します。
  • アダプタ層を通じて、実行中に生じた「汎用命令」を対象端末のシステム機能に翻訳します。

ユーザー視点での体験は、BuF を Fayger に渡せば動く、というものです。

1.3 設計原則

Fayger 第一フェーズの設計は次の優先順位に従います:

  1. 可搬性最優先。BuF は一度コンパイルすれば、適合済みのどのホストでも実行できます。ランタイム層とアダプタ層は安定した Universal_Instruction で疎結合化されます。
  2. 多言語実装。ランタイム層は言語非依存の Runtime_Interface を公開し、Rust / Go / TypeScript などの実装が共存・置換可能です。単一言語エコシステムへ縛られません。
  3. 証明可能な正しさ。BuF の解析・直列化はラウンドトリップ等価性を満たし、ライフサイクル状態機械は遷移合法性を満たし、クロスプラットフォーム動作は系列等価性を満たします。これらはプロパティベーステスト(PBT)で検証可能な形で表現されます。
  4. 既定で安全・観測可能。既定で安全(強制署名モードを切替可能)、既定で静か(デバッグイベントは既定オフ)、エラーは構造化(統一エラーモデル + 発生層タグ + 原因チェーン)。

1.4 三層構造の概観

Fayger は体系的に三層に分割されます:

  • ロード層(Loader Layer):BuF と外界の境界。読み取り、書き込み、検証、バージョン交渉を担当します。
  • ランタイム層(Runtime Layer):BuF 意味論の実行者。複数の言語実装をサポートし、統一インターフェイス契約で交換可能です。
  • アダプタ層(Adapter Layer):ホストと Fayger の境界。汎用命令とシステム呼び出しの双方向翻訳を担当します。

各層は明確な対外契約と内部分担を持ちます。詳細は次章で扱います。

1.5 既存体系との対応

既存体系Fayger の対応物
JVM ClassLoader → Verifier → ExecutionEngineLoader Layer → Runtime Layer
JVM class file(magic / version / constant pool)BuF 成果物(Header / Manifest / Sections / Trailer)
OCI Image Manifest + LayersBuF_Manifest + Sections
OCI Runtime SpecRuntime_Interface
containerd と runcRuntime_Layer のオーケストレーションと Runtime_Implementation の実行
WASI capability-based securityAdapter_Layer のケーパビリティ削減
JNI / extism host functionsUniversal_Instruction の host カテゴリ

1.6 用語集

  • Fayger:本ブループリントで定義する仮想実行環境。
  • BuF(Built-up Fay):Fay の配布可能・ロード可能な実体。Fayger の入力単位。
  • BuF_Manifest:BuF 内部のメタデータ目録(バージョン、エントリ、依存、ケーパビリティ、クォータ、署名など)。
  • Loader_Layer / Runtime_Layer / Adapter_Layer:Fayger の三層。
  • Runtime_Interface:ランタイム層の対外安定契約。
  • Runtime_Implementation:ランタイム層の具体的な言語実装。
  • Platform_Adapter:アダプタ層における特定の端末 / OS 向けアダプタ。
  • Universal_Instruction:ランタイム層とアダプタ層の間で交わされるプラットフォーム非依存命令。
  • BuF_Instance:ランタイム層にロードされ、実行可能または実行中の BuF ランタイム実体。
  • Lifecycle_State:BuF_Instance のライフサイクル状態。
  • Host_Environment:Fayger が実際に動作する端末・OS・ホストアプリプロセス。
  • BuF_Source:BuF の格納バックエンド抽象(ローカルファイル、ネットワーク、オブジェクトストレージ、ユーザー定義バックエンド)。最低限ランダムアクセス読み出しを公開します。
  • LoadProfile:呼び出し側がロード時に提供する実行環境プロファイル。Section 選択を駆動し、対象端末カテゴリ、ケーパビリティ集合、サイズ上限、ランタイム特性ビットなどを最低限含みます。
  • SectionVisibility:Section の可視性レベル。Required(欠落で失敗)または Optional(欠落で縮退)。
  • LoadStrategy:ロード層の取得戦略。Eager(選択された全 Section を一括取得)または Lazy(先頭とインデックスのみ読み、本体は初回アクセス時に取得)。

1.7 ブループリント構成

以降の章は次の順で展開します:

  • 第 2 章 全体アーキテクチャ
  • 第 3 章 ロード層
  • 第 4 章 ランタイム層
  • 第 5 章 アダプタ層
  • 第 6 章 エラーと可観測性
  • 第 7 章 セキュリティモデル
  • 第 8 章 ロードマップ