45 lines
2.6 KiB
Markdown
45 lines
2.6 KiB
Markdown
|
|
# NyIR を共通交換フォーマットにする計画(All Languages → NyIR → All Targets)
|
|||
|
|
|
|||
|
|
目的(Goal)
|
|||
|
|
- あらゆる言語のプログラムを NyIR(= Nyash MIR の公開版)へ落とし、そこから任意の実行形態(WASM/LLVM/VM/他言語)に変換する。
|
|||
|
|
- 最適化は二の次。まずは意味保存(semantics-preserving)を最優先で実現し、可搬性と一貫性を担保する。
|
|||
|
|
|
|||
|
|
中核方針(Core Policy)
|
|||
|
|
- NyIR Core(26命令)は基本セマンティクス凍結。ExternCallによる外部世界接続を含む。
|
|||
|
|
- 拡張は NyIR-Ext(exceptions/concurrency/atomics)で言語固有機能を段階導入。
|
|||
|
|
- Everything is Box哲学: 外部ライブラリもBIDによりBox統一インターフェースで利用。
|
|||
|
|
- 仕様の正本は `docs/nyir/spec.md` に集約(Core+Ext)。
|
|||
|
|
|
|||
|
|
必要拡張(Minimal Additions)
|
|||
|
|
- 例外/アンワインド(Throw/TryBegin/TryEnd)
|
|||
|
|
- 軽量並行/非同期(Spawn/Join/Await)
|
|||
|
|
- アトミック(AtomicRmw/CAS + ordering)
|
|||
|
|
→ 詳細は `docs/nyir/spec.md` の NyIR-Ext 参照
|
|||
|
|
|
|||
|
|
フロントエンド指針(Language → NyIR)
|
|||
|
|
- C/C++/Rust: 既存IR(LLVM IR)経由または専用パーサでサブセットから対応
|
|||
|
|
- 例外→NyIR-Ext exceptions or エラー戻り値
|
|||
|
|
- スレッド→Spawn/Join、atomic→CAS/RMW
|
|||
|
|
- Java/Kotlin: JVM bytecode から構造復元→NyIR(例外/スレッド/同期をExtへ)
|
|||
|
|
- Python/JS/TS: AST→NyIR。辞書/配列/プロトタイプは標準Boxへ写像、例外/非同期はExtへ
|
|||
|
|
- Go: panic/recover→exceptions、goroutine→Spawn/Join へ写像(将来)
|
|||
|
|
|
|||
|
|
バックエンド指針(NyIR → Target)
|
|||
|
|
- WASM: 同期・非例外・非スレッドの最小路線から段階対応(Exceptions/Threads提案に合わせ拡張)
|
|||
|
|
- LLVM: 例外/スレッド/アトミックが揃っているため先行実装が容易
|
|||
|
|
- VM: 仕様の正しさ検証の基準(簡易実装でも良い)
|
|||
|
|
- 他言語(ソース生成): 可読性/慣用性は課題だが、機械的変換は可能(優先度低)
|
|||
|
|
|
|||
|
|
検証計画(Golden/Diff)
|
|||
|
|
- Cサブセット→NyIR→C/WASM(例外なし・CASあり)
|
|||
|
|
- Python/JSサブセット→NyIR→WASM(辞書/例外/非同期のサブセット)
|
|||
|
|
- JVM系→NyIR→JVM bytecode(例外/スレッド)
|
|||
|
|
- Rustサブセット→NyIR→LLVM(所有・weakの温存)
|
|||
|
|
→ Golden NyIR を用い、interp/vm/wasm/llvm で出力一致をCI検証
|
|||
|
|
|
|||
|
|
関連リンク
|
|||
|
|
- NyIR 仕様: `spec.md`
|
|||
|
|
- ABI/BID: `../予定/native-plan/box_ffi_abi.md`
|
|||
|
|
- 9.10 タスク(Copilot向け): `../予定/native-plan/issues/phase_9_10_nyir_spec.md`
|
|||
|
|
|