64 lines
1.8 KiB
Markdown
64 lines
1.8 KiB
Markdown
|
|
# JIT Phase 10 進捗メモ - ChatGPT5の実装記録
|
|||
|
|
|
|||
|
|
作成日: 2025-08-27
|
|||
|
|
|
|||
|
|
## 📊 現在の進捗状況
|
|||
|
|
|
|||
|
|
### Phase 10_d 完了内容
|
|||
|
|
|
|||
|
|
#### emit_host_callの改良
|
|||
|
|
```rust
|
|||
|
|
// value_stackから引数を収集してホストコールに渡す
|
|||
|
|
let mut args: Vec<Value> = Vec::new();
|
|||
|
|
let take_n = argc.min(self.value_stack.len());
|
|||
|
|
for _ in 0..take_n {
|
|||
|
|
if let Some(v) = self.value_stack.pop() {
|
|||
|
|
args.push(v);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
args.reverse(); // 正しい順序に
|
|||
|
|
// → CLIF callに渡す → 戻り値をstackに積む
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### ArrayGet/ArraySetへの対応
|
|||
|
|
```rust
|
|||
|
|
// 定数伝播で既知の値を追跡
|
|||
|
|
known_i64: HashMap<ValueId, i64>
|
|||
|
|
|
|||
|
|
// ArrayGetの例
|
|||
|
|
I::ArrayGet { array: _array, index, .. } => {
|
|||
|
|
let idx = self.known_i64.get(index).copied().unwrap_or(0);
|
|||
|
|
b.emit_const_i64(0); // array handle (仮)
|
|||
|
|
b.emit_const_i64(idx); // index
|
|||
|
|
b.emit_host_call(SYM_ARRAY_GET, 2, true);
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 動作確認済み
|
|||
|
|
```bash
|
|||
|
|
NYASH_JIT_THRESHOLD=1 NYASH_JIT_HOSTCALL=1 NYASH_JIT_EXEC=1 \
|
|||
|
|
./target/release/nyash --backend vm examples/jit_arith.nyash
|
|||
|
|
# → JIT経路で結果3を返却(成功!)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🎯 次のステップ
|
|||
|
|
|
|||
|
|
1. **ArrayBoxハンドルの実装**
|
|||
|
|
- 現在は仮の0を使用
|
|||
|
|
- 実際のBoxハンドルを渡す仕組み
|
|||
|
|
|
|||
|
|
2. **ホストコールシンボルの実装**
|
|||
|
|
- 現在はスタブ(nyash_host_stub0)
|
|||
|
|
- 実際のArray操作関数との接続
|
|||
|
|
|
|||
|
|
3. **より複雑な型への対応**
|
|||
|
|
- 現在はi64のみ
|
|||
|
|
- f64、bool、string等への拡張
|
|||
|
|
|
|||
|
|
## 💡 設計の良さ
|
|||
|
|
|
|||
|
|
- **段階的実装**: まず基盤を作り、徐々に機能追加
|
|||
|
|
- **安全性重視**: スタブから始めて、動作確認しながら進める
|
|||
|
|
- **既存制限の明示**: 何ができて何ができないかが明確
|
|||
|
|
|
|||
|
|
ChatGPT5さんの着実な実装に感謝!
|