Phase 10_6b scheduler complete; 10_4 GC hooks + counting/strict tracing; 10_c minimal JIT path (i64/bool consts, binop/compare/return, hostcall opt-in); docs & examples; add Phase 10.7 roadmap (JIT branch wiring + minimal ABI).

This commit is contained in:
Moe Charm
2025-08-27 17:06:46 +09:00
parent de03514085
commit ddae7fe1fc
67 changed files with 4618 additions and 268 deletions

View File

@ -0,0 +1,43 @@
# Phase 10.1 - 言語間相互運用と革命的統合
このフォルダには、Nyashと他言語特にPythonとの相互運用に関する設計と実装計画が含まれています。
## 📁 ファイル一覧
### 1. python_parser_box_design.txt
- PythonParserBoxの基本設計提案
- CPythonパーサーを使ったPython→Nyash変換の革命的アプローチ
- AST/MIR変換の概要
- 使用例と期待される効果
### 2. python_parser_box_implementation_plan.txt
- Gemini先生とCodex先生からのフィードバックを統合した実装計画
- 技術的な実装方針pyo3使用
- 最小実装セットの定義
- Phase別の実装ロードマップ
- 現実的な性能目標
### 3. chatgpt5_original_idea.txtこの後作成
- ChatGPT5さんの最初のアイデア
- ForeignBox/ProxyBoxの概念
- 多言語統合の全体像
## 🎯 Phase 10.1の目標
1. **Pythonエコシステムの活用**: 既存のPythonライブラリをNyashから直接使用可能に
2. **性能向上**: PythonコードをMIR経由でJIT/AOTコンパイル
3. **段階的移行**: PythonプロジェクトをNyashへ徐々に移行可能
4. **統一実行環境**: Python/Nyash/Rust/JS等を自由に組み合わせ
## 🚀 次のステップ
1. Phase 1の基本実装開始pyo3統合
2. 最小限のPython AST→Nyash AST変換
3. 小さなベンチマークで性能測定
4. フィードバックに基づく改善
## 📝 関連ドキュメント
- 元の発想: `/mnt/c/git/nyash-project/nyash/docs/development/roadmap/native-plan/chatgpt5との会話.txt`
- Phase 10全体計画: `../phase-10/phase_10_cranelift_jit_backend.md`
- MIR仕様: `/mnt/c/git/nyash-project/nyash/docs/reference/mir/INSTRUCTION_SET.md`

View File

