📚 Phase 12: Nyashスクリプトプラグインシステム設計と埋め込みVM構想
## 主な成果 - Nyashスクリプトでプラグイン作成可能という革命的発見 - C ABI制約の分析と埋め込みVMによる解決策 - MIR/VM/JIT層での箱引数サポートの詳細分析 ## ドキュメント作成 - Phase 12基本構想(README.md) - Gemini/Codex先生の技術分析 - C ABIとの整合性問題と解決策 - 埋め込みVM実装ロードマップ - 箱引数サポートの技術詳細 ## 重要な洞察 - 制約は「リンク時にC ABI必要」のみ - 埋め込みVMでMIRバイトコード実行により解決可能 - Nyashスクリプト→C ABIプラグイン変換が実現可能 Everything is Box → Everything is Plugin → Everything is Possible!
This commit is contained in:
87
docs/development/roadmap/phases/phase-10.6/PLAN.txt
Normal file
87
docs/development/roadmap/phases/phase-10.6/PLAN.txt
Normal file
@ -0,0 +1,87 @@
|
||||
# Phase 10.6 計画(整理版 / txt)
|
||||
|
||||
目的: Thread-Safety(監査→仕込み)と協調スケジューラ(Safepoint連携)を最小構成で通し、次段の並列GC/並列実行に備える。
|
||||
|
||||
====================
|
||||
1) ゴール(DoD)
|
||||
====================
|
||||
- 10.6a: Thread-Safety Audit の完了(一次)
|
||||
- NyashBox/Runtime の共有戦略(Arc+RwLock/Mutex)を棚卸し、未整備箇所はTODO化
|
||||
- Plugin-First 前提(PluginBoxV2 はクロススレッド未サポ運用を明記)
|
||||
- 10.6b: 協調スケジューラの足場
|
||||
- SingleThreadScheduler(queue + delayed + poll)を Safepoint に接続済み
|
||||
- デモ/トレース(NYASH_SCHED_DEMO=1, NYASH_SCHED_TRACE=1, 予算NYASH_SCHED_POLL_BUDGET)で観測可
|
||||
- 10.6c: 並列GC 設計の下準備
|
||||
- Per-thread roots / Safepoint協調 / カードマーキングの設計メモを確定(段階導入方針)
|
||||
|
||||
====================
|
||||
2) スコープ
|
||||
====================
|
||||
- 実装は“最小で通す”に限定(最適化は後続)。
|
||||
- 既存のVM=仕様、JIT=AOT生成専用という原則は維持。
|
||||
- Python/Plugin 経路は Plugin-First/Handle-First/TLV 統一の上に載せる(10.5で固定済)。
|
||||
|
||||
====================
|
||||
3) サブフェーズとタスク
|
||||
====================
|
||||
3.1) 10.6a Thread-Safety Audit(1–2日)
|
||||
- ドキュメント: phase-10/phase_10_6a_thread_safety_audit.md(既存)に一次棚卸しを反映
|
||||
- Grepチェック: Arc/Mutex/RwLock/Send/Sync の確認と未整備箇所の列挙
|
||||
- 確認対象:
|
||||
- ArrayBox/MapBox/BufferBox の共有戦略(Arc<RwLock<...>>)
|
||||
- NyashRuntime メンバのSend+Sync前提(Arcで包む)
|
||||
- Scheduler/GC Hooks のSend+Sync前提
|
||||
- PluginBoxV2: クロススレッド未サポ運用を明記(将来設計のTODO)
|
||||
|
||||
3.2) 10.6b Scheduler Prep(1–2日)
|
||||
- 仕様固定: poll() を MIR Safepoint で呼ぶ(既実装の確認)
|
||||
- 観測: NYASH_SCHED_DEMO=1 / NYASH_SCHED_TRACE=1 / NYASH_SCHED_POLL_BUDGET で動作確認
|
||||
- 最小API: spawn/spawn_after/poll/yield_now(SingleThreadScheduler)
|
||||
- ドキュメント: phase-10/phase_10_6b_scheduler_prep.txt 更新(Trace/観測例追加済)
|
||||
|
||||
3.3) 10.6c Parallel GC Design(2–3日)
|
||||
- 設計メモ: phase-10/phase_10_6c_parallel_gc_design.txt(既存)を最終化
|
||||
- 方針:
|
||||
- Per-thread roots, Safepoint協調、カードマーキングの段階導入
|
||||
- デフォルトは単一スレッド継続(featureで並列ON)
|
||||
- API拡張は後方互換シムを用意(barrier引数拡張など)
|
||||
|
||||
====================
|
||||
4) 成果物(Artifacts)
|
||||
====================
|
||||
- Docs
|
||||
- 10.6a 監査メモ: phase-10/phase_10_6a_thread_safety_audit.md(一次棚卸し完了)
|
||||
- 10.6b スケジューラ: phase-10/phase_10_6b_scheduler_prep.txt(Trace/デモ手順)
|
||||
- 10.6c 並列GC設計: phase-10/phase_10_6c_parallel_gc_design.txt(確定版)
|
||||
- Code
|
||||
- src/runtime/scheduler.rs(SingleThreadScheduler / Send+Sync)
|
||||
- MIR Safepoint → VM Runtime.scheduler.poll()(済)
|
||||
|
||||
====================
|
||||
5) リスクと緩和
|
||||
====================
|
||||
- 共有の粒度: 競合を避けるため、Box内部は最小限のロックで運用(RwLock優先)。
|
||||
- 並列前倒しの誘惑: 10.6では並列化を“設計と足場”に限定、実実装は次フェーズ(feature)
|
||||
- Plugin/FFI: クロススレッド呼出しは明示的に非対応(ドキュメントで制約明記)。
|
||||
|
||||
====================
|
||||
6) タイムライン(目安)
|
||||
====================
|
||||
- 10.6a: 1–2日
|
||||
- 10.6b: 1–2日
|
||||
- 10.6c: 2–3日
|
||||
|
||||
====================
|
||||
7) 依存関係
|
||||
====================
|
||||
- 10.5 完了(AOT/nyrt/Handle-First/TLV統一/Strict運用)を前提
|
||||
- Docsの最新導線: docs/development/roadmap/phases/phase-10.5/INDEX.md
|
||||
|
||||
====================
|
||||
8) 参照リンク
|
||||
====================
|
||||
- phase-10/phase_10_6_thread_safe_revolution.md(設計準備)
|
||||
- phase-10/phase_10_6a_thread_safety_audit.md(監査)
|
||||
- phase-10/phase_10_6b_scheduler_prep.txt(スケジューラ)
|
||||
- phase-10/phase_10_6c_parallel_gc_design.txt(並列GC)
|
||||
|
||||
@ -0,0 +1,79 @@
|
||||
# Phase 10.6 → Pythonネイティブ接続プラン(整理版 / txt)
|
||||
|
||||
目的: 10.6で整えたThread-Safety/Schedulerの最小足場の上に、Pythonプラグイン(PyRuntimeBox/PyObjectBox)をネイティブEXE(AOT)まで安定接続する。
|
||||
|
||||
====================
|
||||
1) 到達イメージ(DoD)
|
||||
====================
|
||||
- Linux/Windows で以下が安定動作:
|
||||
- AOT: `examples/aot_py_min_chain.nyash` → `Result: 4`(math.sqrt(16))
|
||||
- VM: `examples/py_min_chain_vm.nyash` → 4.0 表示(NYASH_PY_AUTODECODE=1)
|
||||
- returns_result 系サンプル(importR/getattrR/callR)で Ok/Err が期待通りに表示
|
||||
- AOTビルドの配布体験が明確:
|
||||
- `tools/build_aot.{sh,ps1}` で .o → EXE、`nyash.toml`/plugins 解決、Windowsでは PATH/PYTHONHOME 調整
|
||||
- 配布ガイド(依存コピー/環境変数/動作確認手順)が `docs/guides/build/aot_quickstart.md` に追記済み
|
||||
|
||||
====================
|
||||
2) 方針(変えない原則)
|
||||
====================
|
||||
- Plugin-First / Handle-First / TLV 統一(String/Integerはプリミティブ、Bufferはbytes(tag=7)、他はHandle(tag=8))。
|
||||
- Strict: 実行はVM、JITはAOT生成専用(フォールバック禁止)。
|
||||
- by-name経路: 受け手箱名未確定時は `nyash_plugin_invoke_name_{getattr,call}_i64` で実行時解決。
|
||||
|
||||
====================
|
||||
3) 実装タスク(M1→M5)
|
||||
====================
|
||||
M1: AOT最小ルートの安定(完了確認/微修正)
|
||||
- nyrt シム:BufferBox→bytes(tag=7) 対応、3引数目以降をレガシーVM引数からTLV追補(暫定N引数)
|
||||
- Windows探索:EXE起動時に PATH へ exe/`plugins/` を追加、`PYTHONHOME` が未設定なら `exe\python` を採用(相対はexe基準に正規化)
|
||||
- ドキュメント:AOTクイックスタートにWindows注意点を追記(済)
|
||||
|
||||
M2: TLV/FFIカバレッジ拡大(最小)
|
||||
- kwargs/辞書のパス(callKwR)をbytes(tag=7) or string(tag=6, JSON)で暫定対応(将来 BID-1拡張)
|
||||
- N引数の一般化(invoke3→invokeN 設計、実装は段階導入。先行はレガシー補完で可)
|
||||
- returns_result の統一処理(VM既存→AOTでも同等に扱う)
|
||||
|
||||
M3: Lowerer/Policy の整流
|
||||
- Handle-First統一の確認:Python特化の型伝搬は撤去済み(戻りはHandle or プリミティブのみ参照)
|
||||
- birth引数の一般化(TLVメモに沿い、Integer/Stringはプリミティブ、他はHandle)
|
||||
- by-name の適用範囲と導線(`getattr`/`call` はby-name固定、importはmethod_id直参照)
|
||||
|
||||
M4: 配布導線とサンプル
|
||||
- スクリプト整備:`tools/build_python_aot.sh` の統合(`build_aot.sh` に一本化 or ラッパー)
|
||||
- サンプル最小化:returns_result(Ok/Err)、例外伝搬(Error文字列)、bytes引数、context共有(per-runtime globals)
|
||||
- ガイド整理:`docs/guides/build/aot_quickstart.md` に「Pythonネイティブ」節を追加(動作要件・環境変数)
|
||||
|
||||
M5: 観測/CI(軽量)
|
||||
- スモーク:VMチェーン / AOTチェーンの比較(Result行)を `tools/smoke_aot_vs_vm.sh` に追加(Python系は最小のみ)
|
||||
- ログ:`NYASH_JIT_EVENTS*`/`NYASH_JIT_NATIVE_F64`/`NYASH_PY_AUTODECODE` による差分観測
|
||||
|
||||
====================
|
||||
4) リスク/制約
|
||||
====================
|
||||
- CPython依存の配布:WindowsのDLL探索(PATH/PYTHONHOME)は最小整備。完全同梱(embedded)は後段で検討。
|
||||
- KW/辞書のTLV表現:暫定はbytes/stringでブリッジ。正式BIDタグは将来導入(後方互換のためJSON連携を許容)。
|
||||
- ネイティブN引数:v0はレガシーVM引数からのTLV補完でしのぎ、invokeNは次期導入。
|
||||
|
||||
====================
|
||||
5) タイムライン(目安)
|
||||
====================
|
||||
- M1(安定): 0.5日(確認/微修正)
|
||||
- M2(TLV拡充): 1–2日(kwargsは暫定・bytes/JSON)
|
||||
- M3(Lowerer整流): 0.5–1日
|
||||
- M4(配布/サンプル): 1日
|
||||
- M5(観測/CI): 0.5日
|
||||
|
||||
====================
|
||||
6) 成果物(Artifacts)
|
||||
====================
|
||||
- 例: `examples/aot_py_min_chain.nyash`, `examples/py_min_chain_vm.nyash`(既存)
|
||||
- ツール: `tools/build_aot.{sh,ps1}`(Python節)、`tools/smoke_aot_vs_vm.sh`(Python最小)
|
||||
- Docs: `docs/guides/build/aot_quickstart.md`(Python節)、`docs/reference/abi/ffi_calling_convention_min.md`(bytes/N引数注記)
|
||||
|
||||
====================
|
||||
7) 参照
|
||||
====================
|
||||
- 10.5c: Handle-First/PluginInvoke 設計(by-name シム)
|
||||
- 10.5d/e: AOT統合/最終仕上げ(nyrt/Windows探索/TLV拡張)
|
||||
- 10.6: Thread-Safety/Scheduler(並列化前の足場)
|
||||
|
||||
Reference in New Issue
Block a user