# NyKernel と Plugins — 最小ランタイムとプラグイン体系(Phase 15.5) Status: Proposed (受け口のみ; 既定OFF) ADR: docs/development/adr/adr-001-no-corebox-everything-is-plugin.md ## 目的 - Kernel を最小化(箱を持たない)し、機能はすべて Plugin で提供する。 - VM/LLVM 双方から同一 ABI(`ny_new_box` / `ny_call_method`)で箱を扱う。 ## 起動シーケンス(標準形) 1) NyKernel init(GC/Handle/TLV/Extern/PluginRegistry) 2) nyash.toml 読み込み - `plugins.bootstrap`(静的束)を登録 - `plugins.dynamic`(.so/.dll)があれば dlopen 登録 3) Plugin Verify(必須メソッド/TLV/ABI) 4) 実行(VM/LLVM → `ny_call_method`) ブートの不変条件(重要) - Provider Lock(型→提供者の対応表)が確定するまで、いかなる Box 生成も禁止。 - Kernel ログ(生バイト)で初期エラーを出力し、`StringBox` 等の Box をログ用途に使わない。 - Verify に失敗した場合は、Kernel ログで理由を表示して即終了する。 ## Provider/Type 分離(概要) - Stable Type Name(STN): `StringBox`, `IntegerBox` など。コード上の型名は不変。 - Provider ID(PVN): `kernel:string@1.0` / `acme:string@2.1` など実装提供者。 - TOML で STN→PVN をバインドし、置換は TOML 側で行う。 Provider Lock(ロック) - 起動時に `types.` の provider を決定し、Provider Lock を作成・固定する。 - Lock 前の `ny_new_box` / `ny_call_method` はエラー(E_PROVIDER_NOT_LOCKED)。 - Handle は `{ type_id, provider_id }` を保持し、デバッグビルドでは不一致検知時に panic(本番では混入しない設計)。 ## ポリシー(例) - `plugin-first`(デフォルト): 動的プラグインの上書きを許可 - `compat_plugin_first`: 静的→動的のフォールバックを許可(移行期) - `static_only`(本番): 静的のみ許可 Interop(同一型の異 Provider 混在) - 既定は混在禁止(forbid)。同一プロセス内で 1 Type = 1 Provider を維持する。 - 研究・開発用途でのみ `explicit/auto` を許可できるが、本番非推奨。 - explicit: 明示 API による変換のみ許可(UTF‑8 などの正規形式を介する) - auto: 暗黙変換を許可し、変換回数・バイト数をメトリクスに集計(本番非推奨) ## 現状の段階 - 受け口/ドキュメントの整備を先行(挙動は不変)。 - using は SSOT+AST に移行済み(prod は file-using 禁止)。 - VM fallback の個別救済は暫定(短期で Bootstrap Pack へ移行し撤去)。 - VM fallback(MIR interpreter)の役割は「軽量デバッグ実行器」:フロントエンド(Parser/Using/AST→MIR)の健全性をすばやく確認するために維持。機能は最小限に留め、プラグイン/本流VM/LLVM の実装が主となる(本番・性能評価には使用しない)。 関連ドキュメント - nyash.toml のスキーマと例: docs/reference/config/nyash-toml.md - using(SSOT/AST/Profiles): docs/reference/language/using.md