@ -0,0 +1,138 @@
# ChatGPT5の革命的アイデア - 多言語統合とBox化
## 元の発想
ChatGPT5さんの発想は「すべての言語をBoxで包んで統一的に扱う」という革命的なアプローチです。
これにより、Python、Rust、JavaScript、Java等の既存エコシステムをNyashから自然に利用できるようになります。
## 核心概念
### 1. ForeignBox - 外部リソースのBox化
```nyash
// 外部言語のオブジェクトをBoxとして扱う
box ForeignBox<T> {
private { handle } // 外部リソースへのハンドル
fini() {
ny_host_finalizer(me.handle) // 適切にリソース解放
}
}
```
### 2. ProxyBox - スレッドセーフな委譲
```nyash
// GILやイベントループを持つ言語用
box ProxyBox<T> {
private { bus, worker_id } // Bus経由で別スレッドに委譲
call(method, args) {
return me.bus.send_and_wait(me.worker_id, method, args)
}
}
```
## 言語別統合戦略ChatGPT5原案
### Python統合
- **課題**: GILGlobal Interpreter Lock
- **解決**: ProxyBoxでBus経由ワーカー委譲
- **実装**: CPython C-APIで`PyObject*`をForeignBoxに入れる
### JavaScript/Node.js統合
- **課題**: イベントループを壊さない
- **解決**: ProxyBoxpostMessage/uv_queue_work
- **短い同期関数**: ForeignBoxでも可
### Rust/C統合
- **最短パス**: C-ABI直接
- **Rust側**: `#[no_mangle] extern "C"`
- **所有権**: Nyash↔Rustのどちらかに寄せる二重所有禁止
### JVM/.NET統合
- **方式**: JNI/P-Invoke
- **要件**: Pinning必要
- **GC連携**: SafeHandle/PhantomReferenceでFinalizer橋渡し
### WASM統合
- **方式**: `ny_host_*`をimport
- **データ**: リニアメモリへBytes/Strで搬送
## 統一インターフェース設計
### NyIDLNyash Interface Definition Language
```idl
module ny {
box Image;
fn load(path: str) -> Image effects = io
fn resize(img: Image, w: i32, h: i32) -> Image effects = mut
fn width(img: look Image) -> i32 effects = pure
}
```
### 自動生成される要素
1. Nyash側extern宣言
2. C-ABIシム層
3. 各言語用スタブRust/Node/Python/JVM
4. ForeignBox/ProxyBoxラッパー
## 所有権と寿命管理
### One Strong Owner原則
- ForeignBoxは所有者1本NyashまたはA外部
- 弱参照は`weak/look`で管理
- 失効時はnull/false
### Finalizerの橋渡し
1. Nyash `fini` → `ny_host_finalizer`呼び出し
2. 外部GC/finalize → `ny_host_finalizer`経由でNyashのweakを失効
## 効果システムとの統合
```nyash
// 効果注釈でFFI境界の振る舞いを明示
extern fn py_numpy_matmul(a: ForeignBox<ndarray>, b: ForeignBox<ndarray>)
-> ForeignBox<ndarray> effects mut
extern fn rust_image_load(path: str)
-> ForeignBox<Image> effects io
extern fn js_fetch(url: str)
-> ProxyBox<Promise> effects io
```
## MIRレベルでの統合
### BoxCall命令の拡張
```
// 通常のBoxCall
BoxCall(%result, %box, "method", [%arg1, %arg2])
// ForeignBoxのメソッド呼び出し
BoxCall(%result, %foreign_box, "py_method", [%arg1])
// → 内部でFFI境界を越えて呼び出し
// ProxyBoxの非同期呼び出し
Send(%msg_id, %proxy_box, "method", [%args])
Recv(%result, %msg_id)
```
## 革命的な利点
1. **即座の多言語資産活用**: 既存ライブラリを「箱に詰めて」即Nyashで使える
2. **統一的な寿命管理**: 強1weak/lookfiniで外部リソースも確定的に回収
3. **配布の柔軟性**: WASM/VM/ネイティブのどれでも同じIDLから出荷
4. **MIR最適化の恩恵**: 外部言語呼び出しもMIRレベルで最適化可能
5. **段階的移行**: 既存プロジェクトを徐々にNyashに移行
## 実装優先順位
1. **Phase 1**: C/Rust統合最も単純
2. **Phase 2**: Python統合PythonParserBox
3. **Phase 3**: JavaScript/Node.js統合
4. **Phase 4**: JVM/.NET統合
5. **Phase 5**: 統一IDLと自動生成ツール
## まとめ
「すべてをBoxに閉じ込める」という設計を正式化することで、あらゆる言語→NyashとNyash→あらゆる実行系が綺麗に繋がる。
これはまさに「Everything is Box」哲学の究極の実現形態といえる。

View File

@ -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. GILGlobal 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コードをより高速に、より効率的に実行できる。

View File

