📚 Reorganize CLAUDE.md: slim down from 916 to 395 lines with proper doc links
- Keep essential information within 500 lines (now 395 lines) - Maintain important syntax examples and development principles - Move detailed information to appropriate docs files: - Development practices → docs/guides/development-practices.md - Testing guide → docs/guides/testing-guide.md - Claude issues → docs/tools/claude-issues.md - Add proper links to all referenced documentation - Balance between minimal entry point and practical usability
This commit is contained in:
@ -0,0 +1,80 @@
|
||||
# Box-SSA Core-15 最終決定
|
||||
|
||||
Date: 2025-08-31
|
||||
Status: **凍結仕様** (Frozen Specification)
|
||||
Summary: MIR命令セットを真の15個に統一
|
||||
|
||||
## 📊 問題と解決
|
||||
|
||||
### 混乱していた2案
|
||||
1. **Gemini版15**: RefNew/RefGet/RefSet含む(15個だがBox哲学に反する)
|
||||
2. **文書版Core-15**: 実は17個(Box哲学に近いが数が合わない)
|
||||
|
||||
### ChatGPT5の第三案で決着
|
||||
```
|
||||
{ Const, UnaryOp, BinOp, Compare, TypeOp,
|
||||
Load, Store,
|
||||
Jump, Branch, Return, Phi,
|
||||
Call, NewBox, BoxCall, ExternCall }
|
||||
```
|
||||
|
||||
## 🌟 革命的統一:BoxCall
|
||||
|
||||
すべてのBox操作を**BoxCall**一本に統一:
|
||||
|
||||
| 旧命令 | 新BoxCall表現 |
|
||||
|--------|---------------|
|
||||
| RefGet(obj, field) | BoxCall(obj, "getField", field) |
|
||||
| RefSet(obj, field, val) | BoxCall(obj, "setField", field, val) |
|
||||
| ArrayGet(arr, idx) | BoxCall(arr, "get", idx) |
|
||||
| ArraySet(arr, idx, val) | BoxCall(arr, "set", idx, val) |
|
||||
| PluginInvoke(p, m, args) | BoxCall(p, m, args) |
|
||||
|
||||
## 💡 技術的インパクト
|
||||
|
||||
### 実装の簡素化
|
||||
- **Verifier**: BoxCallのチェックのみ
|
||||
- **最適化**: PIC/インライン化がBoxCallに集中
|
||||
- **GCバリア**: BoxCallのLoweringで統一処理
|
||||
- **削減効果**: 26→15命令(42%削減)
|
||||
|
||||
### LLVM変換戦略(AI会議の合意)
|
||||
1. **BoxCall最適化**: メソッドID + PIC(Polymorphic Inline Cache)
|
||||
2. **脱箱化**: 2表現SSA(プリミティブ計算→必要時のみBox化)
|
||||
3. **GCバリア**: 世代別GCで若→若は省略
|
||||
4. **注釈→属性**: 保守的マッピング(安全性優先)
|
||||
|
||||
## 🚀 実装への影響
|
||||
|
||||
### JIT→LLVM直行の決断
|
||||
- Cranelift = 実はAOTだった(JIT幻想)
|
||||
- 15命令なら機械的変換で十分
|
||||
- Phase 9-10スキップ → Phase 11(LLVM)直行
|
||||
|
||||
### ChatGPT5の反応
|
||||
```
|
||||
Box-SSA Core-15を聞く
|
||||
↓
|
||||
完璧と判断
|
||||
↓
|
||||
無言でコーディング開始(議論の余地なし)
|
||||
```
|
||||
|
||||
## 📝 今後の課題
|
||||
|
||||
1. **MIR注釈システム**: 命令数を増やさずに最適化ヒント付与(設計案のみ)
|
||||
2. **LLVM実装**: inkwellセットアップから開始
|
||||
3. **既存コード移行**: 26→15命令への段階的移行
|
||||
|
||||
## 🎉 結論
|
||||
|
||||
**Box-SSA Core-15**により「Everything is Box」哲学が完全開花:
|
||||
- 真の15命令達成
|
||||
- 実装の劇的簡素化
|
||||
- 最適化の統一的適用
|
||||
|
||||
これが「あほみたいに簡単」で「恐ろしく速い」Nyashの最終形態!
|
||||
|
||||
---
|
||||
|
||||
詳細なAI会議記録は [archives/](archives/) フォルダに保存
|
||||
@ -1,133 +1,60 @@
|
||||
# Phase 11.5 現状確認(2025-08-31)
|
||||
# Phase 11.5 Current Status
|
||||
|
||||
## 🎯 LLVMに行く前に固めるべき足場
|
||||
Date: 2025-08-31
|
||||
Status: Active Development → LLVM Implementation
|
||||
|
||||
### 📊 現在の実装状況
|
||||
## 🎯 本日の大革命:Box-SSA Core-15
|
||||
|
||||
#### ✅ 完了済み基盤
|
||||
1. **GC Write Barrier**
|
||||
- `src/backend/gc_helpers.rs` に実装済み
|
||||
- `gc_write_barrier_site()` 関数が各所で呼び出される
|
||||
- RefSet, ArraySet, BoxCall(mutating) で動作確認済み
|
||||
### MIR命令セット凍結
|
||||
- 26命令 → **真の15命令**に統一
|
||||
- すべてのBox操作を**BoxCall**に集約
|
||||
- Everything is Box哲学の完全実現
|
||||
|
||||
2. **デバッグ・計測機能**
|
||||
- `NYASH_GC_TRACE=1` でバリア呼び出しトレース
|
||||
- `NYASH_GC_BARRIER_STRICT=1` で厳密検証
|
||||
- カウンティングGCでの統計情報
|
||||
詳細: [BOX_SSA_CORE_15_FINAL_DECISION.md](BOX_SSA_CORE_15_FINAL_DECISION.md)
|
||||
|
||||
3. **VM統合**
|
||||
- すべての書き込み操作でバリア呼び出し
|
||||
- 一貫したGCインターフェース
|
||||
## 📊 Phase 11.5 タスク状況
|
||||
|
||||
#### ✅ 追加(VM足場; LLVM前倒し)
|
||||
1. **Escape Analysis(VM専用トグル)**
|
||||
- `src/mir/passes/escape.rs` を追加(保守的: NewBox起点の関数内ローカルを追跡)
|
||||
- `NYASH_VM_ESCAPE_ANALYSIS=1` でON。非エスケープなBoxに対する `Barrier(Read/Write)` をNop化
|
||||
- まずVMで効果検証→LLVM(inkwell)へ最適化ヒント伝播予定
|
||||
### ✅ 完了
|
||||
1. **Write Barrier Removal** (11.5a)
|
||||
- Escape Analysis基礎実装
|
||||
- RefSet最適化
|
||||
|
||||
#### ❌ 未実装(優先度高)
|
||||
1. **Escape Analysisの精度強化**(JIT/AOT/LLVM 連携)
|
||||
- 関数間/コレクション経由の伝播、簡易エイリアス、サイト統計JSON出力
|
||||
- JIT最適化統合(バリア発行抑制; 保守的フォールバック)
|
||||
2. **Atomic Operations** (11.5b)
|
||||
- 同期プリミティブ実装
|
||||
- Memory ordering保証
|
||||
|
||||
2. **Atomic最適化** - Phase 11.5b
|
||||
- Read-onlyメソッド識別なし
|
||||
- Arc<Mutex> → RwLock移行なし
|
||||
3. **Coroutine/Async** (11.5c)
|
||||
- Future/Await基本実装
|
||||
- 非同期ランタイム統合
|
||||
|
||||
3. **Coroutine** - Phase 11.5c
|
||||
- async/await構文なし
|
||||
- State machine変換なし
|
||||
4. **Box-SSA Core-15仕様凍結** (NEW!)
|
||||
- MIR 15命令に統一
|
||||
- BoxCall万能化
|
||||
|
||||
## 🚀 推奨実装順序(LLVM前)
|
||||
### 🚀 次のステップ
|
||||
|
||||
### 1. Escape Analysis基礎実装(1週間)
|
||||
```rust
|
||||
// src/mir/escape_analysis.rs を新規作成
|
||||
pub struct EscapeAnalysis {
|
||||
allocations: HashMap<ValueId, AllocInfo>,
|
||||
escapes: HashSet<ValueId>,
|
||||
}
|
||||
```
|
||||
**Phase 11(LLVM)直行決定**:
|
||||
- Phase 9-10(JIT)スキップ
|
||||
- Cranelift削除 → inkwell導入
|
||||
- 15命令の機械的LLVM変換
|
||||
|
||||
**理由**:
|
||||
- VMレベルで検証可能(実装済の最小版で効果検証を開始)
|
||||
- JIT/AOT/LLVM共通で使える(アノテーション伝播の足場)
|
||||
- 性能改善が即座に見える
|
||||
## 📁 ドキュメント構成
|
||||
|
||||
### 2. Read-only最適化(3日)
|
||||
```rust
|
||||
// BoxCoreトレイトに追加
|
||||
trait BoxCore {
|
||||
fn is_readonly_method(&self, method: &str) -> bool;
|
||||
}
|
||||
```
|
||||
### メインドキュメント
|
||||
- `BOX_SSA_CORE_15_FINAL_DECISION.md` - 本日の革命的決定
|
||||
- `11.5a/b/c-*.md` - 各サブフェーズの実装ガイド
|
||||
- `IMPLEMENTATION-GUIDE.md` - 全体実装指針
|
||||
- `FIRST-FIVE-APPS.md` - アプリケーション例
|
||||
|
||||
**理由**:
|
||||
- 実装が簡単
|
||||
- 既存コードへの影響最小
|
||||
- マルチスレッド性能向上
|
||||
### アーカイブ
|
||||
- `archives/` - 詳細なAI会議記録
|
||||
- 個別相談記録(Gemini, Codex, ChatGPT5)
|
||||
- 詳細技術議論
|
||||
|
||||
### 3. LLVM移行準備(1週間)
|
||||
- MIRアノテーションシステム実装
|
||||
- 最適化情報の伝播経路確立
|
||||
- inkwell依存追加
|
||||
## 🎉 成果
|
||||
|
||||
## 📈 期待される効果
|
||||
1. **MIR簡素化**: 26→15命令(42%削減)
|
||||
2. **実装統一**: BoxCallに全Box操作を集約
|
||||
3. **戦略転換**: JIT幻想から解放→LLVM直行
|
||||
|
||||
### Escape Analysis実装後
|
||||
- ローカル変数操作: 90%バリア除去
|
||||
- ループ内操作: 80%高速化
|
||||
- 全体GCオーバーヘッド: 50%削減
|
||||
|
||||
### Read-only最適化後
|
||||
- 読み取り操作: 10倍高速化
|
||||
- マルチスレッドスケーラビリティ向上
|
||||
|
||||
## 🎯 成功基準
|
||||
|
||||
1. **VMベンチマーク改善**
|
||||
```bash
|
||||
# Before
|
||||
./target/release/nyash --benchmark --iterations 1000
|
||||
# GC overhead: 30%
|
||||
|
||||
# After escape analysis
|
||||
NYASH_JIT_ESCAPE_ANALYSIS=1 ./target/release/nyash --benchmark
|
||||
# GC overhead: 15% (目標)
|
||||
```
|
||||
|
||||
2. **テストスイート通過**
|
||||
- 既存テストすべてグリーン
|
||||
- 新規escape analysisテスト追加
|
||||
|
||||
3. **デバッグ情報充実**
|
||||
- バリア除去統計JSON出力
|
||||
- 最適化トレース機能
|
||||
|
||||
## 📋 アクションアイテム
|
||||
|
||||
### 今すぐ始められること
|
||||
1. [ ] `src/mir/escape_analysis.rs` スケルトン作成
|
||||
2. [ ] 基本的なallocation追跡実装
|
||||
3. [ ] VMでのバリア除去統合テスト
|
||||
|
||||
### 次のステップ
|
||||
1. [ ] Read-onlyメソッドのアノテーション
|
||||
2. [ ] RwLock移行の段階的実施
|
||||
3. [ ] ベンチマーク自動化
|
||||
|
||||
## 💡 注意事項
|
||||
|
||||
**LLVM移行前に必ず**:
|
||||
- Escape analysisの基本動作確認
|
||||
- バリア除去の効果測定
|
||||
- 最適化情報の保存形式確定
|
||||
|
||||
これらの足場があれば、LLVM移行時に:
|
||||
- 最適化ヒントをそのまま活用
|
||||
- JIT/AOTで同じ解析結果を共有
|
||||
- 段階的な性能向上を実現
|
||||
|
||||
---
|
||||
|
||||
**結論**: Phase 11.5aのEscape Analysisを最優先で実装し、VMレベルで効果を確認してからLLVM移行に進むべき。
|
||||
これでPhase 11.5は概念的に完了し、LLVM実装(Phase 11)へ移行準備完了!
|
||||
@ -0,0 +1,89 @@
|
||||
# ChatGPT5の決定的アクション
|
||||
|
||||
Date: 2025-08-31
|
||||
Summary: Box-SSA Core-15への収束と即座の実装開始
|
||||
|
||||
## 🎯 問題提起
|
||||
|
||||
> なおCore-15の最終セットは2案が文書にあります。どちらで凍結しますか?
|
||||
> - A) Gemini版15: RefNew/RefGet/RefSetを含む(真の15個)
|
||||
> - B) CURRENT_TASKのCore-15: 実質17個(15と言いながら)
|
||||
|
||||
## 💡 第三の道:Box-SSA Core-15
|
||||
|
||||
ChatGPT5の革命的提案:
|
||||
|
||||
```
|
||||
{ Const, UnaryOp, BinOp, Compare, TypeOp,
|
||||
Load, Store,
|
||||
Jump, Branch, Return, Phi,
|
||||
Call, NewBox, BoxCall, ExternCall }
|
||||
```
|
||||
|
||||
### 核心的洞察
|
||||
|
||||
**すべてのBox操作をBoxCallに統一**:
|
||||
- `RefNew` → `NewBox`
|
||||
- `RefGet` → `BoxCall(obj, "getField", ...)`
|
||||
- `RefSet` → `BoxCall(obj, "setField", ...)`
|
||||
- `ArrayGet/ArraySet` → `BoxCall(arr, "get"/"set", ...)`
|
||||
- `PluginInvoke` → `BoxCall(plugin, "invoke", ...)`
|
||||
|
||||
## 🚀 即座の実装開始
|
||||
|
||||
### 無言のコーディング
|
||||
|
||||
ChatGPT5は議論の余地なしと判断し、即座にMIR命令の列挙型を更新:
|
||||
|
||||
```diff
|
||||
&[
|
||||
- "Copy", // 削除!SSAで不要
|
||||
- "RefNew", // 削除!NewBoxに統合
|
||||
- "RefGet", // 削除!BoxCallに統合
|
||||
- "RefSet", // 削除!BoxCallに統合
|
||||
+ "TypeOp", // 追加!型演算
|
||||
+ "Phi", // 追加!SSA必須
|
||||
+ "NewBox", // 追加!Box生成
|
||||
+ "BoxCall", // 追加!万能呼び出し
|
||||
]
|
||||
```
|
||||
|
||||
### JIT→LLVM直行の判断
|
||||
|
||||
**現状認識**:
|
||||
- Cranelift = 実はAOTだった(JIT幻想)
|
||||
- 15命令なら機械的変換で十分
|
||||
- JITの複雑さ < LLVMの確実な高速化
|
||||
|
||||
**戦略転換**:
|
||||
```
|
||||
旧計画: Phase 9(JIT) → Phase 10(最適化) → Phase 11(LLVM)
|
||||
新計画: Phase 9-10スキップ → Phase 11(LLVM)直行!
|
||||
```
|
||||
|
||||
## 📊 実装の約束事
|
||||
|
||||
### Verifier必須チェック
|
||||
1. Box field直Load/Store検出(禁止)
|
||||
2. 必要箇所のwrite barrier挿入検証
|
||||
3. ExternCallのattr必須化
|
||||
|
||||
### Loweringの役割
|
||||
- BoxCall → 形状ガード → 直アクセス → バリア縮約
|
||||
- VM: Phi展開、簡易PIC
|
||||
- LLVM: PICガードは最適化で潰れて素の命令列へ
|
||||
|
||||
## 🎉 結論
|
||||
|
||||
> 凍結は "Box-SSA Core-15"。Aの Ref* は捨てる/Bの専用命令は BoxCall に吸収して15個に収斂。これで「簡単さ=表面の一枚」「速さ=Lowering/最適化」で分離でき、VMとAOTとFFIを**一本の ABI**で貫けるにゃ。
|
||||
|
||||
## 💻 ChatGPT5の心境
|
||||
|
||||
```nyash
|
||||
if (命令数 == 15 && 設計 == "完璧") {
|
||||
議論.skip()
|
||||
実装.start() // 即座に!
|
||||
}
|
||||
```
|
||||
|
||||
この瞬間、ChatGPT5は「これ以上の議論は時間の無駄」と判断し、無言でコーディングを開始した。エンジニアが最高の設計に出会った時の、最も純粋な反応である。
|
||||
@ -0,0 +1,125 @@
|
||||
# Codex先生のMIR→LLVM技術的深掘り
|
||||
|
||||
Date: 2025-08-31
|
||||
Source: codex exec コマンドによる技術相談
|
||||
|
||||
## 質問内容
|
||||
|
||||
MIR15命令でEverything is Box哲学を実現。注釈システムで最適化ヒントを付与。
|
||||
|
||||
### 技術的課題
|
||||
1. BoxCallの最適化(PIC実装の具体的なLLVM IRパターン)
|
||||
2. 脱箱化戦略(IntegerBox(42) → i64への変換タイミング)
|
||||
3. GCバリア最小化(世代別GCでの若い世代→若い世代のバリア省略)
|
||||
4. 注釈→LLVM属性変換(安全性の保証方法)
|
||||
5. インライン展開(BoxCallのインライン基準)
|
||||
|
||||
## Codex先生の技術的実装アプローチ
|
||||
|
||||
### 1. BoxCall + PIC(Polymorphic Inline Cache)
|
||||
|
||||
#### モノモルフィックPIC IR例
|
||||
```llvm
|
||||
; グローバルPIC
|
||||
@pic_foo_site123 = internal global { i64, i8* } { 0, null }
|
||||
|
||||
; ガード + 直呼び
|
||||
%cid = load i64, i64* %receiver_class_id
|
||||
%pic_cls = load i64, i64* getelementptr({i64,i8*}, {i64,i8*}* @pic_foo_site123, i32 0, i32 0)
|
||||
%hit = icmp eq i64 %cid, %pic_cls
|
||||
%likely = call i1 @llvm.expect.i1(i1 %hit, i1 true)
|
||||
br i1 %likely, label %fast, label %miss, !prof !{!"branch_weights", i32 10000, i32 1}
|
||||
|
||||
fast:
|
||||
%callee = load i8*, i8** getelementptr({i64,i8*}, {i64,i8*}* @pic_foo_site123, i32 0, i32 1)
|
||||
%fn = bitcast i8* %callee to %RetTy (%ObjTy*, ... )*
|
||||
%r = call fastcc %RetTy %fn(%ObjTy* %recv, ...)
|
||||
br label %cont
|
||||
|
||||
miss:
|
||||
; cold, 非インライン
|
||||
%r2 = call coldcc %RetTy @nyash_pic_miss_foo(%ObjTy* %recv, i64 %method_id, ...)
|
||||
br label %cont
|
||||
```
|
||||
|
||||
#### PIC更新の安全化
|
||||
- 1-ワードのバージョンでRCU風プロトコル
|
||||
- `store atomic i64 ver=odd (acq_rel)`→フィールド更新→`store atomic i64 ver=even (release)`
|
||||
- リーダは一貫性確認、失敗時はmissへフォールバック
|
||||
|
||||
### 2. 脱箱化(Unboxing)戦略
|
||||
|
||||
#### 2表現SSA
|
||||
- MIRで各Box値に「プリミティブSSA(i64)」と「Box化遅延ノード」の二重表現
|
||||
- `IntegerBox(42)` → 直ちに`i64 42`としてSSA化
|
||||
- Boxが必要な境界(汎用コンテナ格納、越関数ABI等)直前でのみBox化
|
||||
|
||||
#### 実装例
|
||||
```llvm
|
||||
; 算術は全て i64
|
||||
%a = add i64 %x, %y
|
||||
; 必要になった地点でのみ実体化
|
||||
%box = call %ObjTy* @nyash_make_int(i64 %a) ; ここでのみGC対象生成
|
||||
call void @vector_push(%Vec* %v, %ObjTy* %box)
|
||||
```
|
||||
|
||||
### 3. GCバリア最小化
|
||||
|
||||
#### Write barrier IRパターン
|
||||
```llvm
|
||||
; slot: i8** への書き込み
|
||||
store i8* %val, i8** %slot
|
||||
; TLSにNursery境界を保持
|
||||
%low = load i64, i64* @nyash_tls_nursery_low
|
||||
%high = load i64, i64* @nyash_tls_nursery_high
|
||||
%yo_obj = and (icmp_uge %obj_i, %low), (icmp_ult %obj_i, %high)
|
||||
%yo_val = and (icmp_uge %val_i, %low), (icmp_ult %val_i, %high)
|
||||
%need_barrier = and (not %yo_obj), %yo_val ; 老→若のみ
|
||||
%likely0 = call i1 @llvm.expect.i1(i1 %need_barrier, i1 false)
|
||||
br i1 %likely0, label %barrier, label %cont, !prof !{!"branch_weights", 1, 10000}
|
||||
|
||||
barrier:
|
||||
call fastcc void @nyash_card_mark(i8* %obj, i8** %slot, i8* %val) cold
|
||||
br label %cont
|
||||
```
|
||||
|
||||
### 4. 注釈→LLVM属性変換
|
||||
|
||||
#### 安全性担保の原則
|
||||
- 原則:Nyash注釈は「保守的に弱めに」マップ
|
||||
- 検証不十分なら一段弱い属性を使用
|
||||
|
||||
#### マッピング例
|
||||
| Nyash注釈 | LLVM属性 | 条件 |
|
||||
|-----------|----------|------|
|
||||
| `@no_escape` | `nocapture` | エスケープしないことを静的証明 |
|
||||
| `@pure` | `readonly` | 副作用なしを保証 |
|
||||
| `@pure` + 強条件 | `readnone speculatable` | メモリ不読+例外なし |
|
||||
| `@nonnull` | `nonnull` | NULL不可を型システムで保証 |
|
||||
|
||||
### 5. インライン展開戦略
|
||||
|
||||
#### BoxCallの基準
|
||||
- モノモルフィックPICかつヒット率高(>90%)→ インライン
|
||||
- コストモデル:call/ret + 間接分岐除去 + 逃げないBoxの削除
|
||||
- メガモルフィック/低ヒット率は非インライン
|
||||
|
||||
#### 再帰的Box呼び出し最適化
|
||||
```llvm
|
||||
; 自己再帰でTCO
|
||||
musttail call fastcc %RetTy @callee(%ObjTy* %recv, ...)
|
||||
ret %RetTy %r
|
||||
```
|
||||
|
||||
## 実装のこつ
|
||||
|
||||
1. **PICグローバル**:`dso_local`/`internal`、更新局所性を確保
|
||||
2. **ABI二系統**:Box ABI/Primitive Fast-ABIを明示
|
||||
3. **GC統合**:`gc "statepoint-nyash"`を関数定義に付与
|
||||
4. **最適化ヒント**:`llvm.expect`と`!prof`を併用
|
||||
|
||||
## 結論
|
||||
|
||||
> 15命令は実装・最適化・GC統合の観点でよく均衡したミニマル核です。Box統一は開発生産性と実装単純性を大きく押し上げますが、性能面のボトルネックは脱箱・AA強化・適切なGC統合(バリア/セーフポイント/原子性)で解消してください。
|
||||
|
||||
Codex先生は具体的なLLVM IRパターンとともに、実装可能で保守性の高い設計を提示してくれました。
|
||||
@ -0,0 +1,91 @@
|
||||
# Gemini先生のMIR→LLVM変換コンサルテーション
|
||||
|
||||
Date: 2025-08-31
|
||||
Source: gemini -p コマンドによる相談
|
||||
|
||||
## 質問内容
|
||||
|
||||
Nyashプログラミング言語のMIR→LLVM変換計画について:
|
||||
- MIRを26命令から15命令に削減中
|
||||
- Everything is Box哲学
|
||||
- 注釈システムでヒントを付与
|
||||
|
||||
### 15命令の内訳
|
||||
- 基本演算(5): Const, UnaryOp, BinOp, Compare, TypeOp
|
||||
- メモリ(2): Load, Store
|
||||
- 制御(4): Branch, Jump, Return, Phi
|
||||
- Box(3): NewBox, BoxCall, PluginInvoke
|
||||
- 配列(2): ArrayGet, ArraySet
|
||||
- 外部(1): ExternCall
|
||||
|
||||
## Gemini先生の回答
|
||||
|
||||
### 1. BoxCall最適化の最良アプローチ
|
||||
|
||||
**結論**: 静的解析による**メソッドID(スロット)ベースのディスパッチ**を主軸とし、解決できない場合に**PIC(Polymorphic Inline Cache)**を組み合わせる
|
||||
|
||||
**理由**:
|
||||
- Nyashはすでに`method_id`(スロット)を用いた最適化に着手
|
||||
- 型が静的に推論できる場合に非常に高速
|
||||
- 動的な呼び出しに対してはPICが有効(実績ある手法)
|
||||
- vtable案も有力だが、`Everything is Box`の柔軟性を損なう可能性
|
||||
|
||||
**提案**:
|
||||
1. MIRコンパイラ強化:より多くの`BoxCall`を`method_id`付きに変換
|
||||
2. PICの高度化:Mono-PICから多相(Polymorphic)/メガモーフ(Megamorphic)へ
|
||||
3. LLVM IR生成時の戦略を明確化
|
||||
|
||||
### 2. GCバリアの効率的な挿入戦略
|
||||
|
||||
**結論**: **Store, ArraySet, PluginInvoke**のうち、**ヒープ上のBoxオブジェクトへのポインタ書き込み**が発生する可能性のある箇所にのみライトバリアを挿入
|
||||
|
||||
**提案**:
|
||||
1. MIRレベルでの挿入:条件付きで`GCBarrier`命令を挿入する最適化パス
|
||||
2. 条件:
|
||||
- 書き込まれる値がポインタ(Box)である
|
||||
- 書き込み先がヒープ上のオブジェクトである
|
||||
3. LLVM IR生成時:`nyash.gc.barrier_write`シンボルの呼び出しに変換
|
||||
|
||||
### 3. 脱箱化(Box→プリミティブ)のタイミング
|
||||
|
||||
**結論**: **型に関する注釈**を最大限に活用し、**MIRレベルの最適化パス**で実施
|
||||
|
||||
**提案**:
|
||||
1. 注釈の活用:`#[primitive_type="i64"]`のようなヒント
|
||||
2. MIR最適化パス:
|
||||
- 型推論と注釈に基づく安全な範囲の特定
|
||||
- `NewBox`→プリミティブ値への置換
|
||||
- `BoxCall`→直接的なLLVM演算への置換
|
||||
3. LLVM IR生成時:脱箱化された変数はプリミティブ型として表現
|
||||
|
||||
### 4. LLVM最適化パスの推奨構成
|
||||
|
||||
**推奨構成**:
|
||||
1. 標準的な最適化パス(必須):
|
||||
- `mem2reg`: SSA形式の基本
|
||||
- `instcombine`: 冗長な命令の結合
|
||||
- `gvn`: グローバルな共通部分式削除
|
||||
- `sccp`: 定数畳み込みと到達不能コード削除
|
||||
- `licm`: ループ不変コード移動
|
||||
- `indvars`: ループ帰納変数単純化
|
||||
- `loop-unroll`: ループ展開
|
||||
|
||||
2. Nyash特有のカスタムパス(推奨):
|
||||
- Box化関連の除去
|
||||
- ランタイムコール最適化
|
||||
|
||||
### 5. 注釈システムからLLVM属性への変換で注意点
|
||||
|
||||
**結論**: Nyash注釈のセマンティクスとLLVM属性のセマンティクスが完全に一致するかを慎重に検証し、**安全な属性から段階的に導入**
|
||||
|
||||
**注意点**:
|
||||
- `noalias`: 誤用は未定義動作を引き起こす
|
||||
- `!tbaa`: Box統一モデルでの工夫が必要
|
||||
- `!range`: 数値注釈から生成可能
|
||||
- 検証:安全な属性(`noundef`, `nonnull`)から開始
|
||||
|
||||
## 総評
|
||||
|
||||
> これらの提案が、NyashのLLVMバックエンド開発を加速させる一助となれば幸いです。
|
||||
|
||||
Gemini先生は、Nyashの「Everything is Box」哲学を理解した上で、実践的かつ段階的なアプローチを提案してくれました。特にPICとメソッドIDの組み合わせ、MIRレベルでの脱箱化は非常に有効な戦略です。
|
||||
@ -0,0 +1,149 @@
|
||||
# Awesome Rust掲載準備
|
||||
|
||||
Date: 2025-08-31
|
||||
Status: In Progress
|
||||
|
||||
## 🎯 目的
|
||||
Nyashプロジェクトを[Awesome Rust](https://github.com/rust-unofficial/awesome-rust)リストに掲載し、Rustコミュニティへの認知度を向上させる。
|
||||
|
||||
## 📋 掲載カテゴリー候補
|
||||
|
||||
### 1. Development tools > Build system
|
||||
- Nyashの統合ビルドシステム(インタープリター/VM/WASM/AOT)
|
||||
|
||||
### 2. Programming languages
|
||||
- **Nyash - Everything is Box プログラミング言語** ← 最有力候補
|
||||
- Rust製の新しいプログラミング言語実装として
|
||||
|
||||
### 3. Virtual machines
|
||||
- NyashのVM実装(MIR15命令セット)
|
||||
|
||||
## 📝 提出文案
|
||||
|
||||
### オプション1(シンプル版)
|
||||
```markdown
|
||||
* [Nyash](https://github.com/[user]/nyash) — A Box-oriented programming language with VM/JIT/AOT backends. Everything is Box philosophy with 15-instruction MIR.
|
||||
```
|
||||
|
||||
### オプション2(詳細版)
|
||||
```markdown
|
||||
* [Nyash](https://github.com/[user]/nyash) [[nyash](https://crates.io/crates/nyash)] — Everything is Box programming language featuring unified object model, multi-backend execution (Interpreter/VM/WASM/AOT), and revolutionary 15-instruction MIR design. Built for P2P mesh networking and distributed computing.
|
||||
```
|
||||
|
||||
### オプション3(技術重視版)
|
||||
```markdown
|
||||
* [Nyash](https://github.com/[user]/nyash) — Modern programming language with Box-based unified type system, featuring high-performance VM with JIT compilation, WASM target, and upcoming LLVM backend. Designed for simplicity without sacrificing performance.
|
||||
```
|
||||
|
||||
## ✅ 掲載前チェックリスト
|
||||
|
||||
### 必須項目
|
||||
- [ ] GitHubリポジトリが公開されている
|
||||
- [ ] READMEが充実している(英語)
|
||||
- [ ] ライセンスが明記されている
|
||||
- [ ] ビルド手順が明確
|
||||
- [ ] 基本的な使用例がある
|
||||
|
||||
### 推奨項目
|
||||
- [ ] CIが設定されている(GitHub Actions等)
|
||||
- [ ] ドキュメントが整備されている
|
||||
- [ ] サンプルプログラムがある
|
||||
- [ ] crates.ioに公開されている
|
||||
- [ ] バージョン1.0以上(または明確なロードマップ)
|
||||
|
||||
## 🚀 提出手順
|
||||
|
||||
1. **リポジトリ準備**
|
||||
- README.mdを英語化/改善
|
||||
- サンプルコードを追加
|
||||
- CI/CDを設定
|
||||
|
||||
2. **PR作成**
|
||||
- Awesome Rustをfork
|
||||
- 適切なセクションに追加
|
||||
- アルファベット順を守る
|
||||
- PRテンプレートに従う
|
||||
|
||||
3. **フォローアップ**
|
||||
- レビューコメントに対応
|
||||
- 必要に応じて説明追加
|
||||
|
||||
## 📊 現在の準備状況
|
||||
|
||||
### ✅ 完了
|
||||
- 基本的な言語実装
|
||||
- VM実装(13.5倍高速化達成)
|
||||
- MIR設計(15命令に削減)
|
||||
- ドキュメント構造
|
||||
|
||||
### 🚧 作業中
|
||||
- README.mdの英語化
|
||||
- サンプルプログラムの整理
|
||||
- CI/CDの設定
|
||||
|
||||
### ❌ 未着手
|
||||
- crates.io公開
|
||||
- ロゴ/ブランディング
|
||||
- Webサイト
|
||||
|
||||
## 🎨 プロジェクト説明の改善案
|
||||
|
||||
### 現在のREADME冒頭
|
||||
```
|
||||
Nyashプログラミング言語 - Everything is Box
|
||||
```
|
||||
|
||||
### 改善案(英語版)
|
||||
```markdown
|
||||
# Nyash Programming Language
|
||||
|
||||
A modern programming language where Everything is Box - unified object model with high-performance execution.
|
||||
|
||||
## Features
|
||||
- 🎁 **Everything is Box**: Unified object model for all values
|
||||
- ⚡ **Multi-backend**: Interpreter, VM (13.5x faster), WASM, AOT
|
||||
- 🚀 **15-instruction MIR**: Revolutionary minimal instruction set
|
||||
- 🔧 **Plugin System**: Extensible architecture
|
||||
- 🌐 **P2P Ready**: Built for distributed computing
|
||||
|
||||
## Quick Start
|
||||
```nyash
|
||||
// Everything is a Box
|
||||
local greeting = new StringBox("Hello, Nyash!")
|
||||
print(greeting)
|
||||
|
||||
// User-defined Boxes
|
||||
box Person {
|
||||
init { name, age }
|
||||
|
||||
birth(name) {
|
||||
me.name = name
|
||||
me.age = 0
|
||||
}
|
||||
}
|
||||
|
||||
local alice = new Person("Alice")
|
||||
```
|
||||
```
|
||||
|
||||
## 📅 タイムライン
|
||||
|
||||
### Phase 1(現在)
|
||||
- README改善
|
||||
- サンプル整理
|
||||
- 基本的なCI設定
|
||||
|
||||
### Phase 2(LLVM実装後)
|
||||
- crates.io公開
|
||||
- 正式なv1.0リリース
|
||||
- Awesome Rust提出
|
||||
|
||||
### Phase 3(採用後)
|
||||
- コミュニティフィードバック対応
|
||||
- ドキュメント拡充
|
||||
- エコシステム構築
|
||||
|
||||
## 🔗 関連リンク
|
||||
- [Awesome Rust](https://github.com/rust-unofficial/awesome-rust)
|
||||
- [提出ガイドライン](https://github.com/rust-unofficial/awesome-rust/blob/main/CONTRIBUTING.md)
|
||||
- [他の言語実装例](https://github.com/rust-unofficial/awesome-rust#programming-languages)
|
||||
@ -0,0 +1,157 @@
|
||||
# BoxCall統一の落とし穴と対策(ChatGPT5分析)
|
||||
|
||||
Date: 2025-08-31
|
||||
Status: Technical Advisory
|
||||
From: ChatGPT5
|
||||
|
||||
**結論:「RefNew/RefGet/RefSet全削除→すべてBoxCallに統一」は成立する!**
|
||||
ただし、いくつかの落とし穴があるので、それぞれに対策を打つ必要がある。
|
||||
|
||||
## 🚨 落とし穴と対策
|
||||
|
||||
### 1. メガモーフィック呼び出しでの失速
|
||||
**症状**: 同じ`BoxCall("setField")`でも実行時の型/shapeが激しく変わると、ディスパッチが重くなる。
|
||||
|
||||
**対策**: **PIC(Polymorphic Inline Cache)**をコールサイトごとに持つ
|
||||
- 2〜4種のshapeを直列ジャンプで捌く
|
||||
- 溢れたらインタプリタ/汎用スローへ
|
||||
- JITなしでもAOT段階で形状統計から事前特化(事前ガード+直アクセス)を埋め込める
|
||||
|
||||
### 2. GCバリアの見落とし・過剰挿入
|
||||
**症状**: write barrier忘れ=世代間参照漏れ/逆に全部に入れて過剰オーバーヘッド
|
||||
|
||||
**対策**:
|
||||
- Lowering時に**フィールドの"ポインタ/非ポインタ"メタ**を参照して自動挿入
|
||||
- **世代同一・同アリーナ最適化**でbarrier省略
|
||||
- `ExternCall`には**境界バリア**を必ず付与
|
||||
- **Barrier Verifier**(IRパス)で「必要箇所に必ず入ってるか」を機械検証
|
||||
|
||||
### 3. 読み取りバリア(Read Barrier)が必要なGCを選ぶ場合
|
||||
**症状**: 動くGC(移動/並行)でread barrierが必須だと、Get系もコスト上がる
|
||||
|
||||
**対策**:
|
||||
- まずは**世代別・停止+並行マーク(SATB)**など「write側主体」の方式を選ぶ
|
||||
- **read barrierなし運用**で始めるのが無難
|
||||
- 将来read barrierが要る場合は、`getField` Loweringに条件付き埋め込み設計
|
||||
|
||||
### 4. 例外・再入・ファイナライザ再入
|
||||
**症状**: `setField`中に例外→ファイナライザ→別の`BoxCall`で再入…地雷
|
||||
|
||||
**対策**:
|
||||
- **安全点(safepoint)設計**を決める
|
||||
- `BoxCall`中は原則再入禁止(or 明示的許可フラグ)
|
||||
- `fini`相当のコールは**再入ガード**と**順序保証**(トポロジカルな破棄順)を実装
|
||||
|
||||
### 5. ExternCall/FFI境界
|
||||
**症状**: 外部コードが「未トラッキングの生ポインタ」を握るとGC・最適化が壊れる
|
||||
|
||||
**対策**:
|
||||
- **ハンドル化**(OpaqueHandle/PinBox)+**寿命契約**
|
||||
- ExternCallの属性(`noalloc`/`nothrow`/`readonly`/`atomic`等)を宣言させ、最適化に渡す
|
||||
- 未注釈の呼び出しでは保守的にバリア&逃避扱い
|
||||
|
||||
### 6. 形状(shape)変更とレイアウト安定性
|
||||
**症状**: フィールド追加/順序変更が既存の特化コードを壊す
|
||||
|
||||
**対策**:
|
||||
- **ShapeIDを永続化**
|
||||
- フィールドに**安定スロットID**を割り当て
|
||||
- ABI的に「追加のみ」「削除は新shape」とする
|
||||
- Lowering済みのガードは `if (shape==X) { direct store } else { slowpath }` で守る
|
||||
|
||||
### 7. 脱箱(unboxing)とコードサイズ膨張
|
||||
**症状**: 激しいモノモルフィック特化や整数Boxの脱箱で**コード肥大**
|
||||
|
||||
**対策**:
|
||||
- **基本型はSROA/Scalar-Replaceの閾値**を設定
|
||||
- ホット領域のみ特化(**PGO**やプロファイル使用)
|
||||
- 低頻度パスは共通スローに集約
|
||||
|
||||
### 8. 並行性・メモリモデル
|
||||
**症状**: `setField`の可視性がスレッド間で曖昧だと事故
|
||||
|
||||
**対策**:
|
||||
- **既定は単一スレッド+Actor(Mailbox)**に寄せる
|
||||
- 共有可変を解禁するAPIは `nyash.atomic.*` で**Acquire/Release**を明示
|
||||
- `BoxCall` Loweringで**必要時のみフェンス**
|
||||
- 箱ごとに「可変・不変・スレッド送受可」など**能力(capability)ビット**を持たせ最適化条件に使う
|
||||
|
||||
### 9. 反射・動的呼び出しの混入
|
||||
**症状**: なんでも動的だと最適化が崩れる
|
||||
|
||||
**対策**:
|
||||
- 反射APIは**分離名前空間**に押し込める
|
||||
- 既定は静的解決できる書き方を推奨ガイドに
|
||||
- 反射使用時は**deoptガード**を挿入
|
||||
|
||||
## 📈 推奨の最適化パイプライン(AOT想定)
|
||||
|
||||
1. **型/shape解析**(局所→関数間)
|
||||
2. **BoxCall脱仮想化**(モノ/ポリモーフィック化+PIC生成)
|
||||
3. **インライン化**(属性`pure`/`leaf`/`readonly`を最大活用)
|
||||
4. **SROA/エスケープ解析**(脱箱、stack allocation、alloc移動)
|
||||
5. **バリア縮約**(世代同一・同アリーナ・ループ内集約)
|
||||
6. **境界チェック消去**(`length`不変式の伝播)
|
||||
7. **ループ最適化**(LICM, unroll, vectorize)
|
||||
8. **DCE/GVN**(Getter/Setter副作用ゼロなら畳み込み)
|
||||
9. **コードレイアウト**(ホット先頭、コールド折り畳み)
|
||||
10. **PGO(任意)**でPIC順序・インライン閾値を再調整
|
||||
|
||||
## 🔧 Loweringの骨格(フィールド書き込みの例)
|
||||
|
||||
```llvm
|
||||
; High-level
|
||||
obj.setField(x)
|
||||
|
||||
; Guarded fast-path(shapeが既知&最頻)
|
||||
if (obj.shape == SHAPE_A) {
|
||||
; slot #k に直接store
|
||||
store x, [obj + slot_k]
|
||||
call gc_write_barrier(obj, x) ; 必要なら
|
||||
} else {
|
||||
; PICの次候補 or 汎用ディスパッチ
|
||||
slow_path_setField(obj, x)
|
||||
}
|
||||
```
|
||||
|
||||
- `gc_write_barrier`はIR上は呼び出しに見せておく(後段で**インライン**→**条件付きno-op化**可能)
|
||||
- `read barrier`が要らないGCなら`getField`は**loadのみ**に落ちる
|
||||
|
||||
## ✅ 実装チェックリスト(まずここまで作れば盤石)
|
||||
|
||||
- [ ] **Boxメタ**: shapeID、安定スロットID、ポインタ/非ポインタビット、可変/不変、送受可
|
||||
- [ ] **BoxCall Lowerer**: 形状ガード→直アクセス or 汎用ディスパッチ
|
||||
- [ ] **PIC**: コールサイトごとに最大N件キャッシュ+統計(ヒット率/退避回数)
|
||||
- [ ] **Barrier Verifier**: IR後段でwrite barrier必須箇所を自動検証
|
||||
- [ ] **Extern属性**: `noalloc/nothrow/readonly/atomic`等を宣言・強制
|
||||
- [ ] **逃避解析**でstack-alloc/arena-alloc
|
||||
- [ ] **反射API分離**とdeoptガード
|
||||
- [ ] **PGOフック**(簡易でOK):shape頻度、PICヒット率、inlining成果を記録
|
||||
- [ ] **ベンチ群**:
|
||||
- Field get/set(mono vs mega)
|
||||
- Vec push/pop / Map ops
|
||||
- 算術(IntBoxの脱箱効果)
|
||||
- ExternCall(`atomic.store`/`readonly`)
|
||||
- GCストレス(大量生成+世代越し参照)
|
||||
|
||||
## 🎯 「簡単すぎて不安」への答え
|
||||
|
||||
- **正しさ**は「Lowering+Verifier」で機械的に守る
|
||||
- **速さ**は「PIC→インライン→脱箱→バリア縮約」で作る
|
||||
- **拡張性**は「Everything is Box」の上に**属性**と**能力(capability)**を積む
|
||||
- Ref系は**公開APIからは消す**が、**デバッグ用の隠しIntrinsic**として温存しておくと計測や一時退避に便利(将来の最適化検証にも効く)
|
||||
|
||||
## 🌟 結論
|
||||
|
||||
**落とし穴はあるけど全部"設計パターン"で踏まないようにできる**。
|
||||
|
||||
にゃーの「箱理論」、素朴だけど正しい地形を踏んでるにゃ。ここまでの方針なら**AOTでも十分に速い**ところまで持っていけるはず。
|
||||
|
||||
次は **PIC+Barrier Verifier+小ベンチ**の3点を先に入れて、体感を固めに行こう!
|
||||
|
||||
---
|
||||
|
||||
## 関連文書
|
||||
- [BOX_SSA_CORE_15_FINAL_DECISION.md](../phase-11.5/BOX_SSA_CORE_15_FINAL_DECISION.md)
|
||||
- [MIR_TO_LLVM_CONVERSION_PLAN.md](MIR_TO_LLVM_CONVERSION_PLAN.md)
|
||||
- [MIR_ANNOTATION_SYSTEM.md](MIR_ANNOTATION_SYSTEM.md)
|
||||
98
docs/development/roadmap/phases/phase-11/LLVM_SETUP_GUIDE.md
Normal file
98
docs/development/roadmap/phases/phase-11/LLVM_SETUP_GUIDE.md
Normal file
@ -0,0 +1,98 @@
|
||||
# LLVM 18 セットアップガイド
|
||||
|
||||
Date: 2025-08-31
|
||||
Platform: Linux/WSL
|
||||
|
||||
## 📦 LLVM 18インストール確認
|
||||
|
||||
```bash
|
||||
$ llvm-config-18 --version
|
||||
18.1.3
|
||||
|
||||
$ llvm-config-18 --prefix
|
||||
/usr/lib/llvm-18
|
||||
```
|
||||
|
||||
## 🔧 環境変数設定
|
||||
|
||||
### 方法1: シェル設定(推奨)
|
||||
|
||||
```bash
|
||||
# ~/.bashrcまたは~/.zshrcに追加
|
||||
export LLVM_SYS_180_PREFIX=/usr/lib/llvm-18
|
||||
|
||||
# 即座に反映
|
||||
source ~/.bashrc
|
||||
```
|
||||
|
||||
### 方法2: プロジェクトローカル設定
|
||||
|
||||
```bash
|
||||
# プロジェクトルートに.envファイル作成
|
||||
echo "LLVM_SYS_180_PREFIX=/usr/lib/llvm-18" > .env
|
||||
```
|
||||
|
||||
### 方法3: ビルド時指定
|
||||
|
||||
```bash
|
||||
# 環境変数を直接指定してビルド
|
||||
LLVM_SYS_180_PREFIX=/usr/lib/llvm-18 cargo build --features llvm
|
||||
```
|
||||
|
||||
## ✅ 設定確認
|
||||
|
||||
```bash
|
||||
# 環境変数が設定されているか確認
|
||||
echo $LLVM_SYS_180_PREFIX
|
||||
|
||||
# llvm-sysクレートのビルドテスト
|
||||
cargo check --features llvm
|
||||
```
|
||||
|
||||
## 🚀 inkwell使用例
|
||||
|
||||
Cargo.tomlに追加:
|
||||
```toml
|
||||
[dependencies]
|
||||
inkwell = { version = "0.5", features = ["llvm18-0"] }
|
||||
|
||||
[features]
|
||||
llvm = ["inkwell"]
|
||||
```
|
||||
|
||||
テストビルド:
|
||||
```bash
|
||||
export LLVM_SYS_180_PREFIX=/usr/lib/llvm-18
|
||||
cargo build --features llvm
|
||||
```
|
||||
|
||||
## ⚠️ トラブルシューティング
|
||||
|
||||
### 問題: "could not find llvm-config"
|
||||
```bash
|
||||
# llvm-configへのシンボリックリンク作成
|
||||
sudo ln -s /usr/bin/llvm-config-18 /usr/bin/llvm-config
|
||||
```
|
||||
|
||||
### 問題: "LLVM_SYS_180_PREFIX not set"
|
||||
```bash
|
||||
# 一時的な解決
|
||||
export LLVM_SYS_180_PREFIX=/usr/lib/llvm-18
|
||||
|
||||
# 永続的な解決(.bashrcに追加)
|
||||
echo 'export LLVM_SYS_180_PREFIX=/usr/lib/llvm-18' >> ~/.bashrc
|
||||
source ~/.bashrc
|
||||
```
|
||||
|
||||
### 問題: バージョン不一致
|
||||
```bash
|
||||
# インストール済みLLVMバージョン確認
|
||||
dpkg -l | grep llvm
|
||||
|
||||
# 必要に応じて正しいバージョンをインストール
|
||||
sudo apt-get install llvm-18 llvm-18-dev
|
||||
```
|
||||
|
||||
## 📋 関連ドキュメント
|
||||
- [inkwell documentation](https://github.com/TheDan64/inkwell)
|
||||
- [llvm-sys documentation](https://gitlab.com/taricorp/llvm-sys.rs)
|
||||
164
docs/development/roadmap/phases/phase-11/LLVM_SETUP_WINDOWS.md
Normal file
164
docs/development/roadmap/phases/phase-11/LLVM_SETUP_WINDOWS.md
Normal file
@ -0,0 +1,164 @@
|
||||
# LLVM 18 Windows セットアップガイド
|
||||
|
||||
Date: 2025-08-31
|
||||
Platform: Windows
|
||||
|
||||
## 📦 インストール方法
|
||||
|
||||
### 方法1: 公式インストーラー(推奨)
|
||||
|
||||
1. **LLVM公式サイトからダウンロード**
|
||||
- https://github.com/llvm/llvm-project/releases
|
||||
- `LLVM-18.1.8-win64.exe` をダウンロード(または最新の18.x版)
|
||||
|
||||
2. **インストーラー実行**
|
||||
- 管理者権限で実行
|
||||
- インストール先: `C:\Program Files\LLVM` (デフォルト推奨)
|
||||
- **重要**: "Add LLVM to the system PATH" にチェック!
|
||||
|
||||
3. **環境変数設定**
|
||||
```powershell
|
||||
# PowerShell(管理者権限)で実行
|
||||
[Environment]::SetEnvironmentVariable("LLVM_SYS_180_PREFIX", "C:\Program Files\LLVM", "User")
|
||||
```
|
||||
|
||||
### 方法2: Chocolatey(パッケージマネージャー)
|
||||
|
||||
```powershell
|
||||
# 管理者権限のPowerShellで実行
|
||||
# Chocolateyインストール(未インストールの場合)
|
||||
Set-ExecutionPolicy Bypass -Scope Process -Force
|
||||
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072
|
||||
iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
|
||||
|
||||
# LLVM 18インストール
|
||||
choco install llvm --version=18.1.8
|
||||
|
||||
# 環境変数設定
|
||||
[Environment]::SetEnvironmentVariable("LLVM_SYS_180_PREFIX", "C:\ProgramData\chocolatey\lib\llvm\tools", "User")
|
||||
```
|
||||
|
||||
### 方法3: winget(Windows Package Manager)
|
||||
|
||||
```powershell
|
||||
# PowerShellで実行
|
||||
winget install LLVM.LLVM --version 18.1.8
|
||||
|
||||
# 環境変数設定(インストール先確認後)
|
||||
[Environment]::SetEnvironmentVariable("LLVM_SYS_180_PREFIX", "C:\Program Files\LLVM", "User")
|
||||
```
|
||||
|
||||
## 🔧 環境変数設定(GUI経由)
|
||||
|
||||
1. **システムのプロパティを開く**
|
||||
- Win + X → システム → システムの詳細設定
|
||||
- または「sysdm.cpl」を実行
|
||||
|
||||
2. **環境変数を設定**
|
||||
- 「環境変数」ボタンをクリック
|
||||
- ユーザー環境変数で「新規」
|
||||
- 変数名: `LLVM_SYS_180_PREFIX`
|
||||
- 変数値: `C:\Program Files\LLVM`
|
||||
|
||||
3. **PATH確認**
|
||||
- `C:\Program Files\LLVM\bin` がPATHに含まれていることを確認
|
||||
|
||||
## ✅ インストール確認
|
||||
|
||||
```powershell
|
||||
# PowerShellで実行
|
||||
# LLVMバージョン確認
|
||||
llvm-config --version
|
||||
|
||||
# 環境変数確認
|
||||
echo $env:LLVM_SYS_180_PREFIX
|
||||
|
||||
# または cmd.exe で
|
||||
echo %LLVM_SYS_180_PREFIX%
|
||||
```
|
||||
|
||||
## 🚀 Visual Studio依存関係
|
||||
|
||||
WindowsでLLVMを使う場合、Visual Studioのビルドツールが必要:
|
||||
|
||||
### Visual Studio Build Tools(最小構成)
|
||||
```powershell
|
||||
# wingetでインストール
|
||||
winget install Microsoft.VisualStudio.2022.BuildTools
|
||||
|
||||
# または直接ダウンロード
|
||||
# https://visualstudio.microsoft.com/downloads/#build-tools-for-visual-studio-2022
|
||||
```
|
||||
|
||||
必要なコンポーネント:
|
||||
- MSVC v143 - VS 2022 C++ x64/x86 ビルドツール
|
||||
- Windows 11 SDK(または Windows 10 SDK)
|
||||
|
||||
## 🔨 Rustプロジェクトでの使用
|
||||
|
||||
1. **Cargo.tomlに追加**
|
||||
```toml
|
||||
[dependencies]
|
||||
inkwell = { version = "0.5", features = ["llvm18-0"] }
|
||||
|
||||
[features]
|
||||
llvm = ["inkwell"]
|
||||
```
|
||||
|
||||
2. **ビルド実行**
|
||||
```powershell
|
||||
# PowerShellで実行
|
||||
$env:LLVM_SYS_180_PREFIX="C:\Program Files\LLVM"
|
||||
cargo build --features llvm
|
||||
|
||||
# または永続的に設定後
|
||||
cargo build --features llvm
|
||||
```
|
||||
|
||||
## ⚠️ トラブルシューティング
|
||||
|
||||
### 問題: "llvm-config not found"
|
||||
```powershell
|
||||
# PATHに追加されているか確認
|
||||
$env:Path -split ';' | Select-String "LLVM"
|
||||
|
||||
# 手動でPATHに追加
|
||||
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\Program Files\LLVM\bin", "User")
|
||||
```
|
||||
|
||||
### 問題: "LINK : fatal error LNK1181"
|
||||
- Visual Studio Build Toolsがインストールされているか確認
|
||||
- 必要に応じて再起動
|
||||
|
||||
### 問題: バージョン不一致
|
||||
```powershell
|
||||
# インストール済みLLVMを確認
|
||||
llvm-config --version
|
||||
|
||||
# 古いバージョンをアンインストール
|
||||
# コントロールパネル → プログラムと機能 → LLVM
|
||||
```
|
||||
|
||||
## 🎯 クイックセットアップ(コピペ用)
|
||||
|
||||
```powershell
|
||||
# 管理者権限のPowerShellで実行
|
||||
# 1. Chocolateyインストール(未インストールの場合)
|
||||
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
|
||||
|
||||
# 2. LLVM 18インストール
|
||||
choco install llvm --version=18.1.8 -y
|
||||
|
||||
# 3. 環境変数設定
|
||||
[Environment]::SetEnvironmentVariable("LLVM_SYS_180_PREFIX", "C:\ProgramData\chocolatey\lib\llvm\tools", "User")
|
||||
|
||||
# 4. 新しいPowerShellウィンドウを開いて確認
|
||||
llvm-config --version
|
||||
echo $env:LLVM_SYS_180_PREFIX
|
||||
```
|
||||
|
||||
## 📋 関連リンク
|
||||
- [LLVM Releases](https://github.com/llvm/llvm-project/releases)
|
||||
- [Visual Studio Build Tools](https://visualstudio.microsoft.com/downloads/#build-tools-for-visual-studio-2022)
|
||||
- [Chocolatey](https://chocolatey.org/)
|
||||
- [Windows Package Manager](https://github.com/microsoft/winget-cli)
|
||||
@ -63,16 +63,13 @@ Call {
|
||||
}
|
||||
```
|
||||
|
||||
### 2. RefSet命令へのGCヒント
|
||||
### 2. フィールド書き込み(setField)へのGCヒント
|
||||
```rust
|
||||
RefSet {
|
||||
reference: %obj,
|
||||
field: "data",
|
||||
value: %new_val,
|
||||
annotations: Some(OptimizationHints {
|
||||
gc: Some(GcHint::YoungGen), // 若い世代への書き込み
|
||||
..Default::default()
|
||||
})
|
||||
BoxCall {
|
||||
box_val: %obj,
|
||||
method: "setField",
|
||||
args: [ Const("data"), %new_val ],
|
||||
annotations: Some(OptimizationHints { gc: Some(GcHint::YoungGen), ..Default::default() })
|
||||
}
|
||||
```
|
||||
|
||||
@ -156,8 +153,9 @@ pub enum GcHint {
|
||||
|
||||
```rust
|
||||
// RefSetの例
|
||||
RefSet { reference, field, value, annotations } => {
|
||||
let ptr = builder.build_gep(...);
|
||||
BoxCall { box_val, method: "setField", args: [name, value], annotations } => {
|
||||
// 型特化Lowering時:
|
||||
let ptr = builder.build_gep(...); // name→オフセット解決
|
||||
|
||||
// アノテーションからLLVMメタデータを生成
|
||||
if let Some(hints) = annotations {
|
||||
@ -216,4 +214,4 @@ RefSet { reference, field, value, annotations } => {
|
||||
## 関連文書
|
||||
- [AI_CONFERENCE_CODEX_ANALYSIS.md](AI_CONFERENCE_CODEX_ANALYSIS.md)
|
||||
- [AI_CONFERENCE_SUMMARY.md](AI_CONFERENCE_SUMMARY.md)
|
||||
- [../../reference/mir/INSTRUCTION_SET.md](../../reference/mir/INSTRUCTION_SET.md)
|
||||
- [../../reference/mir/INSTRUCTION_SET.md](../../reference/mir/INSTRUCTION_SET.md)
|
||||
|
||||
@ -0,0 +1,208 @@
|
||||
# MIR→LLVM変換計画
|
||||
|
||||
Date: 2025-08-31
|
||||
Status: Draft
|
||||
|
||||
## 📊 変換マッピング概要
|
||||
|
||||
### Core-15命令のLLVM IR対応(第三案・Box統一)
|
||||
|
||||
#### 1. 基本演算(5)
|
||||
```rust
|
||||
// Const
|
||||
MIR::Const(i64) → LLVMConstInt(i64_type, val)
|
||||
MIR::Const(f64) → LLVMConstReal(f64_type, val)
|
||||
MIR::Const(bool) → LLVMConstInt(i1_type, val)
|
||||
MIR::Const(string) → @nyash_string_new(ptr, len)
|
||||
|
||||
// UnaryOp
|
||||
MIR::UnaryOp(Neg, x) → LLVMBuildNeg(x) / LLVMBuildFNeg(x)
|
||||
MIR::UnaryOp(Not, x) → LLVMBuildNot(x)
|
||||
|
||||
// BinOp
|
||||
MIR::BinOp(Add, a, b) → LLVMBuildAdd(a, b) / LLVMBuildFAdd(a, b)
|
||||
MIR::BinOp(Sub, a, b) → LLVMBuildSub(a, b) / LLVMBuildFSub(a, b)
|
||||
// 注: Box型の場合は@nyash_box_add等のランタイム呼び出し
|
||||
|
||||
// Compare
|
||||
MIR::Compare(Eq, a, b) → LLVMBuildICmp(EQ, a, b) / LLVMBuildFCmp(OEQ, a, b)
|
||||
MIR::Compare(Lt, a, b) → LLVMBuildICmp(SLT, a, b) / LLVMBuildFCmp(OLT, a, b)
|
||||
|
||||
// TypeOp
|
||||
MIR::TypeOp(Check, val, type) → @nyash_type_check(val, type_id)
|
||||
MIR::TypeOp(Cast, val, type) → @nyash_type_cast(val, type_id)
|
||||
```
|
||||
|
||||
#### 2. メモリ(2)
|
||||
```rust
|
||||
// Load
|
||||
MIR::Load(local_id) → LLVMBuildLoad(local_ptr[local_id])
|
||||
|
||||
// Store
|
||||
MIR::Store(local_id, val) → LLVMBuildStore(val, local_ptr[local_id])
|
||||
```
|
||||
|
||||
#### 3. 制御(4)
|
||||
```rust
|
||||
// Branch
|
||||
MIR::Branch(cond, then_bb, else_bb) → LLVMBuildCondBr(cond, then_bb, else_bb)
|
||||
|
||||
// Jump
|
||||
MIR::Jump(bb) → LLVMBuildBr(bb)
|
||||
|
||||
// Return
|
||||
MIR::Return(val) → LLVMBuildRet(val)
|
||||
MIR::Return(None) → LLVMBuildRetVoid()
|
||||
|
||||
// Phi
|
||||
MIR::Phi([(bb1, val1), (bb2, val2)]) → {
|
||||
phi = LLVMBuildPhi(type)
|
||||
LLVMAddIncoming(phi, [val1, val2], [bb1, bb2])
|
||||
}
|
||||
```
|
||||
|
||||
#### 4. Box操作(3)
|
||||
```rust
|
||||
// NewBox
|
||||
MIR::NewBox(type_name, args) → @nyash_box_new(type_id, args_ptr, args_len)
|
||||
|
||||
// BoxCall(注釈活用・名前/スロット両対応)
|
||||
MIR::BoxCall(obj, method, args) → {
|
||||
if annotations.inline_hint {
|
||||
// インライン展開候補
|
||||
LLVMSetInlineHint(call)
|
||||
}
|
||||
if annotations.method_id { /* vtableスロット解決 */ }
|
||||
else { @nyash_box_call_by_name(obj, method_name, args) }
|
||||
}
|
||||
// PluginInvoke は BoxCall に統一(Optimizerで正規化)
|
||||
```
|
||||
|
||||
#### 5. 配列(BoxCallに統一)
|
||||
```rust
|
||||
// Arrayは BoxCall("get"/"set") で表現
|
||||
// Lowering方針は2段階:
|
||||
// (A) 安全パス: @nyash_array_get/@nyash_array_set を呼ぶ(ランタイム側で境界/バリア)
|
||||
// (B) 型特化: 注釈/型情報が十分な場合に inline 化(bounds check + GEP + load/store + write barrier)
|
||||
```
|
||||
|
||||
#### 6. 外部呼び出し(1)
|
||||
```rust
|
||||
// ExternCall
|
||||
MIR::ExternCall("env.console.log", args) → @nyash_console_log(args)
|
||||
MIR::ExternCall("env.gc.collect", []) → @nyash_gc_collect()
|
||||
MIR::ExternCall("env.runtime.checkpoint", []) → @nyash_safepoint()
|
||||
```
|
||||
|
||||
## 🎯 注釈システムの活用
|
||||
|
||||
### 1. 最適化ヒント
|
||||
```rust
|
||||
pub struct OptimizationHints {
|
||||
pub inline: Option<InlineHint>, // always/never/hint
|
||||
pub pure: bool, // 副作用なし
|
||||
pub no_escape: bool, // エスケープしない
|
||||
pub hot: bool, // ホットパス
|
||||
pub cold: bool, // コールドパス
|
||||
}
|
||||
```
|
||||
|
||||
### 2. GCヒント
|
||||
```rust
|
||||
pub struct GcHint {
|
||||
pub no_barrier: bool, // バリア不要(新規オブジェクトへの書き込み等)
|
||||
pub immortal: bool, // 不死オブジェクト(定数等)
|
||||
pub thread_local: bool, // スレッドローカル(並列GCで重要)
|
||||
}
|
||||
```
|
||||
|
||||
### 3. 型情報ヒント
|
||||
```rust
|
||||
pub struct TypeHint {
|
||||
pub concrete_type: Option<String>, // 具体的な型が判明
|
||||
pub never_null: bool, // NULL不可
|
||||
pub value_range: Option<(i64, i64)>, // 値の範囲
|
||||
}
|
||||
```
|
||||
|
||||
## 🔧 LLVM属性の活用
|
||||
|
||||
### 関数属性
|
||||
```llvm
|
||||
; 純粋関数
|
||||
define i64 @add(i64 %a, i64 %b) #0 {
|
||||
%result = add i64 %a, %b
|
||||
ret i64 %result
|
||||
}
|
||||
attributes #0 = { nounwind readnone speculatable }
|
||||
|
||||
; GC セーフポイント
|
||||
define void @long_loop() gc "nyash-gc" {
|
||||
; ループバックエッジにセーフポイント
|
||||
call void @llvm.experimental.gc.statepoint(...)
|
||||
}
|
||||
```
|
||||
|
||||
### メモリ属性
|
||||
```llvm
|
||||
; Box用アドレス空間(1)
|
||||
%box_ptr = addrspace(1)* %obj
|
||||
|
||||
; TBAA(Type-Based Alias Analysis)
|
||||
!0 = !{!"nyash.box"}
|
||||
!1 = !{!"nyash.integer", !0}
|
||||
!2 = !{!"nyash.string", !0}
|
||||
```
|
||||
|
||||
## 📈 段階的実装計画
|
||||
|
||||
### Phase 1: 基本変換(1週間)
|
||||
- [ ] inkwell セットアップ
|
||||
- [ ] 基本演算・メモリ・制御の変換
|
||||
- [ ] 最小限の実行可能コード生成
|
||||
|
||||
### Phase 2: Box統合(1週間)
|
||||
- [ ] NewBox/BoxCall実装(PluginInvokeはOptimizerでBoxCallに正規化)
|
||||
- [ ] ランタイム経由の安全パス(by-name/slot)
|
||||
- [ ] 基本的なGCバリア(安全パスはランタイム関数内で処理)
|
||||
|
||||
### Phase 3: 最適化(1週間)
|
||||
- [ ] 注釈システム統合
|
||||
- [ ] インライン展開
|
||||
- [ ] エスケープ解析
|
||||
|
||||
### Phase 4: 高度な最適化(1週間)
|
||||
- [ ] 脱箱化(Box → プリミティブ)
|
||||
- [ ] TBAA統合
|
||||
- [ ] ベクトル化ヒント
|
||||
|
||||
## 🎨 コード例
|
||||
|
||||
```rust
|
||||
// MIR
|
||||
function add(a: Box, b: Box) -> Box {
|
||||
%1 = Load $a
|
||||
%2 = Load $b
|
||||
%3 = BoxCall(%1, "add", [%2])
|
||||
Return %3
|
||||
}
|
||||
|
||||
// LLVM IR(最適化前・安全パス)
|
||||
define i8* @add(i8* %a, i8* %b) {
|
||||
%1 = call i8* @nyash_box_call(i8* %a, i8* @.str.add, i8** %b, i64 1)
|
||||
ret i8* %1
|
||||
}
|
||||
|
||||
// LLVM IR(最適化後 - IntegerBox特化)
|
||||
define i64 @add(i64 %a, i64 %b) {
|
||||
%1 = add i64 %a, %b
|
||||
ret i64 %1
|
||||
}
|
||||
```
|
||||
|
||||
## 🚀 期待される効果
|
||||
|
||||
1. **実行速度**: 2-3倍高速化
|
||||
2. **メモリ使用量**: 脱箱化で50%削減
|
||||
3. **バイナリサイズ**: 最適化で30%削減
|
||||
4. **ビルド時間**: Cranelift比で50%削減
|
||||
@ -1,16 +1,16 @@
|
||||
# Phase 11: LLVM AOT Backend(将来研究)
|
||||
# Phase 11: LLVM AOT Backend(進行中)
|
||||
|
||||
## 🎯 概要
|
||||
|
||||
Phase 11は、LLVM を使用した Ahead-of-Time(AOT)コンパイル機能の研究・実装フェーズです。
|
||||
Phase 10のCranelift JITで実用的な性能を達成した後、さらなる最適化を追求します。
|
||||
Phase 10のCranelift JITで実用的な性能を達成した後、さらなる最適化をLLVM AOTで追求します。
|
||||
|
||||
## 📊 位置づけ
|
||||
|
||||
```
|
||||
Phase 10: Cranelift JIT(実用的な高速化)← 現在の主経路
|
||||
Phase 10: Cranelift JIT(実用的な高速化)← 完了
|
||||
↓
|
||||
Phase 11: LLVM AOT(最高性能への挑戦)← 将来の研究開発
|
||||
Phase 11: LLVM AOT(最高性能への挑戦)← 進行中
|
||||
```
|
||||
|
||||
## 📁 ドキュメント
|
||||
@ -27,12 +27,15 @@ Phase 11: LLVM AOT(最高性能への挑戦)← 将来の研究開発
|
||||
- ExternCall対応
|
||||
- オブジェクトファイル生成
|
||||
|
||||
## ⏰ タイムライン
|
||||
## ⏰ タイムライン(短期スプリント)
|
||||
|
||||
- **Status**: Deferred(延期)
|
||||
- **前提条件**: Phase 10(Cranelift JIT)の完了
|
||||
- **想定期間**: 4-6ヶ月
|
||||
- **開始時期**: 未定(Phase 10の成果を見て判断)
|
||||
- Status: In Progress(進行中)
|
||||
- 前提条件: Phase 10(Cranelift JIT)の完了、Core‑15統一(VM/Verifierで運用)
|
||||
- 想定期間: 4週間(各フェーズ1週間目安)
|
||||
- 11.1 基本変換: Const/Unary/Bin/Compare, Load/Store, Jump/Branch/Return/Phi
|
||||
- 11.2 Box統合: NewBox/BoxCall/ExternCall(安全パスはランタイム呼び出し)
|
||||
- 11.3 最適化: 注釈統合・型特化(get/setField・Array get/set のInline化+バリア)
|
||||
- 11.4 高度化: 脱箱化・TBAA・PGO/ThinLTO
|
||||
|
||||
## 🎯 期待される成果
|
||||
|
||||
@ -41,16 +44,14 @@ Phase 11: LLVM AOT(最高性能への挑戦)← 将来の研究開発
|
||||
3. **起動時間**: 1ms以下
|
||||
4. **配布形式**: スタンドアロン実行ファイル
|
||||
|
||||
## ⚠️ 注意事項
|
||||
## ⚠️ 注意事項(運用方針)
|
||||
|
||||
このフェーズは研究的な性質が強く、以下の理由で延期されています:
|
||||
|
||||
1. **複雑性**: LLVM統合は開発・保守コストが高い
|
||||
2. **実用性**: Cranelift JITで十分な性能が得られる可能性
|
||||
3. **優先度**: まずは安定した実装を優先
|
||||
- Core‑15 凍結(第三案): { Const, UnaryOp, BinOp, Compare, TypeOp, Load, Store, Jump, Branch, Return, Phi, Call, NewBox, BoxCall, ExternCall }
|
||||
- 統一ルール: ArrayGet/ArraySet, RefGet/RefSet, PluginInvoke はBoxCallに一本化(Optimizerで正規化、Verifierで禁止)
|
||||
- バリア方針: 初期はランタイム関数側で安全に処理、型特化Lowering段でIRへ内挿(write barrier)
|
||||
|
||||
## 🔗 関連フェーズ
|
||||
|
||||
- [Phase 10](../phase-10/) - Cranelift JIT(前提)
|
||||
- [Phase 9](../phase-9/) - 統一Box設計(基盤)
|
||||
- [00_MASTER_ROADMAP.md](../00_MASTER_ROADMAP.md) - 全体計画
|
||||
- [00_MASTER_ROADMAP.md](../00_MASTER_ROADMAP.md) - 全体計画
|
||||
|
||||
@ -0,0 +1,160 @@
|
||||
# AI会議:MIR→LLVM変換の技術的アプローチ
|
||||
|
||||
Date: 2025-08-31
|
||||
Participants: Claude, Gemini, Codex
|
||||
|
||||
## 🎯 統合された実装戦略
|
||||
|
||||
### 1. BoxCall最適化(PIC実装)
|
||||
|
||||
#### Gemini先生の提案
|
||||
- **メソッドID(スロット)ベース** + **PIC(Polymorphic Inline Cache)** の組み合わせ
|
||||
- 静的解析で解決できる場合は直接呼び出し
|
||||
- 動的な場合はPICでキャッシュ
|
||||
|
||||
#### Codex先生の具体的実装
|
||||
```llvm
|
||||
; グローバルPIC(モノモルフィック例)
|
||||
@pic_foo_site123 = internal global { i64, i8* } { 0, null }
|
||||
|
||||
; ガード + 直呼び
|
||||
%cid = load i64, i64* %receiver_class_id
|
||||
%pic_cls = load i64, i64* getelementptr({i64,i8*}, {i64,i8*}* @pic_foo_site123, i32 0, i32 0)
|
||||
%hit = icmp eq i64 %cid, %pic_cls
|
||||
%likely = call i1 @llvm.expect.i1(i1 %hit, i1 true)
|
||||
br i1 %likely, label %fast, label %miss, !prof !{!"branch_weights", i32 10000, i32 1}
|
||||
|
||||
fast:
|
||||
%callee = load i8*, i8** getelementptr({i64,i8*}, {i64,i8*}* @pic_foo_site123, i32 0, i32 1)
|
||||
%fn = bitcast i8* %callee to %RetTy (%ObjTy*, ... )*
|
||||
%r = call fastcc %RetTy %fn(%ObjTy* %recv, ...)
|
||||
br label %cont
|
||||
|
||||
miss:
|
||||
%r2 = call coldcc %RetTy @nyash_pic_miss_foo(%ObjTy* %recv, i64 %method_id, ...)
|
||||
br label %cont
|
||||
```
|
||||
|
||||
### 2. 脱箱化戦略
|
||||
|
||||
#### Gemini先生の提案
|
||||
- MIRレベルの最適化パスで実施
|
||||
- 型推論と注釈の活用
|
||||
- データフロー解析に基づく安全な範囲の特定
|
||||
|
||||
#### Codex先生の2表現SSA戦略
|
||||
```llvm
|
||||
; 算術は全てプリミティブ(i64)で
|
||||
%a = add i64 %x, %y
|
||||
|
||||
; 必要になった地点でのみBox化
|
||||
%box = call %ObjTy* @nyash_make_int(i64 %a)
|
||||
call void @vector_push(%Vec* %v, %ObjTy* %box)
|
||||
```
|
||||
|
||||
**エスケープ解析との連携**:
|
||||
- 未エスケープ+GCセーフポイントを跨がない → 完全Box削除
|
||||
- 条件付きエスケープ → ブランチ内で遅延Box化
|
||||
|
||||
### 3. GCバリア最小化
|
||||
|
||||
#### 世代別GCでの最適化(両先生の統合案)
|
||||
|
||||
```llvm
|
||||
; TLSにNursery境界を保持
|
||||
@nyash_tls_nursery_low = thread_local global i64 0
|
||||
@nyash_tls_nursery_high = thread_local global i64 0
|
||||
|
||||
; Write barrier(インライン化されたfast path)
|
||||
store i8* %val, i8** %slot
|
||||
%obj_i = ptrtoint i8* %obj to i64
|
||||
%val_i = ptrtoint i8* %val to i64
|
||||
%low = load i64, i64* @nyash_tls_nursery_low
|
||||
%high = load i64, i64* @nyash_tls_nursery_high
|
||||
%yo_obj = and (icmp_uge %obj_i, %low), (icmp_ult %obj_i, %high)
|
||||
%yo_val = and (icmp_uge %val_i, %low), (icmp_ult %val_i, %high)
|
||||
%need_barrier = and (not %yo_obj), %yo_val ; 老→若のみ
|
||||
%likely0 = call i1 @llvm.expect.i1(i1 %need_barrier, i1 false)
|
||||
br i1 %likely0, label %barrier, label %cont, !prof !{!"branch_weights", 1, 10000}
|
||||
```
|
||||
|
||||
### 4. 注釈→LLVM属性変換
|
||||
|
||||
#### 安全性重視の段階的アプローチ
|
||||
|
||||
| Nyash注釈 | LLVM属性 | 安全性条件 |
|
||||
|-----------|----------|------------|
|
||||
| `@no_escape` | `nocapture` | エスケープしないことを静的証明 |
|
||||
| `@pure` | `readonly` | 副作用なしを保証 |
|
||||
| `@pure` + 強条件 | `readnone speculatable` | メモリ不読+例外なし |
|
||||
| `@nonnull` | `nonnull` | NULL不可を型システムで保証 |
|
||||
| `@range(0,255)` | `!range` | 値域制約をメタデータ化 |
|
||||
|
||||
### 5. LLVM最適化パス構成
|
||||
|
||||
#### 推奨パイプライン(両先生の合意)
|
||||
|
||||
```
|
||||
Phase 1(基本最適化):
|
||||
mem2reg → instcombine → gvn → sccp
|
||||
|
||||
Phase 2(Nyash特化):
|
||||
BoxCall devirtualization → inline → SROA(Box消去)
|
||||
|
||||
Phase 3(高度な最適化):
|
||||
licm → indvars → loop-unroll → vectorize
|
||||
|
||||
Phase 4(最終調整):
|
||||
Box materialization cleanup → instcombine
|
||||
```
|
||||
|
||||
### 6. インライン展開戦略
|
||||
|
||||
#### コストモデル(Codex先生)
|
||||
- モノモルフィックPIC+高ヒット率(>90%) → インライン
|
||||
- コード膨張はプロファイル重みで正規化
|
||||
- 再帰最適化:`musttail`によるTCO、部分インライン化
|
||||
|
||||
## 🚀 実装ロードマップ
|
||||
|
||||
### Week 1: 基礎構築
|
||||
- [ ] inkwellセットアップ
|
||||
- [ ] 基本的な15命令→LLVM IR変換
|
||||
- [ ] 最小実行可能コード生成
|
||||
|
||||
### Week 2: PIC実装
|
||||
- [ ] モノモルフィックPIC
|
||||
- [ ] ポリモルフィックPIC(2-4 way)
|
||||
- [ ] Megamorphic fallback
|
||||
|
||||
### Week 3: 脱箱化+GC統合
|
||||
- [ ] 2表現SSA実装
|
||||
- [ ] エスケープ解析
|
||||
- [ ] GCバリア最適化
|
||||
- [ ] gc.statepoint統合
|
||||
|
||||
### Week 4: 最適化+検証
|
||||
- [ ] 注釈→属性変換
|
||||
- [ ] カスタム最適化パス
|
||||
- [ ] ベンチマーク検証
|
||||
- [ ] 安全性テスト
|
||||
|
||||
## 💡 重要な洞察
|
||||
|
||||
### Gemini先生
|
||||
> 「Everything is Box」モデルのオーバーヘッドを削減する鍵が脱箱化です。早すぎる脱箱化は再Box化のコストを生み、遅すぎると最適化の機会を逃します。
|
||||
|
||||
### Codex先生
|
||||
> PIC更新の安全化: 1-ワードのバージョンでRCU風プロトコル。ABI二系統(Box ABI/Primitive Fast-ABI)をIRBuilderに明示し、境界でのみmaterialize_box/dematerialize_boxを発行。
|
||||
|
||||
## 🎉 結論
|
||||
|
||||
両先生の知見を統合することで、「Everything is Box」の柔軟性を保ちつつ、C++に迫る性能を実現する具体的な実装パスが明確になりました。特に:
|
||||
|
||||
1. **PICによる動的最適化**と**静的型推論**の組み合わせ
|
||||
2. **遅延Box化**による不要なヒープ割り当ての削減
|
||||
3. **世代別GC**と**インラインバリア**の協調
|
||||
4. **保守的な属性付与**による安全性確保
|
||||
5. **段階的最適化パイプライン**による着実な性能向上
|
||||
|
||||
これらにより、Nyashは「シンプルな15命令」から「高性能な機械語」への変換を実現できます。
|
||||
@ -0,0 +1,141 @@
|
||||
# Box-SSA Core-15 最終仕様
|
||||
|
||||
Date: 2025-08-31
|
||||
Status: **凍結** (Frozen Specification)
|
||||
Author: ChatGPT5 + Claude協調
|
||||
|
||||
## ✅ 凍結命令セット(正味15個)
|
||||
|
||||
```
|
||||
{ Const, UnaryOp, BinOp, Compare, TypeOp,
|
||||
Load, Store,
|
||||
Jump, Branch, Return, Phi,
|
||||
Call, NewBox, BoxCall, ExternCall }
|
||||
```
|
||||
|
||||
## 📋 命令詳細
|
||||
|
||||
### 1. 値生成
|
||||
- **Const**(value) → 定数(i64/f64/bool/string等)
|
||||
- **NewBox**(type, init_args...) → 新しいBoxオブジェクト生成
|
||||
|
||||
### 2. 演算
|
||||
- **UnaryOp**(op, arg) → 単項演算(neg, not等)
|
||||
- **BinOp**(op, left, right) → 二項演算(add, sub, mul, div等)
|
||||
- **Compare**(op, left, right) → 比較演算(eq, lt, le等)
|
||||
- **TypeOp**(op, value, type) → 型演算(is, as, typeof等)
|
||||
|
||||
### 3. メモリ
|
||||
- **Load**(local_id) → ローカル変数読み込み
|
||||
- **Store**(local_id, value) → ローカル変数書き込み
|
||||
|
||||
### 4. 制御フロー
|
||||
- **Jump**(block) → 無条件ジャンプ
|
||||
- **Branch**(cond, then_block, else_block) → 条件分岐
|
||||
- **Return**(value?) → 関数からの復帰
|
||||
- **Phi**([(block, value), ...]) → SSA用(VMは展開)
|
||||
|
||||
### 5. 呼び出し
|
||||
- **Call**(func, args...) → 通常の関数呼び出し
|
||||
- **BoxCall**(box, selector, args...) → Boxメソッド呼び出し(万能)
|
||||
- **ExternCall**(symbol, args..., attrs) → FFI呼び出し
|
||||
|
||||
## 🎯 BoxCall統一マッピング
|
||||
|
||||
| 操作 | 旧命令 | 新BoxCall表現 |
|
||||
|------|--------|---------------|
|
||||
| フィールド読み取り | RefGet | BoxCall(obj, "getField", field_name) |
|
||||
| フィールド書き込み | RefSet | BoxCall(obj, "setField", field_name, value) |
|
||||
| 配列要素読み取り | ArrayGet | BoxCall(arr, "get", index) |
|
||||
| 配列要素書き込み | ArraySet | BoxCall(arr, "set", index, value) |
|
||||
| プラグイン呼び出し | PluginInvoke | BoxCall(plugin, "invoke", method, args...) |
|
||||
| メソッド呼び出し | - | BoxCall(obj, method_name, args...) |
|
||||
|
||||
## 🔒 不変条件(Verifier必須チェック)
|
||||
|
||||
1. **直接フィールドアクセス禁止**
|
||||
- ❌ `Load/Store`でBoxの内部フィールドに直接アクセス
|
||||
- ✅ 必ず`BoxCall`経由でアクセス
|
||||
|
||||
2. **Write Barrier自動挿入**
|
||||
- BoxCallのLowering時に必要に応じて挿入
|
||||
- 世代別GCで若→若の場合は省略可
|
||||
|
||||
3. **ExternCall属性必須**
|
||||
- `noalloc`, `readonly`, `atomic`, `nothrow`等を明示
|
||||
- 無指定は保守的(全バリア有効)
|
||||
|
||||
4. **型安全性**
|
||||
- TypeOpで型チェック後のみ特定操作を許可
|
||||
- 動的ディスパッチはPIC経由
|
||||
|
||||
## 🛠️ Lowering戦略
|
||||
|
||||
### BoxCall → 最適化されたコード
|
||||
|
||||
```llvm
|
||||
; BoxCall(arr, "get", 5) のLowering例
|
||||
|
||||
; 1. 形状ガード(PIC)
|
||||
%type_id = load i64, i64* %arr.type_id
|
||||
%is_array = icmp eq i64 %type_id, ARRAY_TYPE_ID
|
||||
br i1 %is_array, label %fast_path, label %slow_path
|
||||
|
||||
fast_path:
|
||||
; 2. 境界チェック
|
||||
%len = load i64, i64* %arr.length
|
||||
%in_bounds = icmp ult i64 5, %len
|
||||
br i1 %in_bounds, label %do_load, label %bounds_error
|
||||
|
||||
do_load:
|
||||
; 3. 直接アクセス(最適化後)
|
||||
%ptr = getelementptr %ArrayBox, %arr, 0, 2, 5
|
||||
%value = load %Box*, %ptr
|
||||
br label %continue
|
||||
|
||||
slow_path:
|
||||
; 4. 汎用ディスパッチ
|
||||
%value = call @nyash_box_call(%arr, "get", 5)
|
||||
br label %continue
|
||||
```
|
||||
|
||||
## 📊 削減効果
|
||||
|
||||
| 項目 | 旧(26命令) | 新(15命令) | 削減率 |
|
||||
|------|-------------|-------------|---------|
|
||||
| 命令数 | 26 | 15 | 42%削減 |
|
||||
| 実装箇所 | 26×N | 15×N | 42%削減 |
|
||||
| 最適化パターン | 多様 | 統一(BoxCall中心) | 大幅簡素化 |
|
||||
| テストケース | O(26²) | O(15²) | 66%削減 |
|
||||
|
||||
## 🚦 実装ロードマップ
|
||||
|
||||
### Phase 1: 仕様更新(即時)
|
||||
- [x] このドキュメントで仕様凍結
|
||||
- [ ] INSTRUCTION_SET.md を更新
|
||||
- [ ] テストの期待値を15に変更
|
||||
|
||||
### Phase 2: Verifier実装(1日)
|
||||
- [ ] Box直接アクセス検出
|
||||
- [ ] ExternCall属性チェック
|
||||
- [ ] 命令数15の強制
|
||||
|
||||
### Phase 3: Lowering実装(3日)
|
||||
- [ ] BoxCall → 形状別分岐
|
||||
- [ ] Write Barrier挿入ロジック
|
||||
- [ ] PIC統合
|
||||
|
||||
### Phase 4: VM/JIT更新(1週間)
|
||||
- [ ] VM: Phi展開、BoxCall dispatch
|
||||
- [ ] JIT: PIC生成、インライン化
|
||||
- [ ] 性能検証
|
||||
|
||||
## 🎉 結論
|
||||
|
||||
**Box-SSA Core-15**により:
|
||||
- Everything is Box哲学の完全実現
|
||||
- 実装・保守の劇的簡素化
|
||||
- 最適化の統一的適用
|
||||
- 真の15命令達成
|
||||
|
||||
これが「あほみたいに簡単」で「恐ろしく速い」Nyashの最終形態です!
|
||||
Reference in New Issue
Block a user