5.2 KiB
5.2 KiB
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. スカラ変数の最適化パス
; ソースコード: 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. 配列アクセスの統一
; ソースコード: 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: スカラ変数ループ
// 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: 配列連続アクセス
// 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: 監査付き変数
// 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)統計
収集すべきデータ
// 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協調
- インライン化
- 最終的な機械語生成
💡 革新性の証明ポイント
-
統一性がもたらす簡潔さ
- パーサー: 変数もBoxCallとして扱うだけ
- 最適化: 1種類の変換ルール
- デバッグ: 統一的なトレース
-
性能ペナルティなし
- スカラ: レジスタ化で従来同等
- 配列: bounds除去で高速化
- オブジェクト: PICで直接呼び出し
-
拡張性の確保
- 監査: 必要時のみフック
- トランザクション: BoxCallに統合
- 並行性: Barrier命令で制御
🎯 最終目標
「Everything is Box, Everything is Message」を貫きながら、 実行時は「Everything is Optimized」を実現する。
これがNyash MIR13 + BoxCall統一アーキテクチャの真髄。