gui: add EguiBox TypeBox plugin (Windows egui stub)\n\n- plugins: add nyash-egui-plugin with TypeBox (resolve/invoke_id), Windows path for real window via eframe; stub on other OS\n- apps: add apps/egui-hello sample (open→uiLabel→run→close)\n- loader: improve Windows DLL resolution (target triples: x86_64/aarch64 msvc) and lib→dll mapping\n- tests: expand TypeBox vs TLV diff tests up to FileBox; all green\n- docs: update CURRENT_TASK checklist (diff tests completed)\n- config: nyash.toml add EguiBox (type_id=70), plugin registry and methods
This commit is contained in:
@ -1,10 +1,10 @@
|
||||
# Phase 15: Nyashセルフホスティング - 71k→15k行への革命
|
||||
# Phase 15: Nyashセルフホスティング - 世界一美しい箱の完成
|
||||
|
||||
## 📋 概要
|
||||
|
||||
NyashでNyashコンパイラを書く、完全なセルフホスティングの実現フェーズ。
|
||||
内蔵Cranelift JITを活用し、外部コンパイラ依存から完全に解放される。
|
||||
**革命的成果:71,000行→15,000行(75%削減)**
|
||||
MIR 13命令の美しさを最大限に活かし、外部コンパイラ依存から完全に解放される。
|
||||
**究極の目標:80,000行→20,000行(75%削減)→ さらなる最適化へ**
|
||||
|
||||
## 🎯 フェーズの目的
|
||||
|
||||
@ -36,11 +36,26 @@ NyashでNyashコンパイラを書く、完全なセルフホスティングの
|
||||
|
||||
## 🔧 技術的アプローチ
|
||||
|
||||
### 内蔵Craneliftの利点
|
||||
### MIR 13命令の革命
|
||||
- **基本演算(5)**: Const, UnaryOp, BinOp, Compare, TypeOp
|
||||
- **メモリ(2)**: Load, Store
|
||||
- **制御(4)**: Branch, Jump, Return, Phi
|
||||
- **Box(1)**: BoxCall(すべての箱操作を統合)
|
||||
- **外部(1)**: ExternCall
|
||||
|
||||
この究極のシンプルさにより、直接x86変換も現実的に!
|
||||
|
||||
### バックエンドの選択肢
|
||||
#### 1. Cranelift(現在の主力)
|
||||
- **軽量**: 3-5MB程度(LLVMの1/10以下)
|
||||
- **JIT特化**: メモリ上での動的コンパイル
|
||||
- **Rust統合**: 静的リンクで配布容易
|
||||
|
||||
#### 2. 直接x86エミッタ(革新的アプローチ)
|
||||
- **dynasm-rs/iced-x86**: Rust内で直接アセンブリ生成
|
||||
- **テンプレート・スティッチャ方式**: 2-3KBの超小型バイナリ可能
|
||||
- **完全な制御**: 依存ゼロの究極形
|
||||
|
||||
### コード削減の秘密
|
||||
- **Arc<Mutex>自動化**: 明示的ロック管理不要(-30%)
|
||||
- **型システム簡略化**: 動的型付けの恩恵(-20%)
|
||||
@ -49,7 +64,7 @@ NyashでNyashコンパイラを書く、完全なセルフホスティングの
|
||||
|
||||
### 実装例
|
||||
```nyash
|
||||
// 71,000行のRust実装が...
|
||||
// 80,000行のRust実装が20,000行のNyashに!
|
||||
box NyashCompiler {
|
||||
init { parser, lowerer, backend }
|
||||
|
||||
@ -68,6 +83,34 @@ box MirExecutor {
|
||||
}
|
||||
```
|
||||
|
||||
### テンプレート・スティッチャ方式(革新的アプローチ)
|
||||
```nyash
|
||||
// 各MIR命令を共通スタブとして実装
|
||||
box TemplateStitcher {
|
||||
init { stubs }
|
||||
|
||||
constructor() {
|
||||
me.stubs = new MapBox()
|
||||
// 各命令の共通実装をスタブとして登録
|
||||
me.stubs.set("Const", 0x1000) // スタブアドレス
|
||||
me.stubs.set("BinOp", 0x1100)
|
||||
me.stubs.set("BoxCall", 0x1200)
|
||||
// ... 13命令分のスタブ
|
||||
}
|
||||
|
||||
generate(mir) {
|
||||
local jumps = new ArrayBox()
|
||||
|
||||
// プログラムはスタブ間のジャンプ列に!
|
||||
for inst in mir.instructions {
|
||||
jumps.push("jmp " + me.stubs.get(inst.type))
|
||||
}
|
||||
|
||||
return jumps // 超小型バイナリ!
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 🔗 EXEファイル生成・リンク戦略
|
||||
|
||||
### 段階的アプローチ
|
||||
@ -111,7 +154,18 @@ box MirExecutor {
|
||||
外部ツールチェーンに依存しない、真の自立したプログラミング言語へ。
|
||||
|
||||
### 数値で見る革命
|
||||
- **コード行数**: 71,000 → 15,000行(**75%削減**)
|
||||
- **理解容易性**: 1週間で読破可能なコンパイラ
|
||||
- **貢献しやすさ**: 誰でも改造できる規模
|
||||
- **教育的価値**: 世界一シンプルな実用コンパイラ
|
||||
- **現在**: 80,000行(Rust実装)
|
||||
- **第一目標**: 20,000行(Nyashセルフホスティング、**75%削減**)
|
||||
- **究極の夢**: さらなる最適化でより小さく!
|
||||
- **MIR命令数**: たった13個で全機能実現
|
||||
- **理解容易性**: 週末で読破可能なコンパイラ
|
||||
- **バイナリサイズ**: テンプレート方式なら2-3KBも可能
|
||||
- **教育的価値**: 世界一美しく、世界一小さい実用コンパイラ
|
||||
|
||||
### 🌟 Everything is Boxの究極形
|
||||
- コンパイラもBox
|
||||
- リンカーもBox
|
||||
- アセンブラもBox
|
||||
- すべてがBox!
|
||||
|
||||
**世界一美しい箱は、自分自身さえも美しく包み込む**
|
||||
@ -1,15 +1,22 @@
|
||||
================================================================================
|
||||
Phase 15: Nyashセルフホスティング計画 - 71k→15k行への革命的圧縮
|
||||
Phase 15: Nyashセルフホスティング計画 - 80k→20k行への革命的圧縮
|
||||
================================================================================
|
||||
|
||||
【ビジョン】
|
||||
NyashでNyashコンパイラを書き、Nyashプログラムをコンパイル・実行する
|
||||
完全なセルフホスティング環境の実現 + 劇的なコード圧縮(75%削減)
|
||||
MIR 13命令の美しさを最大限に活かした究極の実装
|
||||
|
||||
【数値目標】
|
||||
現在: 71,000行(Rust実装)
|
||||
目標: 15,000-20,000行(Nyash実装)
|
||||
削減率: 約75%
|
||||
現在: 80,000行(Rust実装)
|
||||
第一目標: 20,000行(Nyash実装)
|
||||
削減率: 75%
|
||||
究極の夢: さらなる最適化で更に小さく!
|
||||
|
||||
【革命的要素】
|
||||
MIR命令数: たった13個で全機能実現
|
||||
バックエンド選択: Cranelift/直接x86/テンプレート方式
|
||||
バイナリサイズ: 2-3KBの超小型も可能
|
||||
|
||||
================================================================================
|
||||
1. なぜセルフホスティングか + コード圧縮の価値
|
||||
@ -44,19 +51,26 @@ NyashでNyashコンパイラを書き、Nyashプログラムをコンパイル
|
||||
└─ 依存が少ない: ビルド時間短縮
|
||||
|
||||
■ 既存の準備状況
|
||||
├─ ✅ MIR 13命令に削減完了(究極のシンプルさ)
|
||||
├─ ✅ Cranelift統合準備済み(Cargo.toml)
|
||||
├─ ✅ MIR15確定(シンプルなIR)
|
||||
├─ ✅ 直接x86エミッタ選択肢(dynasm-rs/iced-x86)
|
||||
├─ ✅ プラグインシステム(拡張可能)
|
||||
└─ 🔄 Phase 10でJIT実装予定
|
||||
└─ ✅ Phase 12で統一実行パス確立
|
||||
|
||||
================================================================================
|
||||
3. 段階的実装計画 - ChatGPT5戦略による最速ルート
|
||||
================================================================================
|
||||
|
||||
■ Phase 15.0: YAML自動生成基盤(1-2週間)【最優先】
|
||||
■ Phase 15.0: バックエンド選択戦略(新規追加)
|
||||
├─ 選択肢1: Cranelift(現在の主力、安定)
|
||||
├─ 選択肢2: 直接x86エミッタ(dynasm-rs使用、高速)
|
||||
├─ 選択肢3: テンプレート・スティッチャ(2-3KB超小型)
|
||||
└─ 段階的移行: Cranelift→x86→テンプレート
|
||||
|
||||
■ Phase 15.1: YAML自動生成基盤(1-2週間)【最優先】
|
||||
├─ boxes.yaml: Box型定義(type_id, method_id対応表)
|
||||
├─ externs.yaml: 外部関数定義(C ABI境界)
|
||||
├─ semantics.yaml: MIR15セマンティクス定義
|
||||
├─ semantics.yaml: MIR13セマンティクス定義(13命令!)
|
||||
└─ build.rs: 自動生成システム(重複コード即削除)
|
||||
|
||||
効果: Array/Instance/Console等で即座に1-2万行削減
|
||||
@ -181,21 +195,26 @@ box MiniLinkerBox {
|
||||
├─ 真の「Everything is Box」体験
|
||||
└─ コントリビューション容易化
|
||||
|
||||
■ コード削減の具体例
|
||||
├─ Boxes実装: 11,153行 → 2,000行(80%削減)
|
||||
├─ Interpreter: 11,278行 → 3,000行(73%削減)
|
||||
├─ MIR: 10,918行 → 2,500行(77%削減)
|
||||
├─ Parser: 2,680行 → 800行(70%削減)
|
||||
└─ Backend: 9,196行 → 3,000行(67%削減)
|
||||
■ コード削減の具体例(80k→20k)
|
||||
├─ Boxes実装: 13,000行 → 3,000行(77%削減)
|
||||
├─ Interpreter: 15,000行 → 4,000行(73%削減)
|
||||
├─ MIR: 12,000行 → 2,000行(83%削減、13命令化の効果)
|
||||
├─ Parser: 5,000行 → 1,500行(70%削減)
|
||||
├─ Backend: 15,000行 → 4,000行(73%削減)
|
||||
└─ その他: 20,000行 → 5,500行(72%削減)
|
||||
|
||||
================================================================================
|
||||
7. 成功指標
|
||||
================================================================================
|
||||
|
||||
□ NyashコンパイラがNyash自身をコンパイル可能
|
||||
□ コード行数: 15,000-20,000行以内(75%削減達成)
|
||||
□ コード行数: 20,000行以内(75%削減達成)
|
||||
□ MIR 13命令での完全実装
|
||||
□ 性能: Rustコンパイラの50%以上
|
||||
□ バイナリサイズ: 10MB以下(Cranelift込み)
|
||||
□ バイナリサイズ:
|
||||
- Cranelift版: 10MB以下
|
||||
- 直接x86版: 5MB以下
|
||||
- テンプレート版: 1MB以下(夢の2-3KBも視野)
|
||||
□ コンパイル時間: 中規模プロジェクトで10秒以内
|
||||
□ 100%のテストケース互換性
|
||||
□ trace_hash/heap_hashパリティ(VM/JIT/AOT)
|
||||
|
||||
@ -13,11 +13,12 @@ NyashCompiler (Nyashで実装)
|
||||
├── Middle-end
|
||||
│ ├── Type Checker
|
||||
│ ├── Name Resolver
|
||||
│ ├── MIR Lowerer
|
||||
│ ├── MIR Lowerer (→13命令)
|
||||
│ └── Optimizer
|
||||
└── Backend
|
||||
└── Backend(複数選択可能)
|
||||
├── CraneliftBox (JITラッパー)
|
||||
├── Code Generator
|
||||
├── X86EmitterBox (直接エミッタ)
|
||||
├── TemplateStitcherBox (超小型)
|
||||
└── Runtime Linker
|
||||
```
|
||||
|
||||
@ -204,7 +205,7 @@ box MIRLowerer {
|
||||
}
|
||||
```
|
||||
|
||||
## 4. Cranelift統合
|
||||
## 4. バックエンド実装
|
||||
|
||||
### 4.1 CraneliftBox実装
|
||||
|
||||
@ -244,6 +245,107 @@ box CraneliftBox {
|
||||
}
|
||||
```
|
||||
|
||||
### 4.2 X86EmitterBox実装(直接x86生成)
|
||||
|
||||
```nyash
|
||||
box X86EmitterBox {
|
||||
init { code_buffer, label_map }
|
||||
|
||||
constructor() {
|
||||
me.code_buffer = new ArrayBox()
|
||||
me.label_map = new MapBox()
|
||||
}
|
||||
|
||||
compile(mir) {
|
||||
// MIR 13命令を直接x86-64に変換!
|
||||
for func in mir.functions {
|
||||
me.emitFunction(func)
|
||||
}
|
||||
|
||||
return me.code_buffer
|
||||
}
|
||||
|
||||
emitInstruction(inst) {
|
||||
// MIR命令をx86テンプレートに変換
|
||||
if inst.type == "Const" {
|
||||
// mov rax, imm64
|
||||
me.emit_mov_imm(inst.dst, inst.value)
|
||||
}
|
||||
|
||||
if inst.type == "BinOp" {
|
||||
if inst.op == "Add" {
|
||||
// add rax, rbx
|
||||
me.emit_add(inst.dst, inst.left, inst.right)
|
||||
}
|
||||
}
|
||||
|
||||
if inst.type == "BoxCall" {
|
||||
// mov rdi, receiver
|
||||
// mov rax, [rdi] ; vtable
|
||||
// call [rax+slot*8] ; method call
|
||||
me.emit_boxcall(inst.recv, inst.slot)
|
||||
}
|
||||
|
||||
// ... 残り10命令のテンプレート
|
||||
}
|
||||
|
||||
emit_mov_imm(reg, value) {
|
||||
// REX.W + mov r64, imm64
|
||||
me.code_buffer.push(0x48) // REX.W
|
||||
me.code_buffer.push(0xB8 + reg) // mov opcode
|
||||
|
||||
// 64ビット即値をリトルエンディアンで
|
||||
for i in range(0, 8) {
|
||||
me.code_buffer.push((value >> (i * 8)) & 0xFF)
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 4.3 テンプレート・スティッチャ実装(超小型バイナリ)
|
||||
|
||||
```nyash
|
||||
box TemplateStitcherBox {
|
||||
init { stub_addresses, jump_table }
|
||||
|
||||
constructor() {
|
||||
// 各MIR命令の共通スタブアドレス
|
||||
me.stub_addresses = new MapBox()
|
||||
me.stub_addresses.set("Const", 0x1000)
|
||||
me.stub_addresses.set("UnaryOp", 0x1100)
|
||||
me.stub_addresses.set("BinOp", 0x1200)
|
||||
me.stub_addresses.set("Compare", 0x1300)
|
||||
me.stub_addresses.set("TypeOp", 0x1400)
|
||||
me.stub_addresses.set("Load", 0x1500)
|
||||
me.stub_addresses.set("Store", 0x1600)
|
||||
me.stub_addresses.set("Branch", 0x1700)
|
||||
me.stub_addresses.set("Jump", 0x1800)
|
||||
me.stub_addresses.set("Return", 0x1900)
|
||||
me.stub_addresses.set("Phi", 0x1A00)
|
||||
me.stub_addresses.set("BoxCall", 0x1B00)
|
||||
me.stub_addresses.set("ExternCall", 0x1C00)
|
||||
}
|
||||
|
||||
compile(mir) {
|
||||
me.jump_table = new ArrayBox()
|
||||
|
||||
// プログラムはスタブへのジャンプ列として表現
|
||||
for inst in mir.instructions {
|
||||
local stub_addr = me.stub_addresses.get(inst.type)
|
||||
|
||||
// jmp rel32
|
||||
me.jump_table.push(0xE9) // jmp opcode
|
||||
me.jump_table.push_rel32(stub_addr)
|
||||
|
||||
// 命令固有のパラメータをデータセクションに配置
|
||||
me.encodeParameters(inst)
|
||||
}
|
||||
|
||||
return me.jump_table
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 5. ブートストラップ手順
|
||||
|
||||
### 5.1 段階的移行
|
||||
|
||||
Reference in New Issue
Block a user