Files
hakorune/docs/development/roadmap/phases/phase-10.5/README.md
Moe Charm 8e58942726 feat: プラグインパスをOS非依存に更新(.so拡張子削除)
- nyash.tomlからすべての.so拡張子を削除
- plugin_loader_v2のresolve_library_pathが自動的に適切な拡張子を追加
  - Linux: .so
  - Windows: .dll
  - macOS: .dylib
- クロスプラットフォーム対応の準備完了
2025-08-29 23:11:21 +09:00

4.8 KiB
Raw Blame History

Phase 10.5 Python ネイティブ統合Embedding & FFI/ JIT分離EXE専用化

(旧10.1の一部を後段フェーズに再編。Everything is Plugin/AOTの基盤上で実現)

本フェーズでは方針を明確化する実行はVMが唯一の基準系、JITは「EXE/AOT生成専用のコンパイラ」として分離運用する。

アーキテクチャの整理(決定)

  • 開発/デバッグ: MIR → VM完全実行
  • 本番/配布: MIR → JITCLIF→ OBJ → EXE完全コンパイル

ポイント

  • フォールバック不要/禁止: JITが未対応ならコンパイルエラー。VMへは落とさない。
  • 役割分担の明確化: VM=仕様/挙動の唯一の基準、JIT=ネイティブ生成器。
  • プラグイン整合: VM/EXEとも同一のBID/FFIプラグインを利用Everything is Plugin

📂 サブフェーズ構成10.5a → 10.5e

先行タスク(最優先)

  • 10.5s JIT Strict/分離の確定Fail-Fast / ノーフォールバック)
    • 目的: 「VM=実行・JIT=コンパイル」の二系統で混在を排除し、検証を単純化
    • 仕様:
      • JITは実行経路から外し、--compile-nativeAOTでのみ使用
      • Lowerer/Engine: unsupported>0 または fallback判定>0 でコンパイル中止Fail-Fast
      • 実行: VMのみ。フォールバックという概念自体を削除
    • DoD:
      • CLIに --compile-native を追加し、OBJ/EXE生成が一発で通る
      • VM実行は常にVMのみJITディスパッチ既定OFF

10.5a 設計・ABI整合12日

  • ルート選択:
    • Embedding: NyashプロセスにCPythonを埋め込み、PyObject*をハンドル管理
    • Extending: Python拡張モジュールnyashrtを提供し、PythonからNyashを呼ぶ
  • ABI方針:
    • ハンドル: TLV tag=8type_id+instance_id。Pythonオブジェクトは PyObjectBox として格納
    • 変換: Nyash ⇄ Python で Bool/I64/String/Bytes/Handle を相互変換
    • GIL: birth/invoke/decRef中はGIL確保。AOTでも同等

10.5b PyRuntimeBox / PyObjectBox 実装35日

  • PyRuntimeBox(シングルトン): eval(code) -> Handle / import(name) -> Handle
  • PyObjectBox: getattr(name) -> Handle / call(args...) -> Handle / str() -> String
  • 参照管理: Py_INCREF/Py_DECREF をBoxライフサイクルfiniに接続
  • プラグイン化: nyash-python-plugincdylib/staticlibnyplug_python_invoke を提供(将来の静的同梱に対応)

10.5c 境界の双方向化35日

  • Nyash→Python: BoxCall→plugin_invokeでCPython C-APIに橋渡し
  • Python→Nyash: nyashrtCPython拡張nyash.call(func, args) を提供
  • エラーハンドリング: 例外は文字列化tag=6でNyashに返却、またはResult化

10.5d JIT/AOT 統合35日

  • AOTパイプライン固定: Lower→CLIF→OBJ出力→ny_main+libnyrt.aリンク→EXE
  • CLI: nyash --compile-native file.nyash -o app を追加(失敗は非ゼロ終了)
  • libnyrt: nyash.python.* 等のシムを提供し、未解決シンボル解決
  • ディスパッチ: type_id→nyplug_*_invoke の静的/動的ルート(第一段は動的優先)

10.5e サンプル/テスト/ドキュメント1週間

  • サンプル: py.eval("'hello' * 3").str()numpyの軽量ケースimport/shape参照などRO中心
  • テスト: GILの再入・参照カウントリーク検知・例外伝搬・多プラットフォーム
  • ドキュメント: 使用例、制約GIL/スレッド、AOT時のリンク・ランタイム要件

🎯 DoD定義

  • NyashからPythonコードを評価し、PyObjectをHandleで往復できる
  • 代表的なプロパティ取得/呼び出しROがJIT/VMで動作
  • AOTリンク後のEXEで py.eval() 代表例が起動できる(動的ロード前提)
  • 10.5s Strict: VM=仕様/JIT=高速実装の原則に基づき、フォールバック無しで fail-fast が機能

目安

サブフェーズ 目安
10.5a 設計 12日
10.5b 実装 35日
10.5c 双方向 35日
10.5d JIT/AOT 35日
10.5e 仕上げ 1週間

⚠️ リスクと対策

  • GILデッドロック: 入口/出口で厳格に確保/解放。ネスト呼び出しの方針を文書化
  • 参照カウント漏れ: BoxライフサイクルでDECREFを必ず実施、リークテストを追加
  • リンク/配布: Linux/macOS優先。WindowsのPythonリンクは後段で対応
  • 性能: RO先行でJITに寄せ、ミューテーションはポリシー制御

次は 10.5a設計・ABI整合から着手。Everything is Plugin / libnyrt シムの成功パターンをPythonにも適用し、最小リスクで“Pythonネイティブ”を実現する。