@ -0,0 +1,143 @@
# PythonParserBox実装計画技術検証版
## エキスパートからのフィードバック統合
### Gemini先生の主要指摘
1. **FFI課題**: pyo3の活用で解決可能参照カウント管理、エラーハンドリング自動化
2. **意味論的ギャップ**: 最初は科学計算など特定ドメインのサブセットから開始
3. **GIL管理**: Boxレベルでの隠蔽は現実的かつ一般的
4. **ボトルネック**: FFI境界とデータ変換コスト → MIR変換で解決
5. **他言語展開**: 設計思想は汎用的、Ruby/JSにも応用可能
### Codex先生の実装提案
1. **安定API使用**: CPython内部APIではなく、Python `ast`モジュール→JSON経由
2. **段階的実装**: Phase 1でパーサー統合、Phase 2でMIR変換
3. **ゼロコピー戦略**: pyo3-numpy + PEP 3118バッファプロトコル
4. **現実的な性能目標**: 純Pythonループで2-10倍、NumPyは1.0-1.2倍
5. **最小実装セット**: 基本構造+演算+制御フローから開始
## 技術的実装方針
### 1. CPythonパーサー統合pyo3使用
```rust
// Cargo.toml
[dependencies]
pyo3 = { version = "0.22", features = ["auto-initialize"] }
pyo3-numpy = "0.22" // NumPy連携用
// Python側ヘルパーembedded
const PYTHON_HELPER: &str = r#"
import ast
import json
def parse_to_json(code, filename="<string>", mode="exec"):
tree = ast.parse(code, filename, mode)
return json.dumps(ast_to_dict(tree))
def ast_to_dict(node):
if isinstance(node, ast.AST):
fields = {f: ast_to_dict(getattr(node, f))
for f in node._fields}
fields['_type'] = node.__class__.__name__
return fields
elif isinstance(node, list):
return [ast_to_dict(x) for x in node]
else:
return node
"#;
```
### 2. 最小実装セットPhase 1-2
```
Phase 1 構造:
├─ Module
├─ FunctionDef (name, args, body)
├─ Return (value)
├─ Assign (targets, value)
└─ Expr (value)
Phase 1 式:
├─ BinOp (left, op, right)
├─ Compare (left, ops, comparators)
├─ Call (func, args)
├─ Name (id, ctx=Load/Store)
└─ Constant (value)
Phase 2 追加:
├─ If (test, body, orelse)
├─ While (test, body, orelse)
├─ UnaryOp (op, operand)
└─ Attribute (value, attr, ctx)
```
### 3. データ共有戦略
```rust
// NdArrayBox定義
pub struct NdArrayBox {
base: BoxBase,
py_array: Py<PyArray<f64, Dim<[usize; 2]>>>, // Python側の参照保持
// 操作時のみGIL取得してArrayViewを取る
}
impl NdArrayBox {
pub fn to_view(&self) -> PyResult<ArrayView2<f64>> {
Python::with_gil(|py| {
let array = self.py_array.as_ref(py);
Ok(array.readonly())
})
}
}
```
### 4. 実装ロードマップ
#### Phase 1: パーサー統合1-2週間
- [ ] pyo3セットアップとPythonParserBox骨格
- [ ] Python側parse_to_jsonヘルパー実装
- [ ] JSON→Nyash AST最小変換
- [ ] run()メソッドCPython exec委譲
- [ ] 例外変換PyErr → NyashError
#### Phase 2: MIR変換2-4週間
- [ ] AST→MIR変換器最小セット
- [ ] 数値演算プリミティブ実装
- [ ] スコープ解決(関数ローカル/グローバル)
- [ ] 基本的な制御フローIf/While
#### Phase 3: NumPy統合並行可能
- [ ] pyo3-numpy統合
- [ ] NdArrayBox実装
- [ ] ゼロコピーベンチマーク
- [ ] バッファプロトコル対応
#### Phase 4: 最適化と拡張
- [ ] 型特化とガード最適化
- [ ] 例外処理try/except
- [ ] クラス/メソッド対応
- [ ] import統合
## 性能目標(現実的な見積もり)
| コードタイプ | 期待される高速化 | 備考 |
|------------|----------------|------|
| 純Pythonループ | 2-10倍 | 型安定なホットパス |
| 関数呼び出し多 | 1.5-3倍 | インライン化効果 |
| NumPy処理中心 | 1.0-1.2倍 | 既に最適化済み |
| 動的特性多用 | 1.2-3倍 | ガード頻発で限定的 |
## 実装上の注意点
1. **GIL管理**: 境界で短く、操作時のみwith_gil
2. **バージョン互換**: Python 3.10-3.12で検証
3. **エラー処理**: すべてのPython例外を適切にキャッチ
4. **メモリ管理**: Py<PyAny>で参照保持、GC連携
5. **段階的アプローチ**: 完璧を求めず、動くものから改善
## 次のステップ
1. Phase 1の基本実装を開始
2. 小さなPythonコードで動作確認
3. ベンチマークで性能測定
4. フィードバックを元に改善
この計画により、PythonエコシステムとNyashの高性能実行エンジンを段階的に統合できる。

