AI協調開発研究ドキュメントの完成と Phase 10.9-β 進捗

【AI協調開発研究】
- AI二重化モデルの学術論文draft完成(workshop_paper_draft.md)
- 「隠れた危機」分析とbirthの原則哲学化
- TyEnv「唯一の真実」協調会話を保存・研究資料に統合
- papers管理構造の整備(wip/under-review/published分離)

【Phase 10.9-β HostCall進捗】
- JitConfigBox: relax_numeric フラグ追加(i64→f64コアーション制御)
- HostcallRegistryBox: 署名検証・白黒リスト・コアーション対応
- JitHostcallRegistryBox: Nyash側レジストリ操作API
- Lower統合: env直読 → jit::config::current() 参照に統一
- 数値緩和設定: NYASH_JIT_HOSTCALL_RELAX_NUMERIC/Config.set_flag

【検証サンプル拡充】
- math.sin/cos/abs/min/max 関数スタイル(examples/jit_math_function_style_*.nyash)
- 境界ケース: 署名不一致・コアーション許可・mutating拒否サンプル
- E2E実証: String.length→allow, Array.push→fallback, math関数の署名一致観測

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Moe Charm
2025-08-28 12:09:09 +09:00
parent e54561e69f
commit 4e1b595796
133 changed files with 14202 additions and 622 deletions

View File

