- Pythonプラグイン(PyRuntimeBox/PyObjectBox)を追加 - eval, import, getattr, call, callKw, strメソッド実装 - math.sqrtデモ等のサンプルコード追加 - AOTビルドサポート追加 - libnyrtランタイムライブラリ - build_aot.shビルドスクリプト - .gitignore改善 - JSONLとDOTファイル除外 - プラグインのビルド成果物除外 - 不要ファイル削除 - nekocode-temp, zenn_articles - 一時的なログファイル類 Phase 10.1の新計画に基づいて、プラグインBox統一化を推進
61 lines
3.6 KiB
Markdown
61 lines
3.6 KiB
Markdown
# 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ネイティブ”を実現する。
|