- 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統一化を推進
2.8 KiB
2.8 KiB
Phase 10.5a – Python 統合 ABI 設計(Draft)
目的: Everything is Plugin/AOT の既存基盤上に Python を最小リスクで統合するための ABI と型・メソッド定義を固定する。
スコープ(10.5a)
- v2 プラグイン ABI 準拠(
nyash_plugin_abi/init/invoke)の Python プラグイン雛形を作成 - 2 Box を定義:
PyRuntimeBox(type_id=40),PyObjectBox(type_id=41) - メソッド ID の割り当てと TLV 方針を文書化(実装は 10.5b 以降)
TLV マッピング(現行運用)
- 1 = Bool (1 byte)
- 2 = I32 (4 bytes, LE)
- 3 = I64 (8 bytes, LE)
- 4 = F32 (4 bytes, LE)
- 5 = F64 (8 bytes, LE)
- 6 = String (UTF-8, n bytes)
- 7 = Bytes (opaque, n bytes)
- 8 = Handle/BoxRef (
u32 type_id || u32 instance_id)
備考: 既存ドキュメントには古い表記の混在があるため、VM_README 準拠で統一。
Box とメソッド設計
PyRuntimeBox (type_id=40)
- birth(0): ランタイムの生成(後続で GIL 初期化などを担当)。戻り値:
instance_id(非 TLV, u32 LE) - eval(1, code: String): Python コードを評価して
PyObjectBoxを返す。戻り値:Handle(tag=8) - import(2, name: String):
__import__(name)またはimportlib.import_module。戻り値:Handle(tag=8) - fini(MAX): ランタイム破棄(GIL 終了・クリーンアップ)
PyObjectBox (type_id=41)
- birth(0): 予約(通常は runtime 側から生まれる)
- getattr(1, name: String): 属性取得 →
Handle(tag=8) - call(2, args: TLV...): 可変長引数。初期段は I64/String/Bool/Bytes/Handle のサブセットに限定。戻り値:
Handle(tag=8) - str(3): Python 側で
PyObject_Str→ String へ。戻り値:String(tag=6) - fini(MAX): 参照カウント
Py_DECREFに対応(後続)
参照管理・GIL(概要)
- GIL: birth/invoke/fini の入口で確保し、出口で解放(再入を許容)。
- 参照:
PyObjectBoxは生成時にINCREF、finiでDECREF。ランタイム終了時に孤立検知の簡易テストを導入。
設定ファイル(nyash.toml)
libnyash_python_plugin.soを 2 Box 含む形で登録(path/type_id/method_id を固定)- JIT/VM 側は既存の
plugin_invoke経由で呼び出し(AOT は 10.5d でlibnyrt.aにシム追加)
次フェーズ(10.5b 以降)
- 10.5b:
PyRuntimeBox/PyObjectBox実装(CPython 埋め込み、最小 RO 経路) - 10.5c: Python→Nyash 方向(CPython 拡張
nyashrt) - 10.5d: JIT/AOT 連携(
emit_plugin_invoke対応・静的リンクシム) - 10.5e: サンプル・テスト・ドキュメント
補足: 本ドキュメントは「設計の固定」を目的とし、実装は段階的に進める。タグ/ID は既存と衝突しない値を選定した(40/41)。