2025-08-30 00:08:19 +09:00
|
|
|
|
# Phase 10.5 – ネイティブ基盤固め + Python ネイティブ統合
|
|
|
|
|
|
*(旧10.1の一部を後段フェーズに再編。まずネイティブ/AOT基盤を固め、その上でPythonを統合する方針に整理)*
|
2025-08-29 10:22:44 +09:00
|
|
|
|
|
2025-08-30 08:54:15 +09:00
|
|
|
|
このフォルダの全体像と最新の導線は INDEX を参照してください:
|
|
|
|
|
|
- INDEX: ./INDEX.md(Active と Archived の区分とリンク集)
|
|
|
|
|
|
|
2025-08-29 23:11:21 +09:00
|
|
|
|
本フェーズでは方針を明確化する:実行はVMが唯一の基準系、JITは「EXE/AOT生成専用のコンパイラ」として分離運用する。
|
|
|
|
|
|
|
|
|
|
|
|
アーキテクチャの整理(決定)
|
|
|
|
|
|
- 開発/デバッグ: MIR → VM(完全実行)
|
|
|
|
|
|
- 本番/配布: MIR → JIT(CLIF)→ OBJ → EXE(完全コンパイル)
|
|
|
|
|
|
|
|
|
|
|
|
ポイント
|
|
|
|
|
|
- フォールバック不要/禁止: JITが未対応ならコンパイルエラー。VMへは落とさない。
|
|
|
|
|
|
- 役割分担の明確化: VM=仕様/挙動の唯一の基準、JIT=ネイティブ生成器。
|
|
|
|
|
|
- プラグイン整合: VM/EXEとも同一のBID/FFIプラグインを利用(Everything is Plugin)。
|
2025-08-29 10:22:44 +09:00
|
|
|
|
|
2025-08-30 00:08:19 +09:00
|
|
|
|
## 📂 サブフェーズ構成(10.5s → 10.5e)
|
2025-08-29 10:22:44 +09:00
|
|
|
|
|
2025-08-29 21:39:47 +09:00
|
|
|
|
先行タスク(最優先)
|
2025-08-30 00:08:19 +09:00
|
|
|
|
- 10.5s JIT Strict/分離の確定(Fail-Fast / ノーフォールバック) [DONE]
|
2025-08-29 23:11:21 +09:00
|
|
|
|
- 目的: 「VM=実行・JIT=コンパイル」の二系統で混在を排除し、検証を単純化
|
2025-08-29 21:39:47 +09:00
|
|
|
|
- 仕様:
|
2025-08-29 23:11:21 +09:00
|
|
|
|
- JITは実行経路から外し、`--compile-native`(AOT)でのみ使用
|
|
|
|
|
|
- Lowerer/Engine: unsupported>0 または fallback判定>0 でコンパイル中止(Fail-Fast)
|
|
|
|
|
|
- 実行: VMのみ。フォールバックという概念自体を削除
|
2025-08-29 21:39:47 +09:00
|
|
|
|
- DoD:
|
2025-08-29 23:11:21 +09:00
|
|
|
|
- CLIに `--compile-native` を追加し、OBJ/EXE生成が一発で通る
|
|
|
|
|
|
- VM実行は常にVMのみ(JITディスパッチ既定OFF)。
|
2025-08-29 21:39:47 +09:00
|
|
|
|
|
2025-08-30 00:08:19 +09:00
|
|
|
|
### 10.5a(Python)設計・ABI整合(1–2日)
|
2025-08-29 10:22:44 +09:00
|
|
|
|
- ルート選択:
|
|
|
|
|
|
- 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でも同等
|
|
|
|
|
|
|
2025-08-30 00:08:19 +09:00
|
|
|
|
### 10.5b ネイティブビルド基盤の固め(AOT/EXE)(2–4日)
|
|
|
|
|
|
- 目的: Python統合の前に、AOT/EXE配布体験・クロスプラットフォーム実行の足回りを先に完成させる
|
|
|
|
|
|
- 範囲:
|
|
|
|
|
|
- VMとJITの分離(JIT=EXE専用)とStrict運用の徹底
|
|
|
|
|
|
- AOTパイプラインの実働(CLIF→.o→libnyrtリンク→EXE)
|
|
|
|
|
|
- プラグイン解決のクロスプラットフォーム化(.so/.dll/.dylib、自動lib剥がし、検索パス)
|
|
|
|
|
|
- Windowsビルド/リンク(clang優先、MSYS2/WSL fallback)
|
|
|
|
|
|
- EXE出力の統一(`Result: <val>`)とスモークテスト
|
|
|
|
|
|
- DoD:
|
|
|
|
|
|
- Linux/Windowsで `--compile-native` が通り、`plugins/` のDLL/so/dylibを自動解決
|
|
|
|
|
|
- `tools/build_aot.{sh,ps1}` で配布しやすいEXEが生成される
|
|
|
|
|
|
- `tools/smoke_aot_vs_vm.sh` でVM/EXEの出力照合が可能
|
|
|
|
|
|
|
|
|
|
|
|
### 10.5c PyRuntimeBox / PyObjectBox 実装(3–5日)
|
2025-08-29 10:22:44 +09:00
|
|
|
|
- `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` を提供(将来の静的同梱に対応)
|
|
|
|
|
|
|
2025-08-30 22:52:16 +09:00
|
|
|
|
追加方針(10.5c Handle-First/TLV 統一)
|
|
|
|
|
|
- Lowerer は Handle-First を徹底(a0 は常に `nyash.handle.of(receiver)`)。
|
|
|
|
|
|
- 引数TLVは String/Integer をプリミティブ化、その他は Handle(tag=8) に統一。
|
|
|
|
|
|
- 受け手箱名が未確定な経路には by-name シムを導入(後方安全の回避路)。
|
|
|
|
|
|
- 参考: `docs/reference/abi/ffi_calling_convention_min.md`
|
|
|
|
|
|
|
2025-08-29 10:22:44 +09:00
|
|
|
|
### 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日)
|
2025-08-29 23:11:21 +09:00
|
|
|
|
- AOTパイプライン固定: Lower→CLIF→OBJ出力→`ny_main`+`libnyrt.a`リンク→EXE
|
|
|
|
|
|
- CLI: `nyash --compile-native file.nyash -o app` を追加(失敗は非ゼロ終了)
|
|
|
|
|
|
- libnyrt: `nyash.python.*` 等のシムを提供し、未解決シンボル解決
|
|
|
|
|
|
- ディスパッチ: type_id→`nyplug_*_invoke` の静的/動的ルート(第一段は動的優先)
|
2025-08-29 10:22:44 +09:00
|
|
|
|
|
|
|
|
|
|
### 10.5e サンプル/テスト/ドキュメント(1週間)
|
|
|
|
|
|
- サンプル: `py.eval("'hello' * 3").str()`、`numpy`の軽量ケース(import/shape参照などRO中心)
|
|
|
|
|
|
- テスト: GILの再入・参照カウントリーク検知・例外伝搬・多プラットフォーム
|
|
|
|
|
|
- ドキュメント: 使用例、制約(GIL/スレッド)、AOT時のリンク・ランタイム要件
|
|
|
|
|
|
|
2025-08-30 22:52:16 +09:00
|
|
|
|
追加済みサンプル(最小チェーン)
|
|
|
|
|
|
- VM: `examples/py_min_chain_vm.nyash`(import→getattr→call→println)
|
|
|
|
|
|
- AOT: `examples/aot_py_min_chain.nyash`(import→getattr→call→return)
|
|
|
|
|
|
|
2025-08-29 10:22:44 +09:00
|
|
|
|
## 🎯 DoD(定義)
|
|
|
|
|
|
- NyashからPythonコードを評価し、PyObjectをHandleで往復できる
|
|
|
|
|
|
- 代表的なプロパティ取得/呼び出し(RO)がJIT/VMで動作
|
|
|
|
|
|
- AOTリンク後のEXEで `py.eval()` 代表例が起動できる(動的ロード前提)
|
2025-08-29 21:39:47 +09:00
|
|
|
|
- 10.5s Strict: VM=仕様/JIT=高速実装の原則に基づき、フォールバック無しで fail-fast が機能
|
2025-08-29 10:22:44 +09:00
|
|
|
|
|
|
|
|
|
|
## ⌛ 目安
|
|
|
|
|
|
| サブフェーズ | 目安 |
|
|
|
|
|
|
|---|---|
|
|
|
|
|
|
| 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に寄せ、ミューテーションはポリシー制御
|
2025-08-29 03:32:50 +09:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2025-08-30 08:54:15 +09:00
|
|
|
|
注: 旧10.1系の資料(10.1a〜g, chatgpt5_integrated_plan.md)は背景情報として残置(Archived)。現行の実装計画と用語は本READMEと 10.5a/b に集約します。
|
|
|
|
|
|
|
2025-08-29 10:22:44 +09:00
|
|
|
|
次は 10.5a(設計・ABI整合)から着手。Everything is Plugin / libnyrt シムの成功パターンをPythonにも適用し、最小リスクで“Pythonネイティブ”を実現する。
|