# Phase 10.5 – Python ネイティブ統合(Embedding & FFI) *(旧10.1の一部を後段フェーズに再編。Everything is Plugin/AOTの基盤上で実現)* NyashとPythonを双方向に“ネイティブ”接続する。第一段はNyash→Python呼び出し(Embedding)、続いてPython→Nyash(Extending)。JIT/AOT/Pluginの統一面を活かし、最小のC ABIで着地する。 ## 📂 サブフェーズ構成(10.5a → 10.5e) ### 10.5a 設計・ABI整合(1–2日) - ルート選択: - Embedding: NyashプロセスにCPythonを埋め込み、PyObject*をハンドル管理 - Extending: Python拡張モジュール(nyashrt)を提供し、PythonからNyashを呼ぶ - ABI方針: - ハンドル: TLV tag=8(type_id+instance_id)。Pythonオブジェクトは `PyObjectBox` として格納 - 変換: Nyash ⇄ Python で Bool/I64/String/Bytes/Handle を相互変換 - GIL: birth/invoke/decRef中はGIL確保。AOTでも同等 ### 10.5b PyRuntimeBox / PyObjectBox 実装(3–5日) - `PyRuntimeBox`(シングルトン): `eval(code) -> Handle` / `import(name) -> Handle` - `PyObjectBox`: `getattr(name) -> Handle` / `call(args...) -> Handle` / `str() -> String` - 参照管理: `Py_INCREF`/`Py_DECREF` をBoxライフサイクル(fini)に接続 - プラグイン化: `nyash-python-plugin`(cdylib/staticlib)で `nyplug_python_invoke` を提供(将来の静的同梱に対応) ### 10.5c 境界の双方向化(3–5日) - Nyash→Python: BoxCall→plugin_invokeでCPython C-APIに橋渡し - Python→Nyash: `nyashrt`(CPython拡張)で `nyash.call(func, args)` を提供 - エラーハンドリング: 例外は文字列化(tag=6)でNyashに返却、またはResult化 ### 10.5d JIT/AOT 統合(3–5日) - JIT: `emit_plugin_invoke` で Pythonメソッド呼びを許可(ROから開始) - AOT: libnyrt.a に `nyash.python.*` シム(birth_hなど)を追加し、ObjectModuleの未解決を解決 - 静的同梱経路: `nyrt` に type_id→`nyplug_python_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.5a 設計 | 1–2日 | | 10.5b 実装 | 3–5日 | | 10.5c 双方向 | 3–5日 | | 10.5d JIT/AOT | 3–5日 | | 10.5e 仕上げ | 1週間 | ## ⚠️ リスクと対策 - GILデッドロック: 入口/出口で厳格に確保/解放。ネスト呼び出しの方針を文書化 - 参照カウント漏れ: BoxライフサイクルでDECREFを必ず実施、リークテストを追加 - リンク/配布: Linux/macOS優先。WindowsのPythonリンクは後段で対応 - 性能: RO先行でJITに寄せ、ミューテーションはポリシー制御 --- 次は 10.5a(設計・ABI整合)から着手。Everything is Plugin / libnyrt シムの成功パターンをPythonにも適用し、最小リスクで“Pythonネイティブ”を実現する。