@ -1,175 +1,112 @@
# Phase 10.9 - ビルトインBox JITサポート
# Phase 10.9 Builtin-Box JIT SupportBox-First Plan
## 🎯 目的
ビルトインBoxをJITで使えるようにし、Python統合Phase 10.1)への道を開く。
目的: Nyashスクリプト → VM基準→ JIT段階導入
まずは「読み取り系」をJITで安全に通し、箱で問題点を包んで順に拡張する
## 📦 対象Box優先順位順
## 🎯 ゴールDoD
- 機能: String/Array/Map の読み取りAPIが JIT 経路で VM と一致
- length/isEmpty/charCodeAt, Array.get, Map.size/has
- 境界: 署名不一致・未対応は VM フォールバック理由はイベントJSONに記録
- 箱: Policy/Events/Registry を 1 箇所参照(切替点の一本化)
- 観測: JSONL イベントが最小1件以上出力オプトイン
### 第1段階読み取り専用メソッド
```nyash
// StringBox
str.length() // → i64
str.isEmpty() // → bool
str.charAt(idx) // → String新Box生成
## 🧱 先に積む箱(最小)
- JitConfigBox設定
- exec/stats/dump/phi_min/hostcall/native_f64/native_bool/threshold を `apply()` でenv反映
- `toJson()/fromJson()/summary()` で可視化
- JitPolicyBoxポリシー
- read_only/hostcall_whitelist。書込系は既定で拒否jit-direct等の安全弁
- JitEventsBox観測
- compile/execute/fallback/trap を 1行JSON標準出力 or ファイル)で記録
- HostcallRegistryBoxレジストリ
- 許可HostCallと args/ret 署名(唯一の切替点)。不一致は `sig_mismatch`
- FrameSlotsBoxスロット
- ptr→slot の割付と型注釈v0は i64 のみ)
- CallBoundaryBox境界
- JIT↔VM の薄い呼出し点(型変換の一本化)。将来多関数へ拡張
// ArrayBox
arr.length() // → i64
arr.isEmpty() // → bool
arr.get(idx) // → Box既存参照
最小原則: 箱を先に置くno-op/ログでもOK→ 切替点を1箇所に固定 → その箱の内部を順に強化。
// IntegerBox/FloatBox
int.toFloat() // → f64
float.toInt() // → i64
```
## 🛣️ 実行経路の設計(概要)
1) Runner: CLI/env→`JitConfig`→TLSへ反映env直読を排除
2) LowerCore: `jit::config::current()` を参照し、BoxCall/Load/Store/Branch/PHIを最小下ろし
3) HostCall: Handle経由で read-only を通すmutating は Policy で拒否)
4) Fallback: 未対応/署名不一致/ポリシー違反は VM 実行へ委譲
5) Events: `JitEventsBox` 経由で allow/fallback/trap を JSONL 出力
### 第2段階Box生成
```nyash
// new演算子のJIT化
new StringBox("hello") // → Handle
new IntegerBox(42) // → Handleまたは直接i64
new ArrayBox() // → Handle
```
## 🔢 対象APIv0
- ArrayBox: `length`, `get`, `isEmpty`, `push/set`mutatingは拒否
- MapBox: `size`, `has`, `get`, `set`mutatingは拒否
- StringBox: `length`, `isEmpty`, `charCodeAt`
- Math薄接続: `sin/cos/abs/min/max`(署名一致のみ allow を記録、実体はVMへ
### 第3段階書き込みメソッド
```nyash
// 状態変更を伴う操作
arr.push(item) // Mutex操作必要
arr.set(idx, value) // 境界チェック必要
map.set(key, value) // ハッシュ操作
```
## 🗺️ マイルストーン
### 10.9-α(足場)
- JitPolicyBox v0: read-only/whitelist を箱へ移動
- JitEventsBox v0: compile/execute の JSONL イベント(オプトイン)
- ドキュメント: 再起動チェック/箱の役割を追記
## 🔧 実装戦略
### 10.9-β(読み取りカバレッジ)
- HostcallRegistryBox v0: String/Array/Map 読み取り API の登録・署名検査
- LowerCore: BoxCall read-only 経路を Registry/Policy 参照に切替
- E2E: `length/isEmpty/charCodeAt/get/size/has` の一致jit-direct + VM
### 1. HandleRegistry活用
```rust
// 既存のHandleRegistry80%実装済み)を拡張
pub fn jit_get_box_method(handle: u64, method: &str) -> Option<MethodPtr> {
// ハンドル → Box → メソッドポインタ
}
```
### 10.9-γ(生成の足場)
- CallBoundaryBox v0: JIT→VMで `new` 等を委譲(薄い箱)
- `new StringBox/IntegerBox/ArrayBox` の最小経路(方針次第で jit-direct は拒否)
### 2. HostCall拡張
```rust
// 現在の限定的なHostCallを段階的に拡張
enum HostCallKind {
// 既存
ArrayIsEmpty,
StringLength,
// Phase 10.9で追加
StringIsEmpty,
StringCharAt,
ArrayGet,
IntToFloat,
FloatToInt,
// new演算子サポート
NewStringBox,
NewIntegerBox,
NewArrayBox,
}
```
### 10.9-δ(書き込みの導線のみ)
- JitPolicyBox: 書込許可スイッチ既定OFF
- LowerCore: 書込命令は Policy 参照で拒否/委譲/許可1箇所で判断
### 3. 型安全性の確保
```rust
// JIT時の型チェック
match method {
"length" => {
// StringBox/ArrayBoxのみ許可
verify_box_type(handle, &[BoxType::String, BoxType::Array])?
}
"isEmpty" => {
// より多くのBoxで使用可能
verify_box_type(handle, &[BoxType::String, BoxType::Array, BoxType::Map])?
}
}
```
## ✅ すぐ使えるチェック
- ビルド
- `cargo build --release --features cranelift-jit`
- 主要フラグ
- `NYASH_JIT_EXEC=1` `NYASH_JIT_THRESHOLD=1`
- `NYASH_JIT_EVENTS=1`標準出力へJSON
- 任意: `NYASH_JIT_EVENTS_PATH=target/nyash/jit-events.jsonl`
- 代表サンプルVM経由でJITパス通過
- 成功: `./target/release/nyash --backend vm examples/jit_hostcall_len_string.nyash`
- 失敗: `NYASH_JIT_EVENTS=1 ./target/release/nyash --backend vm examples/jit_hostcall_array_append.nyash`
- 境界: `NYASH_JIT_EVENTS=1 ./target/release/nyash --backend vm examples/jit_hostcall_math_sin_mismatch.nyash`
- 署名一致(allow観測): `NYASH_JIT_EVENTS=1 ./target/release/nyash --backend vm examples/jit_hostcall_math_sin_allow_float.nyash`
- 関数スタイル(math.*): `NYASH_JIT_NATIVE_F64=1 NYASH_JIT_EVENTS=1 ./target/release/nyash --backend vm examples/jit_math_function_style_sin_float.nyash`
- `cos/abs/min/max` も同様のサンプルあり
- 詰まったら
- `--features cranelift-jit` が付いているか
- イベントJSONに `fallback/trap` の理由が出ているか
- `cargo clean -p nyash-rust` → 再ビルド
## 📊 成功指標
## 🧪 検証と観測
- 統合JIT統計テキスト/JSON: sites/compiled/hits/exec_ok/trap/fallback_rate/handles
- `JitStatsBox.perFunction()` で関数単位の統計JSON配列
- CFG/PHIダンプ: `NYASH_JIT_DUMP=1``NYASH_JIT_DOT=path.dot`(最小)
- b1正規化カウンタ: `b1_norm_count`(分岐条件/PHI
- HostCallイベント: `argc`/`arg_types`/`reason`でデバッグ容易化mutatingは `policy_denied_mutating`
### 機能面
- [ ] StringBox.length() がJITで実行可能
- [ ] ArrayBox.isEmpty() がJITで実行可能
- [ ] new StringBox() がJITで生成可能
- [ ] 型チェックが正しく動作
## ⚠️ リスクとその箱での緩和
- 署名不一致args/ret
- HostcallRegistryBox で一元検査。不一致は `sig_mismatch` でイベント記録→VMへ
- mutatingの混入
- JitPolicyBox.read_only で抑止。Registryの Mutating 分類と併用
- 型崩れ/ABIの揺れ
- `JitValue`I64/F64/Bool/Handleへ統一、変換は境界1箇所
- 観測不足
- JitEventsBox の粒度を最小から用意(必要に応じ拡張)
### 性能面
- [ ] HostCall経由でも10倍以上高速化
- [ ] Handle解決のオーバーヘッド最小化
- [ ] Mutex競合の回避読み取り専用
## 🔧 実装ノート(現状)
- Config: Rust側 `jit::config::JitConfig` に集約。Nyash側は JitConfigBox で操作
- LowerCore: BoxCallの read-only は Registry/Policyに委譲。math.* は署名一致なら allow を記録実行はVM
- Handle: `rt::handles` による u64→Arc<Box>。JIT↔ホストをVM型非参照で独立
- 数値緩和: `NYASH_JIT_HOSTCALL_RELAX_NUMERIC=1` で i64→f64 コアーションを許容(既定は `native_f64=1` 時に有効)。`JitConfigBox.set_flag("relax_numeric", true)` でも切替可能
### Python統合への貢献
- [ ] PythonParserBoxの基本メソッドが使用可能
- [ ] MirBuilderBoxへのデータ受け渡し可能
- [ ] 最小限のPython→Nyash変換が動作
## 🚧 技術的課題
### 1. Arc<Mutex>パターンとの整合性
```rust
// 読み取り専用でもMutexロックが必要
// → 読み取り専用APIを別途用意
```
### 2. Box生成時のメモリ管理
```rust
// JIT内でのArc生成
// → HandleRegistryで一元管理
```
### 3. エラーハンドリング
```rust
// パニックしない設計
// → Result型での丁寧なエラー伝播
```
## 📈 実装ロードマップ
### Week 1基盤整備
- HandleRegistry拡張
- HostCallインターフェース設計
- 型チェック機構
### Week 2読み取りメソッド実装
- StringBoxlength, isEmpty, charAt
- ArrayBoxlength, isEmpty, get
- 数値変換toInt, toFloat
### Week 3Box生成サポート
- new演算子のMIR→JIT変換
- コンストラクタ呼び出し
- HandleRegistry登録
### Week 4テストと最適化
- E2Eテストスイート
- パフォーマンス測定
- Python統合の動作確認
## 🎉 期待される成果
```nyash
// これが高速に動く!
static box FastPython {
main() {
local py = new PythonParserBox() // JITで生成
local code = "def add(a, b): return a + b"
local ast = py.parse(code) // JITで実行
local builder = new MirBuilderBox() // JITで生成
local mir = builder.build(ast) // JITで実行
// Python関数がネイティブ速度で動く
return "Python is now Native!"
}
}
```
## 🚀 次のステップ
→ Phase 10.10プラグインBox JITサポート
→ Phase 10.1Python統合いよいよ実現
## 📌 次の拡張10.9の後)
- f64ネイティブ最小経路`NYASH_JIT_NATIVE_F64=1`)の拡充
- Boolネイティブb1署名サポートツールチェーンcapに連動
- HostCallブリッジの拡大Map.getの多型キー、String操作の追加
- CallBoundaryBox経由の `new`/副作用命令の段階的JIT化
---
作成者ClaudeNyashくんの要望により
目的「うるさい、Nyashつかえ」を真に実現するため
最短ルート: 箱Policy/Events/Registry/Boundaryを先に置き、読み取り系でJITを安全に通す→観測を増やす→署名とポリシーの一本化で切替点を固定→必要最小限のネイティブ型f64/b1を段階導入。