Files
hakorune/docs/phases/phase-7/phase7_async_mir.md

97 lines
3.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Phase 7: Async model in MIR (nowait/await)
## Summary
- nowait/await を MIR に薄く導入Future 表現)。スレッドベース実装と整合。
- 既存のFutureBox実装を活用し、MIR/VMレイヤーで非同期処理を表現。
## Background
- Nyashでは既にFutureBoxが実装済み`src/boxes/future/mod.rs`
- nowait/awaitはトークン・ASTードとして定義済み
- 現在のインタープリターではthread::spawnベースの実装
## Scope
### MIR命令の追加
- `FutureNew { dst, value }` - 新しいFuture作成初期値付き
- `FutureSet { future, value }` - Futureに値を設定
- `Await { dst, future }` - Futureの完了を待って値を取得
### Lowering実装
- `ASTNode::Nowait { variable, expression }`
1. expressionを評価
2. FutureNew命令でFuture作成
3. 別スレッドでの実行をスケジュール
- `ASTNode::AwaitExpression { expression }`
1. expressionを評価Future値を期待
2. Await命令で値取得
### VM実装
- FutureNew: 新しいVMValue::Future作成
- FutureSet: Future値の更新is_readyフラグも設定
- Await: Future完了まで待機してから値を返す
## Tasks
- [ ] Phase 7.1: MIR命令定義
- [ ] `src/mir/instruction.rs`にFutureNew/FutureSet/Await追加
- [ ] Effect maskの設定FutureNewはPURE、AwaitはREAD
- [ ] printer/verificationサポート
- [ ] Phase 7.2: AST→MIR lowering
- [ ] `src/mir/builder.rs`にnowait/awaitの処理追加
- [ ] 適切なbasic block分割awaitは制御フローに影響
- [ ] Phase 7.3: VM実装
- [ ] `src/backend/vm.rs`にVMValue::Future追加
- [ ] 各命令の実行ロジック実装
- [ ] FutureBoxとの統合
- [ ] Phase 7.4: テスト・検証
- [ ] 基本的なnowait/awaitのテストケース
- [ ] 複数のnowait実行順序テスト
- [ ] エラーケースFuture未完了時の扱い等
## Test Cases
```nyash
// 基本的なnowait/await
static box Main {
main() {
nowait f1 = compute(10)
nowait f2 = compute(20)
local result1 = await f1
local result2 = await f2
print(result1 + result2)
}
}
// ネストしたnowait
static box Main {
main() {
nowait outer = {
nowait inner = compute(5)
await inner * 2
}
print(await outer)
}
}
```
## Acceptance Criteria
- 上記テストケースがMIRダンプで正しい命令列を生成
- VM実行で期待通りの結果並行実行→正しい順序で結果取得
- 既存のFutureBox実装との整合性維持
- verifierがFuture関連の不正を検出
## Implementation Notes
- 初期実装ではシンプルにthread::spawnベース継続
- Futureの型情報は当面VMValue内で管理型システムは後続フェーズ
- エラー処理は最小限Future未完了時のawaitはブロック
## Out of Scope (Phase 7)
- async/await構文Rustライク
- Promise chain / then構文
- 取り消し可能なFuture
- 複雑なスケジューリング戦略
- Future型の静的型チェック
## References
- `docs/nyash_core_concepts.md`nowait/await + FutureBox
- `src/boxes/future/mod.rs`既存FutureBox実装
- `src/interpreter/async_methods.rs`現在のnowait/await実装