Files
hakorune/docs/development/roadmap/phases/phase-10.5/README.md
Moe Charm d24149d0a1 feat: Phase 10.5 Python統合プラグインとAOTビルド対応
- 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統一化を推進
2025-08-29 10:22:44 +09:00

3.6 KiB
Raw Blame History

Phase 10.5 Python ネイティブ統合Embedding & FFI

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

NyashとPythonを双方向に“ネイティブ”接続する。第一段はNyash→Python呼び出しEmbedding、続いてPython→NyashExtending。JIT/AOT/Pluginの統一面を活かし、最小のC ABIで着地する。

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

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日

  • 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 設計 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ネイティブ”を実現する。