Files
hakorune/docs/development/adr/adr-001-no-corebox-everything-is-plugin.md

3.4 KiB
Raw Permalink Blame History

ADR-001: No CoreBox, Everything is Plugin — Provider/Type 分離方針

Status: Accepted (Phase 15.5 設計)
Last updated: 2025-09-26

決定

  • CoreBox言語ランタイム内の特別な箱実装は復活させない。
  • 最小カーネルNyKernelは GC/Handle/TLV/Extern/PluginRegistry/ABI だけを提供し、箱の実装は一切持たない。
  • 機能はすべて PluginTypeBox v2で提供するEverything is Plugin
  • 型名Stable Type Name: STNと実装提供者Provider ID: PVNを分離する。
    • 例: STN = StringBox、PVN = kernel:string@1.0 / acme:string@2.1
    • コードは常に STN に依存し、どの PVN を使うかは nyash.toml で選択する。
  • 起動シーケンスは「Kernel init → plugins.bootstrap静的束+ plugins.dynamic任意登録 → Verify必須メソッド等→ 実行」。
  • 呼び出しは VM/LLVM 共通で ny_new_box / ny_call_method に一本化MIR Callee 確定から統一)する。

背景 / 文脈

  • using の SSOT唯一の真実nyash.toml に置き、実体結合は AST マージに一本化した。これにより宣言≻式の曖昧性を排除し、依存は設定で一元管理できる。
  • CoreBox を残すと特別経路や例外が増え、Everything is Plugin と相反する。Kernel/Plugin の責務分離が維持性と置換性を高める。

設計詳細

NyKernel の責務

  • GC / Roots / Safepoint / Write barrier
  • Handle / TLV
  • Extern registryenv.console.* 最小)
  • Plugin registry登録・検索・呼び出し
  • C ABI: ny_new_box(type_id, args), ny_call_method(recv, type_id, method_id, args, out), ny_gc_*

Bootstrap Pack静的リンクの基本プラグイン束

  • String/Integer/Array/Map/Console などの最小実用セット。
  • 静的リンクして起動時に一括登録(特権経路は作らない)。
  • 動的プラグインで override 可能(ポリシーで制御)。

Provider/Type 分離TOML スキーマ案・既定OFF

[types.StringBox]
provider = "kernel:string@1.0"
allow_override = true

[providers."kernel:string@1.0"]
crate = "nyash-plugin-base-string"

[providers."acme:string@2.1"]
path = "./plugins/libacme_string.so"
override = true

[policy]
factory = "plugin-first"   # compat_plugin_first | static_only

Verify必須

  • plugin-tester で Lifecycle/TLV/必須メソッドを検証。欠落時は即エラー。

代替案の却下kernelString 等)

  • 型名に provider を織り込む(例: kernelString案は、差し替え不能化・特権化・型ID安定性の破壊リスクが高く不採用。区別は provider 名で行い、型名STNは常に不変とする。

ロードマップ小さく段階的・既定OFF

  • K0: ADR/Docs 追加(本書)。
  • K1: TOML スキーマの雛形types/providers/policyを docs と設定ローダに受け口だけ追加(挙動不変)。
  • K2: 起動時に provider 解決の受け口をログ出力のみで導入(挙動不変)。
  • K3: Verify フックを preflight_plugins に統合既定OFF
  • K4: Bootstrap Pack の登録導線prod 限定フラグ・既定OFF

移行 / 互換

  • 既存コードは型名STNのまま変更不要。provider 置換は TOML で完結。
  • VM fallback の暫定個別救済はフラグ付き/短期で撤去。最終形は ny_call_method に集約。