View File

@ -0,0 +1,98 @@
# 2025-08-27 議論まとめ - PythonParserBoxと言語間統合
## 本日の議論の流れ
### 1. ベンチマーク実行と問題発見
- インタープリター性能問題10万回ループで2分以上
- VM変数管理エラー
- Box APIの成熟度不足TimeBox.elapsed()が呼べない)
- 問題点をPhase 10ドキュメントに追記
### 2. Cranelift AOT Backendの追加Phase 10.9
- JIT実装の基盤を再利用して事前コンパイル可能
- 非同期完全サポートWASMの制限なし
- 実装期間2-3週間で可能上乗せだけ
### 3. PythonParserBox構想の深堀り
- ChatGPT5さんの「CPythonをBoxで包みMIRに落とし込む」アイデアを具体化
- CPythonの公式パーサーを使ってPythonコード→Nyash AST/MIR変換
- ビルトインBoxとして分離実装
### 4. エキスパートへの相談結果
#### Gemini先生の分析
- pyo3活用で技術的課題は解決可能
- 最初は特定ドメインのサブセットから開始すべき
- GIL管理のBox隠蔽は現実的
- 設計思想は他言語Ruby/JSにも応用可能
#### Codex先生の実装提案
- CPython内部APIではなく、安定した`ast`モジュール経由
- Python側で`ast.parse()` → JSON → Rust側で処理
- 最小実装セット定義(基本構造+演算+制御フロー)
- 純Pythonループで2-10倍の高速化が現実的
### 5. Phase 10.1フォルダの作成と整理
以下のドキュメントをPhase 10.1に整理:
- python_parser_box_design.txt基本設計
- python_parser_box_implementation_plan.txt実装計画
- chatgpt5_original_idea.txt元のアイデア
- summary_2025_08_27.txt本まとめ
## 技術的な要点
### 実装アプローチ
```rust
// pyo3でCPythonを埋め込み
pyo3 = { version = "0.22", features = ["auto-initialize"] }
// Python側でAST→JSON変換
def parse_to_json(code):
tree = ast.parse(code)
return json.dumps(ast_to_dict(tree))
// Rust側で受け取り
let json_ast = py_helper.parse_to_json(python_code);
let nyash_ast = convert_json_to_nyash_ast(json_ast);
```
### 最小実装セットPhase 1-2
- 構造: Module, FunctionDef, Return, Assign
- 演算: BinOp, Compare, Call, Name, Constant
- 制御: If, While, Br, CondBr
- 実行: 最初はCPython exec委譲、段階的にMIR実行へ
### データ共有戦略
- NumPy配列: pyo3-numpyでゼロコピー共有
- NdArrayBox: Nyash側でNumPy配列を効率的に扱う
- バッファプロトコル: PEP 3118で汎用オブジェクト共有
### 期待される効果
- 純Pythonループ: 2-10倍高速化
- NumPy処理: 1.0-1.2倍(既に最適化済み)
- 将来的: トレースベース最適化で10-30倍も可能
## 次のステップ
1. **Phase 1実装開始**1-2週間
- pyo3統合とPythonParserBox基本実装
- parse_to_jsonヘルパー作成
- 最小AST変換動作確認
2. **小規模ベンチマーク**
- 簡単なPython関数で動作確認
- 性能測定と改善点洗い出し
3. **段階的拡張**
- MIR変換実装
- NumPy統合
- より複雑なPython機能対応
## まとめ
PythonParserBoxは、Nyashの「Everything is Box」哲学を言語間統合に拡張する革命的なアプローチ。
CPythonパーサーの信頼性とNyashのMIR/JIT最適化を組み合わせることで、Pythonエコシステムを
Nyashから自然に利用でき、かつ高速化も実現できる。
ChatGPT5さんの最初のアイデアForeignBox/ProxyBoxを基に、具体的な実装計画まで落とし込めた。
技術的にも実現可能で、段階的なアプローチにより着実に実装できる見込み。