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:
Moe Charm
2025-09-03 13:58:52 +09:00
parent f939ad0033
commit ceb22b6c18
33 changed files with 3891 additions and 84 deletions

View File

@ -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
**世界一美しい箱は、自分自身さえも美しく包み込む**

View File

@ -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

View File

@ -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 段階的移行