docs: restore docs/private/roadmap from 7b4908f9 (Phase 20.31)
This commit is contained in:
@ -0,0 +1,65 @@
|
||||
# Planning - Python-Hakorune統合計画
|
||||
|
||||
## 📋 概要
|
||||
|
||||
Python-Hakorune統合の計画・設計ドキュメント集です。
|
||||
|
||||
## 📁 ファイル一覧
|
||||
|
||||
### 🌟 最新計画(2025-10-02追加)
|
||||
- **[milestones.md](milestones.md)** ⭐必読 - M0〜M6段階的実装計画(ChatGPT Pro UltraThink)
|
||||
|
||||
### 主要計画書
|
||||
- **[integrated-plan.md](integrated-plan.md)** - ChatGPT5による統合計画(旧Phase 10.5全体計画)
|
||||
- **[python-parser-plan-summary.md](python-parser-plan-summary.md)** - Pythonパーサー統合計画サマリー
|
||||
|
||||
### 設計ドキュメント
|
||||
- **[python-parser-box-design.md](python-parser-box-design.md)** - PythonパーサーBox設計
|
||||
- **[expert-feedback.md](expert-feedback.md)** - GeminiとCodexによるAI専門家フィードバック
|
||||
|
||||
## 🎯 計画の核心
|
||||
|
||||
### Phase 10.5の目的(旧計画)
|
||||
|
||||
1. **ネイティブ基盤固め**
|
||||
- VM/JIT分離(VM=実行、JIT=コンパイル)
|
||||
- AOT/EXEパイプライン確立
|
||||
- クロスプラットフォーム対応
|
||||
|
||||
2. **Python統合**
|
||||
- PyRuntimeBox: Python実行環境
|
||||
- PyObjectBox: Pythonオブジェクト管理
|
||||
- Hakorune ⇄ Python 双方向呼び出し
|
||||
|
||||
### 設計方針
|
||||
|
||||
#### Embedding vs Extending
|
||||
- **Embedding**: HakoruneプロセスにCPythonを埋め込み
|
||||
- **Extending**: Python拡張モジュールとして提供
|
||||
|
||||
#### ABI設計
|
||||
- ハンドル: TLV tag=8(type_id+instance_id)
|
||||
- Pythonオブジェクト: `PyObjectBox` として格納
|
||||
- 変換: Bool/I64/String/Bytes/Handle の相互変換
|
||||
- GIL: birth/invoke/decRef中はGIL確保
|
||||
|
||||
## 📊 実装フェーズ(旧10.5計画)
|
||||
|
||||
| フェーズ | 期間 | 内容 |
|
||||
|---------|------|------|
|
||||
| 10.5a | 1-2日 | Python設計・ABI整合 |
|
||||
| 10.5b | 2-4日 | ネイティブビルド基盤 |
|
||||
| 10.5c | 3-5日 | PyRuntimeBox/PyObjectBox実装 |
|
||||
| 10.5d | 3-5日 | JIT/AOT統合 |
|
||||
| 10.5e | 1週間 | サンプル/テスト/ドキュメント |
|
||||
|
||||
## ⚠️ 現在のステータス
|
||||
|
||||
**保留中** - Phase 15(Hakoruneセルフホスティング)完了後に再開予定
|
||||
|
||||
## 🔗 関連ドキュメント
|
||||
|
||||
- [Phase 20 メインREADME](../README.md)
|
||||
- [Parser Integration](../parser-integration/)
|
||||
- [Core Implementation](../core-implementation/)
|
||||
- [Design Documents](../design/)
|
||||
@ -0,0 +1,197 @@
|
||||
# PythonParserBox実装計画 - エキスパートフィードバック
|
||||
日付: 2025-08-27
|
||||
|
||||
## Gemini先生のフィードバック
|
||||
|
||||
### 総評
|
||||
これは非常に野心的で、言語の成熟度を飛躍的に高める可能性を秘めた素晴らしい計画です。Nyashの「Everything is a Box」哲学とPythonエコシステムを融合させるという着眼点に大変興奮しました。
|
||||
|
||||
### 1. 実装計画は技術的に健全か?落とし穴は?
|
||||
|
||||
**技術的健全性:**
|
||||
はい、計画は全体として技術的に非常に健全です。
|
||||
|
||||
* **CPythonパーサーの利用:** `pyo3`経由で`ast.parse()`を利用するのは、Python構文との互換性を100%保証するための最も確実で賢明なアプローチです。
|
||||
* **JSON中間表現(IR):** Python AST (Pythonメモリ空間) と Nyash AST (Rustメモリ空間) の間にJSONを挟むのは、言語間の境界を明確に分離する良い設計です。
|
||||
* **段階的実装とフォールバック:** 未実装機能を`exec()`にフォールバックする戦略は、実用性を保ちながら段階的に実装を進めるための極めて現実的なアプローチです。
|
||||
|
||||
**潜在的な落とし穴:**
|
||||
* **パフォーマンス:** `Python AST → JSON → Nyash AST → Nyash実行`というパイプラインは、特に初期段階では非常に低速になります。
|
||||
* **ASTの複雑性の爆発:** PythonのASTは非常に巨大で、言語バージョンの更新も速いです。
|
||||
* **標準ライブラリの壁:** Pythonの真の力は広範な標準/サードパーティライブラリにあります。`import`文をどう扱うかは最重要課題です。
|
||||
|
||||
### 2. Python AST → Nyash AST変換で注意すべき意味論の違いは?
|
||||
|
||||
* **型システム:** Pythonは動的型付け、Nyashは静的型付けまたはより厳格な型システムを持つと推測
|
||||
* **オブジェクトモデルと可変性:** Pythonのオブジェクトは基本的に可変(mutable)
|
||||
* **スコープとクロージャ:** Pythonの`global`や`nonlocal`の挙動は独特
|
||||
* **特殊メソッド (`__dunder__`):** Pythonの挙動は特殊メソッドで定義される
|
||||
* **組み込み関数:** `len()`, `print()`, `range()`などをどう扱うか
|
||||
|
||||
### 3. Nyashパーサーのバグ検証戦略として効果的か?
|
||||
|
||||
**非常に効果的です。** これは「Differential Testing(差分テスト)」と呼ばれる強力な手法です。
|
||||
* **巨大なテストスイート:** 事実上、世の中にある無数のPythonコードがNyashのテストケースになります。
|
||||
* **微妙なバグの発見:** 手書きの単体テストでは見逃しがちなセマンティクスのバグを発見するのに絶大な効果を発揮します。
|
||||
|
||||
### 4. pyo3統合でのGIL管理のベストプラクティスは?
|
||||
|
||||
* **基本原則:** Pythonオブジェクトに触れるコードは、必ずGILを獲得した状態で実行
|
||||
* **GILの必要期間を最小化する**
|
||||
* **`py.allow_threads`の活用:** 時間がかかり、かつPythonオブジェクトに触れない処理で使用
|
||||
|
||||
### 5. 段階的実装(Phase 1-4)の優先順位は適切か?
|
||||
|
||||
はい、提案されている優先順位は非常に適切です。
|
||||
1. Phase 1: 基本構文 + 変数束縛 + 基本的な式 + プリミティブ型
|
||||
2. Phase 2: list, dict, tuple
|
||||
3. Phase 3: 関数とスコープ
|
||||
4. Phase 4: モジュールとクラス
|
||||
|
||||
**最優先で並行すべきこと:** `exec()`へのフォールバック機構
|
||||
|
||||
### 6. 言語成熟度向上への貢献度をどう評価する?
|
||||
|
||||
**定量的指標:**
|
||||
* ライブラリ互換性カバレッジ
|
||||
* パフォーマンステスト
|
||||
* 発見バグ数
|
||||
|
||||
**定性的指標:**
|
||||
* 表現力の向上
|
||||
* 開発者体験
|
||||
* エコシステムのマイルストーン
|
||||
|
||||
### 結論
|
||||
|
||||
この`PythonParserBox`計画は、単なる機能追加ではなく、**Nyash言語のテスト、デバッグ、そしてエコシステム獲得を同時に加速させる、極めて戦略的な一手**です。
|
||||
|
||||
---
|
||||
|
||||
## Codex先生のフィードバック
|
||||
|
||||
### Overall Verdict
|
||||
- Sound approach: Using CPython's parser via pyo3, lowering via a JSON IR, and gradually replacing exec() with Nyash MIR/JIT is feasible and strategically strong.
|
||||
- Biggest risks: Semantic mismatches at statement/expression boundaries, version skew of Python AST, and boundary-costs between CPython and Nyash during phased rollout.
|
||||
|
||||
### Architectural Pitfalls
|
||||
- **Python version skew:** `ast` schema changes across minors. Pin and encode `py_version` + `ast_format` in the JSON.
|
||||
- **AST stability vs syntax fidelity:** `ast` loses comments and some token distinctions
|
||||
- **Boundary granularity:** Whole-file fallback wastes partial coverage; per-node fallback is unsafe. **The practical unit is per-function.**
|
||||
- **Import system and environment:** Python imports pull arbitrary code
|
||||
- **Error mapping:** Propagate Python exceptions with full traceback
|
||||
- **Performance overhead:** Python AST→JSON→Nyash→MIR is heavy
|
||||
- **Object model mismatch:** Identity (`is`), mutability, truthiness, numeric tower
|
||||
- **Concurrency:** GIL limits parallel parse/exec
|
||||
|
||||
### AST→Nyash Semantics: High-Risk Differences
|
||||
- **Names and scope:**
|
||||
- LEGB resolution; `global`/`nonlocal` behavior; closures and cell variables
|
||||
- Comprehension scopes (separate scope in Python 3)
|
||||
- **Control flow:**
|
||||
- `for` iterates via iterator protocol; `for/else`, `while/else` semantics
|
||||
- Short-circuit truthiness uses Python rules; `__bool__` then `__len__`
|
||||
- **Functions:**
|
||||
- Defaults evaluated at definition time; `*args/**kwargs`
|
||||
- Decorators transform functions at definition time
|
||||
- **Operators and numbers:**
|
||||
- `/` true division; `//` floor division; big integers by default
|
||||
- Operator dispatch via dunder methods; `is` vs `==`
|
||||
|
||||
For Phase 1, the must-haves are: LEGB + locals/freevars, default args timing, iterator-based `for`, `for/else` + `while/else`, Python truthiness and short-circuiting.
|
||||
|
||||
### Fallback Strategy
|
||||
- **Fallback unit: Per-function.** If a function body contains unsupported nodes, compile a "PyThunk" that calls into CPython.
|
||||
- **Boundary types:** Define canonical bridges: `PyAnyBox` in Nyash wrapping `Py<PyAny>`
|
||||
- **Imports and globals:** Execute module top-level in Python; then selectively replace functions
|
||||
|
||||
### pyo3/GIL Best Practices
|
||||
- **Initialization:** Call `pyo3::prepare_freethreaded_python()` once
|
||||
- **GIL usage:**
|
||||
- Use `Python::with_gil(|py| { ... })` for all Python calls
|
||||
- Minimize time under GIL; copy data out promptly
|
||||
- For heavy Rust work, drop GIL: `py.allow_threads(|| { ... })`
|
||||
- **Data transfer:** Prefer building JSON on the Python side
|
||||
- **Versioning:** Pin Python minor version; embed version string in the IR
|
||||
|
||||
### Phasing and Priorities (Refined)
|
||||
- **Phase 1 (Parser + Minimal Semantics):**
|
||||
- Python→JSON exporter with location info
|
||||
- Nyash IR for expressions and basic statements
|
||||
- Semantics fidelity for: iterator protocol, truthiness, scoping
|
||||
- **Fallback per-function for anything else**
|
||||
- **Phase 2-4:** Coverage expansion → Objects/Runtime → MIR/JIT
|
||||
|
||||
### Parser Bug Validation Strategy
|
||||
- **Differential execution:** Curate pairs of semantically equivalent snippets
|
||||
- **Oracle testing:** Run CPython as oracle and compare
|
||||
- **Fuzzing:** Grammar-based fuzzers
|
||||
- **Coverage and gating:** Track node-kind coverage
|
||||
|
||||
### IR/JSON Design Tips
|
||||
- Include: `node_type`, children, `lineno/col_offset`, `py_version`, `ast_format`, `support_level`
|
||||
- Canonicalize: normalize forms, operator names
|
||||
- Determinism: maintain stable field ordering
|
||||
|
||||
### Concrete Recommendations
|
||||
- **Pin to one Python minor (e.g., 3.11 or 3.12)**
|
||||
- **Choose per-function fallback as the core boundary**
|
||||
- **Implement Python truthiness, iterator protocol, and scoping correctly before optimizing**
|
||||
- **Keep the GIL minimal: build the JSON in Python; parse in Rust**
|
||||
- **Telemetry from day one: log unsupported node kinds and fallback counts**
|
||||
- **Start with JSON; plan migration to a compact binary once stable**
|
||||
|
||||
---
|
||||
|
||||
## 統合された重要ポイント
|
||||
|
||||
### 🎯 両エキスパートが一致した最重要事項
|
||||
|
||||
1. **関数単位のフォールバック戦略**
|
||||
- ファイル全体でなく関数レベルでコンパイル/フォールバックを切り替え
|
||||
- 未対応機能を含む関数はCPython exec、対応済み関数はNyash MIR/JIT
|
||||
|
||||
2. **Python バージョン固定**
|
||||
- Python 3.11または3.12に固定
|
||||
- AST安定性の確保とバージョン間の差異回避
|
||||
|
||||
3. **意味論の正確な実装が最優先**
|
||||
- 最適化より先にPython互換性を確保
|
||||
- 特に: イテレータプロトコル、真偽値判定、スコーピング規則
|
||||
|
||||
4. **GIL管理の最小化**
|
||||
- Python側でJSON生成、Rust側で解析
|
||||
- 重い処理はGIL外で実行
|
||||
|
||||
5. **テレメトリーの重要性**
|
||||
- 未対応ノードの記録
|
||||
- フォールバック率の計測
|
||||
- 実行時の統計情報収集
|
||||
|
||||
### 🚨 特に注意すべき意味論の違い
|
||||
|
||||
1. **制御フロー**
|
||||
- for/else, while/else の独特な挙動
|
||||
- forループのイテレータプロトコル
|
||||
|
||||
2. **スコープ規則**
|
||||
- LEGB(Local, Enclosing, Global, Builtins)
|
||||
- global/nonlocal宣言
|
||||
- 内包表記の独立スコープ(Python 3)
|
||||
|
||||
3. **数値演算**
|
||||
- / (true division) vs // (floor division)
|
||||
- デフォルトで大整数
|
||||
- NaN の扱い
|
||||
|
||||
4. **関数定義**
|
||||
- デフォルト引数は定義時に評価
|
||||
- *args/**kwargs の扱い
|
||||
- デコレータの実行順序
|
||||
|
||||
### 📊 成功の測定指標
|
||||
|
||||
1. **カバレッジ**: コンパイル済み vs フォールバック関数の比率
|
||||
2. **性能向上**: 数値計算ベンチマークでの改善率
|
||||
3. **バグ発見数**: Differential Testingで発見されたバグ数
|
||||
4. **エコシステム**: 動作する有名Pythonライブラリの数
|
||||
@ -0,0 +1,244 @@
|
||||
# [Archived] 旧 Phase 10.1 - Python統合計画(ChatGPT5高速開発版)
|
||||
最終更新: 2025-08-27 / 状態: Archived(Phase 10.5 に統合)
|
||||
|
||||
現行の計画は Phase 10.5 のドキュメントに集約しています。最新は以下を参照してください:
|
||||
- Phase 10.5 Index: ./INDEX.md
|
||||
- 10.5a – Python ABI 設計: ./10.5a-ABI-DESIGN.md
|
||||
- 10.5b – ネイティブビルド基盤: ./10.5b-native-build-consolidation.md
|
||||
|
||||
## 🚀 概要:2週間での爆速実装(当時案)
|
||||
|
||||
ChatGPT5の最小Box設計により、元の1ヶ月計画を**2週間**に圧縮。Nyash既存アーキテクチャ(MirBuilder 100%実装済み、HandleRegistry 80%実装済み)を最大活用。
|
||||
|
||||
## 📦 ChatGPT5の6つの必須Box(最小実装)
|
||||
|
||||
### 1. **PythonParserBox** - CPython AST取得(3日)
|
||||
```rust
|
||||
// 既存: pyo3統合済み
|
||||
// 追加: JSON出力とバージョン固定
|
||||
pub struct PythonParserBox {
|
||||
base: BoxBase,
|
||||
py_helper: Arc<Mutex<PyHelper>>,
|
||||
version: String, // "3.11"固定
|
||||
}
|
||||
|
||||
// メソッド(最小限)
|
||||
- parse_to_json(src: String) -> String // ast.parse() → JSON
|
||||
- get_version() -> String // "3.11"
|
||||
```
|
||||
|
||||
### 2. **Py2NyASTBox** - AST変換(3日)
|
||||
```rust
|
||||
// 新規実装
|
||||
pub struct Py2NyASTBox {
|
||||
base: BoxBase,
|
||||
normalizer: AstNormalizer,
|
||||
}
|
||||
|
||||
// メソッド(制御フロー正規化)
|
||||
- convert(json: String) -> NyashAst
|
||||
- normalize_for_else(ast: &mut PyAst) // for/else → if分岐
|
||||
- normalize_comprehensions(ast: &mut PyAst)
|
||||
```
|
||||
|
||||
### 3. **MirBuilderBox** - MIR生成(0日 - 既存活用)
|
||||
```rust
|
||||
// 既存実装100%活用
|
||||
// 追加: Python由来フラグのみ
|
||||
pub struct MirBuilderBox {
|
||||
// 既存フィールド
|
||||
is_python_origin: bool, // 追加
|
||||
}
|
||||
```
|
||||
|
||||
### 4. **BoundaryBox** - 型変換(2日)
|
||||
```rust
|
||||
// Python版のHandleRegistry相当
|
||||
pub struct BoundaryBox {
|
||||
base: BoxBase,
|
||||
handle_registry: Arc<Mutex<HandleRegistry>>, // 既存80%活用
|
||||
}
|
||||
|
||||
// メソッド
|
||||
- py_to_jit(py_val: PyValBox) -> JitValue
|
||||
- jit_to_py(jit_val: JitValue) -> PyValBox
|
||||
- register_handle(obj: Arc<dyn NyashBox>) -> u64
|
||||
```
|
||||
|
||||
### 5. **PyRuntimeBox** - 実行制御(2日)
|
||||
```rust
|
||||
pub struct PyRuntimeBox {
|
||||
base: BoxBase,
|
||||
fallback_stats: FallbackStats,
|
||||
}
|
||||
|
||||
// メソッド(関数単位フォールバック)
|
||||
- execute_function(name: &str, args: Vec<JitValue>) -> JitValue
|
||||
- should_fallback(func_ast: &PyAst) -> bool // Phase1機能判定
|
||||
- fallback_to_cpython(code: &str) -> PyObject
|
||||
```
|
||||
|
||||
### 6. **ObservabilityBox** - 統計収集(1日)
|
||||
```rust
|
||||
// 既存のJIT統計システム(70%実装済み)を拡張
|
||||
pub struct ObservabilityBox {
|
||||
base: BoxBase,
|
||||
stats_collector: StatsCollector,
|
||||
}
|
||||
|
||||
// JSONLフォーマット出力
|
||||
- log_attempt(module: &str, func: &str, compiled: bool, reason: Option<&str>)
|
||||
- output_jsonl() -> String
|
||||
```
|
||||
|
||||
## 🗓️ 実装タイムライン(2週間)
|
||||
|
||||
### Week 1: 基盤実装(7日)
|
||||
- **Day 1-3**: PythonParserBox実装
|
||||
- pyo3統合(既存活用)
|
||||
- Python 3.11固定
|
||||
- JSON出力実装
|
||||
|
||||
- **Day 4-6**: Py2NyASTBox実装
|
||||
- 制御フロー正規化
|
||||
- for/else, while/else変換
|
||||
- Phase1機能のみサポート
|
||||
|
||||
- **Day 7**: ObservabilityBox実装
|
||||
- 既存JIT統計拡張
|
||||
- JSONLフォーマット
|
||||
|
||||
### Week 2: 統合と検証(7日)
|
||||
- **Day 8-9**: BoundaryBox実装
|
||||
- HandleRegistry活用
|
||||
- 型変換ルール確立
|
||||
|
||||
- **Day 10-11**: PyRuntimeBox実装
|
||||
- 関数単位フォールバック
|
||||
- CPython連携
|
||||
|
||||
- **Day 12-13**: 統合テスト
|
||||
- Differential Testing
|
||||
- ベンチマーク実行
|
||||
|
||||
- **Day 14**: ドキュメント・リリース
|
||||
- 使用例作成
|
||||
- パフォーマンス測定
|
||||
|
||||
## 📊 既存アーキテクチャとの整合性
|
||||
|
||||
### 活用率
|
||||
- **MirBuilderBox**: 100%(変更なし)
|
||||
- **HandleRegistry**: 80%(BoundaryBoxで再利用)
|
||||
- **JIT統計**: 70%(ObservabilityBoxで拡張)
|
||||
- **VM/JIT実行**: 100%(そのまま使用)
|
||||
|
||||
### 新規実装
|
||||
- **PythonParserBox**: 30%(pyo3部分は既存)
|
||||
- **Py2NyASTBox**: 100%新規
|
||||
- **PyRuntimeBox**: 100%新規
|
||||
|
||||
## 🎯 Phase 1でサポートする機能(Codex先生推奨)
|
||||
|
||||
### 必須実装
|
||||
1. **LEGB + locals/freevars** - スコーピング規則
|
||||
2. **デフォルト引数の評価タイミング** - 定義時評価
|
||||
3. **イテレータベースのfor文**
|
||||
4. **for/else + while/else**
|
||||
5. **Python真偽値判定**
|
||||
6. **短絡評価**
|
||||
|
||||
### サポートする文
|
||||
- def(関数定義)
|
||||
- if/elif/else
|
||||
- for(else節対応)
|
||||
- while(else節対応)
|
||||
- break/continue
|
||||
- return
|
||||
|
||||
### サポートする式
|
||||
- 算術演算子(+,-,*,/,//,%)
|
||||
- 比較演算子(==,!=,<,>,<=,>=)
|
||||
- 論理演算子(and,or,not)
|
||||
- 関数呼び出し
|
||||
- リテラル(数値/文字列/bool)
|
||||
|
||||
## 📈 成功指標(2週間後)
|
||||
|
||||
### 定量的
|
||||
- **関数コンパイル率**: 70%以上(Phase 1機能)
|
||||
- **実行速度**: 純Pythonループで2倍以上
|
||||
- **メモリ効率**: CPython比50%削減
|
||||
|
||||
### 定性的
|
||||
- **統計可視化**: JSONL形式で全実行を記録
|
||||
- **デバッグ容易性**: 関数単位でフォールバック理由明示
|
||||
- **将来拡張性**: Phase 2-4への明確な道筋
|
||||
|
||||
## 🔧 実装例(最終形)
|
||||
|
||||
```nyash
|
||||
// Nyashから使用
|
||||
local py = new PythonParserBox()
|
||||
local converter = new Py2NyASTBox()
|
||||
local builder = new MirBuilderBox()
|
||||
local runtime = new PyRuntimeBox()
|
||||
local stats = new ObservabilityBox()
|
||||
|
||||
// Pythonコードをコンパイル・実行
|
||||
local code = "def fib(n): return n if n <= 1 else fib(n-1) + fib(n-2)"
|
||||
local json_ast = py.parse_to_json(code)
|
||||
local ny_ast = converter.convert(json_ast)
|
||||
local mir = builder.build(ny_ast)
|
||||
|
||||
// 実行(自動的にJIT/VMで高速化)
|
||||
local result = runtime.execute_function("fib", [10])
|
||||
print(result) // 55
|
||||
|
||||
// 統計出力
|
||||
print(stats.output_jsonl())
|
||||
// {"mod":"test","func":"fib","attempt":1,"jitted":true,"native":true}
|
||||
```
|
||||
|
||||
## 🚨 重要な設計判断
|
||||
|
||||
### 1. 関数単位の境界
|
||||
- ファイル単位ではなく**関数単位**でコンパイル/フォールバック
|
||||
- 未対応機能を含む関数のみCPython実行
|
||||
|
||||
### 2. Python 3.11固定
|
||||
- AST安定性の確保
|
||||
- 将来のバージョンアップは別Phase
|
||||
|
||||
### 3. 箱境界の明確化
|
||||
- 各Boxは単一責任
|
||||
- 相互依存を最小化
|
||||
- テスト可能な粒度
|
||||
|
||||
### 4. 既存資産の最大活用
|
||||
- MirBuilder/VM/JITはそのまま使用
|
||||
- 新規実装は変換層のみ
|
||||
|
||||
## 🎉 期待される成果
|
||||
|
||||
### 即時的効果(2週間後)
|
||||
- Pythonコードの70%がNyashで高速実行
|
||||
- バグ検出力の飛躍的向上(Differential Testing)
|
||||
- 統計による最適化ポイントの可視化
|
||||
|
||||
### 長期的効果
|
||||
- Python→Nyash→Native の世界初パイプライン確立
|
||||
- Nyash言語の成熟度向上
|
||||
- エコシステムの爆発的拡大
|
||||
|
||||
## 📝 次のステップ
|
||||
|
||||
1. **Phase 10.7完了確認** - JIT統計JSONの安定化
|
||||
2. **PythonParserBox実装開始** - pyo3統合から着手
|
||||
3. **テストコーパス準備** - Python標準ライブラリから抜粋
|
||||
|
||||
---
|
||||
|
||||
**作成者**: Claude(Claude Code)
|
||||
**承認者**: ChatGPT5(予定)
|
||||
**開始予定**: Phase 10.7完了直後
|
||||
@ -0,0 +1,602 @@
|
||||
# Python統合マイルストーン(M0〜M6)
|
||||
|
||||
**作成**: 2025-10-02
|
||||
**ソース**: ChatGPT Pro UltraThink Mode
|
||||
**ステータス**: 計画・Phase 15完了後に実装
|
||||
|
||||
---
|
||||
|
||||
## 📋 概要
|
||||
|
||||
Python-Hakorune統合を**段階的に**進めるためのマイルストーン定義です。
|
||||
最小から始めて、機能を段階的に追加していきます。
|
||||
|
||||
---
|
||||
|
||||
## 🎯 M0: PyRuntimeBox の最小化
|
||||
|
||||
### 目的
|
||||
`import("math")/call("sqrt")` が走る最小実装
|
||||
|
||||
### 成果物
|
||||
- [ ] PyRuntimeBoxの基本実装
|
||||
- [ ] PyFunctionBoxの基本実装
|
||||
- [ ] math.sqrtの実行確認
|
||||
|
||||
### 実装内容
|
||||
|
||||
#### PyRuntimeBox(最小版)
|
||||
```rust
|
||||
pub struct PyRuntimeBox {
|
||||
py: GILGuard,
|
||||
modules: HashMap<String, Py<PyModule>>,
|
||||
}
|
||||
|
||||
impl PyRuntimeBox {
|
||||
pub fn init() -> Self {
|
||||
pyo3::prepare_freethreaded_python();
|
||||
let gil = Python::acquire_gil();
|
||||
PyRuntimeBox {
|
||||
py: gil,
|
||||
modules: HashMap::new(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn import(&mut self, name: &str) -> PyModuleBox {
|
||||
let py = self.py.python();
|
||||
let module = PyModule::import(py, name).unwrap();
|
||||
self.modules.insert(name.to_string(), module.into());
|
||||
PyModuleBox::new(module)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### テストケース
|
||||
```hakorune
|
||||
using "python"
|
||||
|
||||
box Main {
|
||||
flow main() {
|
||||
let py = PyRuntimeBox();
|
||||
let math = py.import("math");
|
||||
let sqrt = math.get("sqrt");
|
||||
let result = sqrt.exec([2.0]);
|
||||
assert(result.to_float() == 1.4142135623730951);
|
||||
py.fini();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Capability/Contract
|
||||
- Capability/Contractは**ログのみ**(観測)
|
||||
- `HAKO_TRACE_EFFECTS=1` で呼び出しログ記録
|
||||
|
||||
### DoD(完了定義)
|
||||
- ✅ math.sqrt(2.0)が正常実行
|
||||
- ✅ 結果が正しい値を返す
|
||||
- ✅ メモリリークなし
|
||||
- ✅ スモークテスト追加
|
||||
|
||||
### 期間
|
||||
**1週間**
|
||||
|
||||
---
|
||||
|
||||
## 🛡️ M1: Capability ゲート
|
||||
|
||||
### 目的
|
||||
**ホワイトリスト**運用開始
|
||||
|
||||
### 成果物
|
||||
- [ ] Capability管理機構
|
||||
- [ ] hako.toml設定サポート
|
||||
- [ ] 違反時のエラーハンドリング
|
||||
|
||||
### 実装内容
|
||||
|
||||
#### hako.toml設定
|
||||
```toml
|
||||
[box.PyRuntimeBox.capabilities]
|
||||
allow = [
|
||||
"py.import:math",
|
||||
"py.import:json",
|
||||
"py.time:monotonic"
|
||||
]
|
||||
deny = [
|
||||
"py.subprocess",
|
||||
"py.net"
|
||||
]
|
||||
enforce = true
|
||||
```
|
||||
|
||||
#### Capability検証
|
||||
```rust
|
||||
impl PyRuntimeBox {
|
||||
pub fn import(&mut self, name: &str) -> Result<PyModuleBox> {
|
||||
// Capability確認
|
||||
if !self.capabilities.allows_import(name) {
|
||||
return Err(CapabilityError::ImportDenied(name.to_string()));
|
||||
}
|
||||
|
||||
// 通常のimport処理
|
||||
// ...
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### テストケース
|
||||
```hakorune
|
||||
using "python"
|
||||
|
||||
box Main {
|
||||
flow main() {
|
||||
let py = PyRuntimeBox();
|
||||
|
||||
// OK: 許可されたモジュール
|
||||
let math = py.import("math");
|
||||
|
||||
// ERROR: 拒否されたモジュール
|
||||
try {
|
||||
let subprocess = py.import("subprocess");
|
||||
} catch(e) {
|
||||
assert(e.type == "CapabilityError");
|
||||
}
|
||||
|
||||
py.fini();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### トグル
|
||||
```bash
|
||||
# Dev: 違反時fail-fast
|
||||
HAKO_PLUGIN_CAPS_ENFORCE=1
|
||||
|
||||
# Prod: 違反時警告(継続)
|
||||
HAKO_PLUGIN_CAPS_ENFORCE=0
|
||||
```
|
||||
|
||||
### DoD(完了定義)
|
||||
- ✅ allow/denyリスト動作確認
|
||||
- ✅ 違反時の適切なエラー
|
||||
- ✅ hako.toml読み込み動作
|
||||
- ✅ トグル切り替え動作
|
||||
|
||||
### 期間
|
||||
**1-2週間**
|
||||
|
||||
---
|
||||
|
||||
## ✅ M2: Contract 検証
|
||||
|
||||
### 目的
|
||||
`pre/post` 条件検証の実装
|
||||
|
||||
### 成果物
|
||||
- [ ] Contract検証機構
|
||||
- [ ] pre条件検証(引数チェック)
|
||||
- [ ] post条件検証(返り値チェック)
|
||||
|
||||
### 実装内容
|
||||
|
||||
#### Contract定義
|
||||
```toml
|
||||
[contracts.PyFunctionBox.exec]
|
||||
pre = [
|
||||
"args.len <= 8",
|
||||
"bytes_total <= 1_000_000"
|
||||
]
|
||||
post = [
|
||||
"result.size <= 1_000_000",
|
||||
"no_exception",
|
||||
"allow_none = true"
|
||||
]
|
||||
```
|
||||
|
||||
#### Contract検証(Python側wrapper)
|
||||
```python
|
||||
# hakorune_contract.py
|
||||
def verify_contract(func, pre_conditions, post_conditions):
|
||||
def wrapper(*args, **kwargs):
|
||||
# Pre条件検証
|
||||
if len(args) > 8:
|
||||
raise ContractViolation("args.len > 8")
|
||||
|
||||
total_bytes = sum(sys.getsizeof(a) for a in args)
|
||||
if total_bytes > 1_000_000:
|
||||
raise ContractViolation("bytes_total > 1_000_000")
|
||||
|
||||
# 実行
|
||||
result = func(*args, **kwargs)
|
||||
|
||||
# Post条件検証
|
||||
if sys.getsizeof(result) > 1_000_000:
|
||||
raise ContractViolation("result.size > 1_000_000")
|
||||
|
||||
return result
|
||||
|
||||
return wrapper
|
||||
```
|
||||
|
||||
#### テストケース
|
||||
```hakorune
|
||||
using "python"
|
||||
|
||||
box Main {
|
||||
flow main() {
|
||||
let py = PyRuntimeBox();
|
||||
|
||||
// OK: Contract満たす
|
||||
let math = py.import("math");
|
||||
let sqrt = math.get("sqrt");
|
||||
let r1 = sqrt.exec([2.0]);
|
||||
|
||||
// ERROR: 引数多すぎ
|
||||
try {
|
||||
let r2 = sqrt.exec([1,2,3,4,5,6,7,8,9]);
|
||||
} catch(e) {
|
||||
assert(e.type == "ContractViolation");
|
||||
}
|
||||
|
||||
py.fini();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### DoD(完了定義)
|
||||
- ✅ pre条件違反検出
|
||||
- ✅ post条件違反検出
|
||||
- ✅ ErrorBox化
|
||||
- ✅ トグル切り替え(strict/warn)
|
||||
|
||||
### 期間
|
||||
**2週間**
|
||||
|
||||
---
|
||||
|
||||
## 🎲 M3: Deterministic
|
||||
|
||||
### 目的
|
||||
`random/time/os.urandom` に shims を適用
|
||||
|
||||
### 成果物
|
||||
- [ ] Deterministic shims実装
|
||||
- [ ] random固定化
|
||||
- [ ] time論理クロック化
|
||||
- [ ] スモーク再現性確認
|
||||
|
||||
### 実装内容
|
||||
|
||||
#### Deterministic Random
|
||||
```python
|
||||
# hakorune_deterministic.py
|
||||
class DeterministicRandom:
|
||||
def __init__(self, seed=42):
|
||||
self._rng = random.Random(seed)
|
||||
|
||||
def random(self):
|
||||
return self._rng.random()
|
||||
|
||||
def randint(self, a, b):
|
||||
return self._rng.randint(a, b)
|
||||
|
||||
# モンキーパッチ
|
||||
if os.getenv('HAKO_DETERMINISTIC') == '1':
|
||||
random.random = DeterministicRandom().random
|
||||
```
|
||||
|
||||
#### Logical Clock
|
||||
```python
|
||||
class LogicalClock:
|
||||
def __init__(self):
|
||||
self._tick = 0
|
||||
|
||||
def monotonic(self):
|
||||
self._tick += 1
|
||||
return float(self._tick)
|
||||
|
||||
def time(self):
|
||||
return self.monotonic()
|
||||
|
||||
# モンキーパッチ
|
||||
if os.getenv('HAKO_DETERMINISTIC') == '1':
|
||||
time.monotonic = LogicalClock().monotonic
|
||||
```
|
||||
|
||||
#### テストケース
|
||||
```hakorune
|
||||
using "python"
|
||||
|
||||
box Main {
|
||||
flow main() {
|
||||
let py = PyRuntimeBox();
|
||||
|
||||
// Deterministic mode
|
||||
let random = py.import("random");
|
||||
|
||||
// 同じseedなら同じ結果
|
||||
let r1 = random.get("random").exec([]);
|
||||
let r2 = random.get("random").exec([]);
|
||||
assert(r1 == r2); // Deterministic!
|
||||
|
||||
py.fini();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### トグル
|
||||
```bash
|
||||
# Deterministic モード有効化
|
||||
HAKO_DETERMINISTIC=1
|
||||
HAKO_TRACE_EFFECTS=1 # 効果ログ収集
|
||||
```
|
||||
|
||||
### DoD(完了定義)
|
||||
- ✅ random固定化動作
|
||||
- ✅ time論理クロック動作
|
||||
- ✅ スモーク再現性100%
|
||||
- ✅ トレースログ記録
|
||||
|
||||
### 期間
|
||||
**1-2週間**
|
||||
|
||||
---
|
||||
|
||||
## 🏗️ M4: Type/Instance 反射
|
||||
|
||||
### 目的
|
||||
クラス→`PyTypeBox`、インスタンス→`PyInstanceBox`
|
||||
|
||||
### 成果物
|
||||
- [ ] PyTypeBox実装
|
||||
- [ ] PyInstanceBox実装
|
||||
- [ ] get/setField統一
|
||||
- [ ] call_method統一
|
||||
|
||||
### 実装内容
|
||||
|
||||
#### PyTypeBox
|
||||
```rust
|
||||
pub struct PyTypeBox {
|
||||
py_type: Py<PyType>,
|
||||
}
|
||||
|
||||
impl PyTypeBox {
|
||||
pub fn get_name(&self) -> String {
|
||||
// クラス名取得
|
||||
}
|
||||
|
||||
pub fn get_bases(&self) -> Vec<PyTypeBox> {
|
||||
// 基底クラスリスト
|
||||
}
|
||||
|
||||
pub fn new_instance(&self, args: Vec<Value>) -> PyInstanceBox {
|
||||
// インスタンス化
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### PyInstanceBox
|
||||
```rust
|
||||
pub struct PyInstanceBox {
|
||||
py_obj: Py<PyAny>,
|
||||
}
|
||||
|
||||
impl PyInstanceBox {
|
||||
pub fn get_field(&self, name: &str) -> Value {
|
||||
// フィールド取得
|
||||
}
|
||||
|
||||
pub fn set_field(&self, name: &str, value: Value) {
|
||||
// フィールド設定
|
||||
}
|
||||
|
||||
pub fn call_method(&self, name: &str, args: Vec<Value>) -> Value {
|
||||
// メソッド呼び出し
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### テストケース
|
||||
```hakorune
|
||||
using "python"
|
||||
|
||||
box Main {
|
||||
flow main() {
|
||||
let py = PyRuntimeBox();
|
||||
|
||||
// クラス取得
|
||||
let code = "
|
||||
class Player:
|
||||
def __init__(self, name):
|
||||
self.name = name
|
||||
self.health = 100
|
||||
|
||||
def heal(self, amount):
|
||||
self.health += amount
|
||||
";
|
||||
py.exec(code);
|
||||
let PlayerClass = py.get("Player"); // PyTypeBox
|
||||
|
||||
// インスタンス化
|
||||
let player = PlayerClass.new_instance(["Alice"]); // PyInstanceBox
|
||||
|
||||
// フィールドアクセス
|
||||
let name = player.get_field("name");
|
||||
assert(name == "Alice");
|
||||
|
||||
// メソッド呼び出し
|
||||
player.call_method("heal", [20]);
|
||||
let health = player.get_field("health");
|
||||
assert(health == 120);
|
||||
|
||||
py.fini();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### DoD(完了定義)
|
||||
- ✅ PyTypeBox動作確認
|
||||
- ✅ PyInstanceBox動作確認
|
||||
- ✅ get/setField統一動作
|
||||
- ✅ call_method統一動作
|
||||
|
||||
### 期間
|
||||
**2-3週間**
|
||||
|
||||
---
|
||||
|
||||
## 🔄 M5: ABI 昇格
|
||||
|
||||
### 目的
|
||||
C ABI→Hakorune ABI(vtable)へPoC
|
||||
|
||||
### 成果物
|
||||
- [ ] Hakorune ABI実装
|
||||
- [ ] vtable生成
|
||||
- [ ] C ABI互換レイヤー
|
||||
- [ ] 段階切り替え確認
|
||||
|
||||
### 実装内容
|
||||
|
||||
#### Hakorune ABI(vtable)
|
||||
```rust
|
||||
#[repr(C)]
|
||||
pub struct HakoruneABI {
|
||||
vtable: *const VTable,
|
||||
data: *mut c_void,
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
pub struct VTable {
|
||||
init: extern "C" fn(*mut c_void),
|
||||
fini: extern "C" fn(*mut c_void),
|
||||
invoke: extern "C" fn(*mut c_void, method_id: u32, args: *const TLV) -> TLV,
|
||||
}
|
||||
```
|
||||
|
||||
#### トグル切り替え
|
||||
```bash
|
||||
# C ABI使用
|
||||
HAKO_ABI_VTABLE=0
|
||||
|
||||
# Hakorune ABI使用
|
||||
HAKO_ABI_VTABLE=1
|
||||
HAKO_ABI_STRICT=1 # フォールバック禁止
|
||||
```
|
||||
|
||||
#### テストケース
|
||||
```hakorune
|
||||
using "python"
|
||||
|
||||
box Main {
|
||||
flow main() {
|
||||
// どちらのABIでも同じコードが動く
|
||||
let py = PyRuntimeBox();
|
||||
let math = py.import("math");
|
||||
let sqrt = math.get("sqrt");
|
||||
let result = sqrt.exec([2.0]);
|
||||
assert(result.to_float() == 1.4142135623730951);
|
||||
py.fini();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### DoD(完了定義)
|
||||
- ✅ Hakorune ABI動作確認
|
||||
- ✅ C ABI互換性維持
|
||||
- ✅ トグル切り替え動作
|
||||
- ✅ パフォーマンス劣化なし
|
||||
|
||||
### 期間
|
||||
**3-4週間**
|
||||
|
||||
---
|
||||
|
||||
## 📦 M6: AOT/EXE の包み込み(10.5b連動)
|
||||
|
||||
### 目的
|
||||
Python依存を**スタティック or 埋め込み**方針で詰め、`hako` EXE生成ラインに統合
|
||||
|
||||
### 成果物
|
||||
- [ ] スタティックリンク対応
|
||||
- [ ] 埋め込みPython対応
|
||||
- [ ] EXE生成パイプライン統合
|
||||
- [ ] クロスプラットフォーム確認
|
||||
|
||||
### 実装内容
|
||||
|
||||
#### スタティックリンク
|
||||
```toml
|
||||
# Cargo.toml
|
||||
[dependencies]
|
||||
pyo3 = { version = "0.20", features = ["auto-initialize", "extension-module"] }
|
||||
|
||||
[build-dependencies]
|
||||
pyo3-build-config = "0.20"
|
||||
```
|
||||
|
||||
#### 埋め込みPython
|
||||
```rust
|
||||
// Python標準ライブラリを埋め込み
|
||||
#[cfg(feature = "embed-python")]
|
||||
const PYTHON_STDLIB: &[u8] = include_bytes!("python3.11.zip");
|
||||
```
|
||||
|
||||
#### EXE生成
|
||||
```bash
|
||||
# AOTコンパイル
|
||||
hakorune --backend llvm --embed-python script.hkr -o app
|
||||
|
||||
# 生成されたEXE
|
||||
./app # Python依存なしで実行可能
|
||||
```
|
||||
|
||||
### プラットフォーム対応
|
||||
|
||||
| Platform | Python | 方式 |
|
||||
|----------|--------|------|
|
||||
| Linux | 3.8+ | 動的/静的両対応 |
|
||||
| macOS | 3.8+ | 動的優先 |
|
||||
| Windows | 3.8+ | 埋め込み推奨 |
|
||||
|
||||
### DoD(完了定義)
|
||||
- ✅ Linux EXE生成
|
||||
- ✅ macOS EXE生成
|
||||
- ✅ Windows EXE生成
|
||||
- ✅ Python依存最小化
|
||||
- ✅ サイズ最適化
|
||||
|
||||
### 期間
|
||||
**4-6週間**
|
||||
|
||||
---
|
||||
|
||||
## 📊 全体スケジュール
|
||||
|
||||
| マイルストーン | 期間 | 開始条件 |
|
||||
|--------------|------|---------|
|
||||
| M0: PyRuntimeBox最小化 | 1週間 | Phase 15完了 |
|
||||
| M1: Capabilityゲート | 1-2週間 | M0完了 |
|
||||
| M2: Contract検証 | 2週間 | M1完了 |
|
||||
| M3: Deterministic | 1-2週間 | M2完了 |
|
||||
| M4: Type/Instance反射 | 2-3週間 | M3完了 |
|
||||
| M5: ABI昇格 | 3-4週間 | M4完了 |
|
||||
| M6: AOT/EXE統合 | 4-6週間 | M5完了 |
|
||||
|
||||
**合計**: 約3-5ヶ月
|
||||
|
||||
---
|
||||
|
||||
## 🔗 関連ドキュメント
|
||||
|
||||
- [強化版アーキテクチャv2](../design/enhanced-architecture-v2.md) - 設計詳細
|
||||
- [メタ設定例](../design/meta-config-examples.md) - hako.toml設定例
|
||||
- [リスクと対策](../design/risks-and-mitigations.md) - 既知のリスク
|
||||
- [Phase 20 README](../README.md) - 全体概要
|
||||
|
||||
---
|
||||
|
||||
**最終更新**: 2025-10-02
|
||||
**作成者**: ChatGPT Pro (UltraThink Mode)
|
||||
**ステータス**: 計画・Phase 15完了後に実装
|
||||
@ -0,0 +1,207 @@
|
||||
# PythonParserBox設計提案 - CPythonパーサーを使ったPython→Nyash変換
|
||||
|
||||
## 概要
|
||||
CPythonの公式パーサーを活用して、PythonコードをNyashで直接実行可能にする革命的なアプローチ。
|
||||
PythonコードをNyashのAST/MIRに変換し、Nyashの最適化・JITコンパイルの恩恵を受けられるようにする。
|
||||
|
||||
## アーキテクチャ
|
||||
|
||||
### 1. PythonParserBox(ビルトインBox)
|
||||
```nyash
|
||||
// 使用例
|
||||
local py_parser = new PythonParserBox()
|
||||
|
||||
// Pythonコードを直接パース
|
||||
local ast = py_parser.parse("""
|
||||
def calculate(x, y):
|
||||
return x * 2 + y
|
||||
|
||||
result = calculate(10, 5)
|
||||
""")
|
||||
|
||||
// NyashのASTに変換
|
||||
local nyash_ast = py_parser.to_nyash_ast(ast)
|
||||
|
||||
// 直接実行も可能
|
||||
local result = py_parser.run(python_code)
|
||||
```
|
||||
|
||||
### 2. 実装構造
|
||||
```rust
|
||||
pub struct PythonParserBox {
|
||||
base: BoxBase,
|
||||
parser: CPythonParser, // CPythonの公式パーサー使用
|
||||
}
|
||||
|
||||
impl PythonParserBox {
|
||||
// Python → Python AST
|
||||
pub fn parse(&self, code: &str) -> Box<dyn NyashBox> {
|
||||
let py_ast = self.parser.parse_string(code);
|
||||
Box::new(PythonAstBox { ast: py_ast })
|
||||
}
|
||||
|
||||
// Python AST → Nyash AST
|
||||
pub fn to_nyash_ast(&self, py_ast: &PythonAstBox) -> Box<dyn NyashBox> {
|
||||
let converter = AstConverter::new();
|
||||
converter.convert_python_to_nyash(py_ast)
|
||||
}
|
||||
|
||||
// Python AST → MIR(直接変換)
|
||||
pub fn to_mir(&self, py_ast: &PythonAstBox) -> MirModule {
|
||||
let mut builder = MirBuilder::new();
|
||||
for func in py_ast.functions() {
|
||||
self.convert_function_to_mir(&mut builder, func);
|
||||
}
|
||||
builder.build()
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## AST変換マッピング
|
||||
|
||||
### Python → Nyash対応表
|
||||
| Python AST | Nyash AST | 説明 |
|
||||
|------------|-----------|------|
|
||||
| FunctionDef | FunctionDecl | 関数定義 |
|
||||
| BinOp | BinaryOp | 二項演算 |
|
||||
| Call | MethodCall | 関数呼び出し |
|
||||
| Assign | Assignment | 代入 |
|
||||
| If | IfStatement | 条件分岐 |
|
||||
| While/For | LoopStatement | ループ |
|
||||
| Return | ReturnStatement | return文 |
|
||||
| Import | NewBox/LoadPlugin | import → Box化 |
|
||||
|
||||
### 型変換戦略
|
||||
```rust
|
||||
// Python動的型 → Nyash Box
|
||||
match py_value {
|
||||
PyInt(n) => IntegerBox::new(n),
|
||||
PyFloat(f) => FloatBox::new(f),
|
||||
PyStr(s) => StringBox::new(s),
|
||||
PyList(items) => ArrayBox::from_iter(items),
|
||||
PyDict(map) => MapBox::from_iter(map),
|
||||
PyObject(obj) => PythonObjectBox::new(obj), // 変換不能な場合
|
||||
}
|
||||
```
|
||||
|
||||
## MIR生成例
|
||||
|
||||
### Pythonコード
|
||||
```python
|
||||
def calculate(x, y):
|
||||
return x * 2 + y
|
||||
```
|
||||
|
||||
### 生成されるMIR
|
||||
```
|
||||
function calculate(%x, %y) {
|
||||
Load(%1, %x)
|
||||
Const(%2, 2)
|
||||
BinOp(%3, Mul, %1, %2)
|
||||
Load(%4, %y)
|
||||
BinOp(%5, Add, %3, %4)
|
||||
Return(%5)
|
||||
}
|
||||
```
|
||||
|
||||
## 利点
|
||||
|
||||
1. **完全な互換性**: CPython公式パーサーで100%正確なパース
|
||||
2. **統一最適化**: PythonコードもNyashのMIR最適化パイプラインを通る
|
||||
3. **JIT/AOTコンパイル**: PythonコードをネイティブコードにJIT/AOTコンパイル可能
|
||||
4. **段階的移行**: 既存Pythonコードを徐々にNyashに移行
|
||||
5. **デバッグ統一**: Nyashのデバッグツールでpythonコードもデバッグ可能
|
||||
|
||||
## 実装フェーズ
|
||||
|
||||
### Phase 1: 基本パーサー統合
|
||||
- CPythonパーサーのFFIバインディング
|
||||
- parse()メソッドでPython ASTを取得
|
||||
- AST可視化(dump_ast)
|
||||
|
||||
### Phase 2: AST変換
|
||||
- Python AST → Nyash AST変換器
|
||||
- 基本的な文法要素のサポート
|
||||
- 型変換システム
|
||||
|
||||
### Phase 3: MIR直接生成
|
||||
- Python AST → MIR変換
|
||||
- Python特有の最適化(動的型推論等)
|
||||
- ベンチマーク
|
||||
|
||||
### Phase 4: エコシステム統合
|
||||
- NumPy等の主要ライブラリサポート
|
||||
- Python例外 → Nyashエラー変換
|
||||
- async/await対応
|
||||
- GIL管理の自動化
|
||||
|
||||
## 技術的課題と解決策
|
||||
|
||||
### 1. GIL(Global Interpreter Lock)
|
||||
- 解決策: PythonコードはGILスコープ内で実行
|
||||
- 将来: MIR変換後はGILフリーで実行可能
|
||||
|
||||
### 2. Python動的型とNyash Box型のマッピング
|
||||
- 解決策: 実行時型情報を保持するPythonObjectBox
|
||||
- 最適化: よく使う型(int, str等)は専用Boxに変換
|
||||
|
||||
### 3. Pythonモジュールシステム
|
||||
- 解決策: importをNyashのプラグインロードにマッピング
|
||||
- pip packages → Nyashプラグインとして扱う
|
||||
|
||||
## 実用例
|
||||
|
||||
### 機械学習コードの実行
|
||||
```nyash
|
||||
local ml_code = """
|
||||
import numpy as np
|
||||
from sklearn.linear_model import LinearRegression
|
||||
|
||||
# データ準備
|
||||
X = np.array([[1, 1], [1, 2], [2, 2], [2, 3]])
|
||||
y = np.dot(X, np.array([1, 2])) + 3
|
||||
|
||||
# モデル訓練
|
||||
model = LinearRegression()
|
||||
model.fit(X, y)
|
||||
|
||||
# 予測
|
||||
predictions = model.predict(np.array([[3, 5]]))
|
||||
print(f'Prediction: {predictions[0]}')
|
||||
"""
|
||||
|
||||
local py_parser = new PythonParserBox()
|
||||
local result = py_parser.run(ml_code)
|
||||
```
|
||||
|
||||
### Webアプリケーション
|
||||
```nyash
|
||||
local flask_app = """
|
||||
from flask import Flask, jsonify
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
@app.route('/api/hello/<name>')
|
||||
def hello(name):
|
||||
return jsonify({'message': f'Hello, {name}!'})
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run(port=5000)
|
||||
"""
|
||||
|
||||
local py_parser = new PythonParserBox()
|
||||
py_parser.run(flask_app) // FlaskアプリがNyash内で起動
|
||||
```
|
||||
|
||||
## 期待される効果
|
||||
|
||||
1. **パフォーマンス向上**: PythonコードがJITコンパイルされ高速化
|
||||
2. **メモリ効率**: NyashのGC/メモリ管理を活用
|
||||
3. **相互運用性**: Python↔Nyash↔Rust↔JS等の自由な組み合わせ
|
||||
4. **開発効率**: 既存Pythonライブラリをそのまま使える
|
||||
5. **将来性**: PythonコードをネイティブAOTコンパイル可能
|
||||
|
||||
## まとめ
|
||||
|
||||
PythonParserBoxは、Pythonの豊富なエコシステムとNyashの高性能実行エンジンを組み合わせる画期的なアプローチ。
|
||||
CPythonパーサーの信頼性とNyashのMIR/JIT最適化により、Pythonコードをより高速に、より効率的に実行できる。
|
||||
@ -0,0 +1,148 @@
|
||||
# PythonParserBox統合実装計画 - エキスパート評価後の最終版
|
||||
作成日: 2025-08-27
|
||||
|
||||
## 🎯 革命的な3つの価値
|
||||
|
||||
### 1. Pythonエコシステムの即座活用
|
||||
- 既存のPythonライブラリをNyashから直接利用可能
|
||||
- 段階的な移行パスの提供
|
||||
|
||||
### 2. Nyashパーサーのバグ自動検証(Differential Testing)
|
||||
- **世界中のPythonコードがNyashのテストケースに!**
|
||||
- CPythonをオラクルとして使用、出力・戻り値・例外を自動比較
|
||||
- 微妙なセマンティクスバグを大量に発見可能
|
||||
|
||||
### 3. 言語成熟度の飛躍的向上
|
||||
- 実用的なPythonコードでNyashをストレステスト
|
||||
- 発見されたバグ数が成熟度向上の定量的指標
|
||||
|
||||
## 🏆 エキスパート評価サマリー
|
||||
|
||||
### Gemini先生の評価
|
||||
**「非常に野心的で、言語の成熟度を飛躍的に高める可能性を秘めた素晴らしい計画」**
|
||||
|
||||
- 技術的に健全なアプローチ
|
||||
- pyo3経由のCPythonパーサー利用は最も確実
|
||||
- Differential Testingは極めて強力な手法
|
||||
|
||||
### Codex先生の評価
|
||||
**「Sound approach with strategic strength」**
|
||||
|
||||
- 関数単位フォールバックが実用的かつ効果的
|
||||
- Python 3.11固定でAST安定性確保
|
||||
- テレメトリー重視で継続的改善可能
|
||||
|
||||
## 🔑 統合された5つの核心戦略
|
||||
|
||||
### 1. 関数単位フォールバック(両エキスパート一致)
|
||||
```python
|
||||
def supported_function(): # → Nyash MIR/JIT
|
||||
return x + y
|
||||
|
||||
def unsupported_function(): # → CPython exec
|
||||
yield from generator # Phase 1では未対応
|
||||
```
|
||||
|
||||
### 2. Python 3.11固定
|
||||
- AST安定性確保(3.8 Constant統一、3.10 match/case、3.12位置情報)
|
||||
- `py_version`と`ast_format`をJSON IRに埋め込む
|
||||
|
||||
### 3. 意味論の正確な実装優先
|
||||
Phase 1必須要素(Codex先生強調):
|
||||
- LEGB + locals/freevars(スコーピング)
|
||||
- デフォルト引数の評価タイミング(定義時)
|
||||
- イテレータベースのfor文
|
||||
- for/else + while/else(Python独特)
|
||||
- Python真偽値判定(`__bool__` → `__len__`)
|
||||
- 短絡評価(and/or)
|
||||
|
||||
### 4. GIL管理の最小化
|
||||
```rust
|
||||
// GILは最小限に!
|
||||
let json_ast = Python::with_gil(|py| {
|
||||
py_helper.parse_to_json(py, code) // Python側でJSON生成
|
||||
})?;
|
||||
|
||||
// GIL外でRust処理
|
||||
let nyash_ast = py.allow_threads(|| {
|
||||
convert_json_to_nyash(json_ast)
|
||||
});
|
||||
```
|
||||
|
||||
### 5. テレメトリー基盤
|
||||
```bash
|
||||
[PythonParser] Module: example.py (Python 3.11)
|
||||
Functions: 10 total
|
||||
Compiled: 7 (70%)
|
||||
Fallback: 3 (30%)
|
||||
- async_function: unsupported node 'AsyncFunctionDef' at line 23
|
||||
```
|
||||
|
||||
## 📋 実装フェーズ(詳細版)
|
||||
|
||||
### Phase 0: 準備(1週間)
|
||||
- [ ] Python 3.11.9環境固定
|
||||
- [ ] テレメトリー基盤構築
|
||||
- [ ] Differential Testingフレームワーク
|
||||
- [ ] JSON IR仕様策定
|
||||
|
||||
### Phase 1: Core Subset(2週間)
|
||||
- [ ] pyo3統合(prepare_freethreaded_python)
|
||||
- [ ] 関数単位コンパイル判定器
|
||||
- [ ] 基本構文(def/if/for/while/return)
|
||||
- [ ] 意味論必須要素の実装
|
||||
- [ ] CPythonとの出力比較テスト
|
||||
|
||||
### Phase 2: Data Model(3週間)
|
||||
- [ ] 特殊メソッドマッピング
|
||||
- [ ] list/dict/tuple実装
|
||||
- [ ] 演算子オーバーロード
|
||||
|
||||
### Phase 3: Advanced Features(1ヶ月)
|
||||
- [ ] 例外処理(try/except)
|
||||
- [ ] with文、ジェネレータ
|
||||
- [ ] 内包表記、デコレータ
|
||||
|
||||
## 📊 成功の測定基準
|
||||
|
||||
### 定量的指標
|
||||
| 指標 | 目標 | 測定方法 |
|
||||
|------|------|----------|
|
||||
| カバレッジ率 | 70%以上 | コンパイル済み vs フォールバック関数 |
|
||||
| 性能向上 | 2-10倍 | 純Pythonループのベンチマーク |
|
||||
| バグ発見数 | 10+件/Phase | Differential Testing |
|
||||
| エコシステム | 1以上 | 動作する有名ライブラリ数 |
|
||||
|
||||
### マイルストーン
|
||||
- Phase 1: "Hello from Python in Nyash"が動作
|
||||
- Phase 2: scikit-learnの基本アルゴリズムが動作
|
||||
- Phase 3: FlaskのHello Worldが動作
|
||||
- Phase 4: PyPIトップ100の30%が基本動作
|
||||
|
||||
## 🚨 注意すべき意味論の違い(トップ5)
|
||||
|
||||
1. **制御フロー**: for/else, while/else
|
||||
2. **スコープ規則**: LEGB、global/nonlocal
|
||||
3. **数値演算**: / (true division) vs //
|
||||
4. **関数定義**: デフォルト引数は定義時評価
|
||||
5. **真偽値判定**: Pythonの__bool__/__len__ルール
|
||||
|
||||
## 🎉 期待されるインパクト
|
||||
|
||||
### 技術的成果
|
||||
- Pythonエコシステムの活用
|
||||
- Nyashパーサーの品質向上
|
||||
- 性能最適化の実証
|
||||
|
||||
### 戦略的価値
|
||||
- 言語成熟度の飛躍的向上
|
||||
- 開発者コミュニティの拡大
|
||||
- 実用アプリケーション開発の加速
|
||||
|
||||
## 📝 結論
|
||||
|
||||
PythonParserBoxは、単なる機能追加ではなく、**Nyash言語のテスト、デバッグ、エコシステム獲得を同時に加速させる極めて戦略的なプロジェクト**。
|
||||
|
||||
両エキスパートの技術的評価と具体的な実装指針により、実現可能性が確認され、明確な実装パスが定まった。
|
||||
|
||||
**「Everything is Box」哲学を、言語の壁を超えて実現する革命的な一歩。**
|
||||
Reference in New Issue
Block a user