212 lines
5.2 KiB
Markdown
212 lines
5.2 KiB
Markdown
|
|
# ChatGPT5's BoxCall Revolution Insights
|
|||
|
|
|
|||
|
|
## 🚀 革新的ポイント:Load/Store削除の意味
|
|||
|
|
|
|||
|
|
### 従来のVM命令
|
|||
|
|
```
|
|||
|
|
Load x // メモリから変数xを読む
|
|||
|
|
Store y, 42 // メモリの変数yに42を書く
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Nyash MIR13の革新
|
|||
|
|
```
|
|||
|
|
BoxCall @x, "get", [] // xもBoxとして扱う
|
|||
|
|
BoxCall @y, "set", [42] // yへの代入もメッセージ
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🎯 "表現は一つ、実行は二態" の具体例
|
|||
|
|
|
|||
|
|
### 1. スカラ変数の最適化パス
|
|||
|
|
|
|||
|
|
```mir
|
|||
|
|
; ソースコード: x = x + 1
|
|||
|
|
; MIR表現(統一)
|
|||
|
|
%1 = BoxCall %x, "get", []
|
|||
|
|
%2 = BinOp %1, Add, 1
|
|||
|
|
BoxCall %x, "set", [%2]
|
|||
|
|
|
|||
|
|
; 最適化後(二態実行)
|
|||
|
|
; Case A: エスケープなし → レジスタ化
|
|||
|
|
mov eax, [x_register]
|
|||
|
|
add eax, 1
|
|||
|
|
mov [x_register], eax
|
|||
|
|
|
|||
|
|
; Case B: 監査付き → メッセージ維持
|
|||
|
|
call VarBox_get
|
|||
|
|
add eax, 1
|
|||
|
|
call VarBox_set
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 配列アクセスの統一
|
|||
|
|
|
|||
|
|
```mir
|
|||
|
|
; ソースコード: arr[i] = arr[i] + 1
|
|||
|
|
; MIR表現(統一)
|
|||
|
|
%elem = BoxCall %arr, "get", [%i]
|
|||
|
|
%new = BinOp %elem, Add, 1
|
|||
|
|
BoxCall %arr, "set", [%i, %new]
|
|||
|
|
|
|||
|
|
; 最適化後(bounds check統合)
|
|||
|
|
cmp i, arr.length
|
|||
|
|
jae slow_path
|
|||
|
|
mov eax, [arr.data + i*4]
|
|||
|
|
add eax, 1
|
|||
|
|
mov [arr.data + i*4], eax
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 📊 性能目標と測定計画
|
|||
|
|
|
|||
|
|
### Benchmark 1: スカラ変数ループ
|
|||
|
|
```nyash
|
|||
|
|
// bench_scalar_loop.nyash
|
|||
|
|
static box ScalarBench {
|
|||
|
|
main() {
|
|||
|
|
local x = 0
|
|||
|
|
local iterations = 100_000_000
|
|||
|
|
|
|||
|
|
local start = Time.now()
|
|||
|
|
loop(x < iterations) {
|
|||
|
|
x = x + 1 // BoxCall化されるが最適化でレジスタに
|
|||
|
|
}
|
|||
|
|
local elapsed = Time.now() - start
|
|||
|
|
|
|||
|
|
console.log("Scalar loop: " + elapsed + "ms")
|
|||
|
|
console.log("ops/sec: " + (iterations / (elapsed / 1000)))
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**目標**: 従来Load/Store実装の±5%以内
|
|||
|
|
|
|||
|
|
### Benchmark 2: 配列連続アクセス
|
|||
|
|
```nyash
|
|||
|
|
// bench_array_sum.nyash
|
|||
|
|
static box ArrayBench {
|
|||
|
|
main() {
|
|||
|
|
local arr = new ArrayBox()
|
|||
|
|
local size = 10_000_000
|
|||
|
|
|
|||
|
|
// 初期化
|
|||
|
|
loop(i < size) {
|
|||
|
|
arr.push(i)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 連続読み込み
|
|||
|
|
local sum = 0
|
|||
|
|
local start = Time.now()
|
|||
|
|
loop(i < size) {
|
|||
|
|
sum = sum + arr.get(i) // bounds check最適化対象
|
|||
|
|
}
|
|||
|
|
local elapsed = Time.now() - start
|
|||
|
|
|
|||
|
|
console.log("Array sum: " + elapsed + "ms")
|
|||
|
|
console.log("Elements/sec: " + (size / (elapsed / 1000)))
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**最適化ポイント**:
|
|||
|
|
- bounds checkのループ外移動
|
|||
|
|
- 連続アクセスパターンの認識
|
|||
|
|
- SIMD化の可能性
|
|||
|
|
|
|||
|
|
### Benchmark 3: 監査付き変数
|
|||
|
|
```nyash
|
|||
|
|
// bench_audited_var.nyash
|
|||
|
|
static box AuditedBench {
|
|||
|
|
main() {
|
|||
|
|
// 監査付き変数(フック可能)
|
|||
|
|
local x = new VarBox(0)
|
|||
|
|
x.onSet = function(old, new) {
|
|||
|
|
// 変更通知(本番では軽量化)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
local iterations = 10_000_000
|
|||
|
|
local start = Time.now()
|
|||
|
|
|
|||
|
|
loop(i < iterations) {
|
|||
|
|
x.set(x.get() + 1)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
local elapsed = Time.now() - start
|
|||
|
|
console.log("Audited var: " + elapsed + "ms")
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**目標**: オーバーヘッド < 5ns/操作
|
|||
|
|
|
|||
|
|
## 🔬 PIC(Polymorphic Inline Cache)統計
|
|||
|
|
|
|||
|
|
### 収集すべきデータ
|
|||
|
|
```nyash
|
|||
|
|
// pic_stats.nyash
|
|||
|
|
static box PICStats {
|
|||
|
|
main() {
|
|||
|
|
// VMから統計取得
|
|||
|
|
local stats = VM.getPICStatistics()
|
|||
|
|
|
|||
|
|
console.log("=== PIC Statistics ===")
|
|||
|
|
console.log("Total sites: " + stats.totalSites)
|
|||
|
|
console.log("Monomorphic: " + stats.mono + " (" +
|
|||
|
|
(stats.mono * 100 / stats.total) + "%)")
|
|||
|
|
console.log("Polymorphic: " + stats.poly)
|
|||
|
|
console.log("Megamorphic: " + stats.mega)
|
|||
|
|
|
|||
|
|
// ホットサイトの詳細
|
|||
|
|
for site in stats.hotSites {
|
|||
|
|
console.log("Site " + site.id + ": " +
|
|||
|
|
site.types.length + " types, " +
|
|||
|
|
site.hits + " hits")
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**目標**: 単相率 > 80%(ホットサイト)
|
|||
|
|
|
|||
|
|
## 🏗️ Lower実装の段階的アプローチ
|
|||
|
|
|
|||
|
|
### Phase 1: 基本スカラ最適化
|
|||
|
|
- CellBox(副作用なし)の識別
|
|||
|
|
- エスケープ解析
|
|||
|
|
- レジスタ割り当て
|
|||
|
|
|
|||
|
|
### Phase 2: 配列最適化
|
|||
|
|
- TypedArrayの型特殊化
|
|||
|
|
- bounds check除去
|
|||
|
|
- ベクトル化準備
|
|||
|
|
|
|||
|
|
### Phase 3: 監査システム
|
|||
|
|
- 軽量フックメカニズム
|
|||
|
|
- JIT時の条件付きコード生成
|
|||
|
|
- プロファイルベース最適化
|
|||
|
|
|
|||
|
|
### Phase 4: 完全統合
|
|||
|
|
- PIC + Lower協調
|
|||
|
|
- インライン化
|
|||
|
|
- 最終的な機械語生成
|
|||
|
|
|
|||
|
|
## 💡 革新性の証明ポイント
|
|||
|
|
|
|||
|
|
1. **統一性がもたらす簡潔さ**
|
|||
|
|
- パーサー: 変数もBoxCallとして扱うだけ
|
|||
|
|
- 最適化: 1種類の変換ルール
|
|||
|
|
- デバッグ: 統一的なトレース
|
|||
|
|
|
|||
|
|
2. **性能ペナルティなし**
|
|||
|
|
- スカラ: レジスタ化で従来同等
|
|||
|
|
- 配列: bounds除去で高速化
|
|||
|
|
- オブジェクト: PICで直接呼び出し
|
|||
|
|
|
|||
|
|
3. **拡張性の確保**
|
|||
|
|
- 監査: 必要時のみフック
|
|||
|
|
- トランザクション: BoxCallに統合
|
|||
|
|
- 並行性: Barrier命令で制御
|
|||
|
|
|
|||
|
|
## 🎯 最終目標
|
|||
|
|
|
|||
|
|
「Everything is Box, Everything is Message」を貫きながら、
|
|||
|
|
実行時は「Everything is Optimized」を実現する。
|
|||
|
|
|
|||
|
|
これがNyash MIR13 + BoxCall統一アーキテクチャの真髄。
|