Phase 12.7文法改革: ドキュメント文法統一 + VMリファクタリング準備
🌟 Phase 12.7文法改革に基づくドキュメント更新 - init {} → field: TypeBox 個別フィールド宣言形式 - init() → birth() コンストラクタ統一 - pack() → 廃止(birth()に統一) - public {}/private {} → 個別フィールド修飾子 - override → 廃止(メソッド定義はシンプルに) 📚 更新したドキュメント - CLAUDE.md: メイン開発ガイド - docs/quick-reference/syntax-cheatsheet.md: 構文早見表 - docs/reference/language/LANGUAGE_REFERENCE_2025.md: 言語リファレンス - docs/development/roadmap/phases/phase-15/README.md: Phase 15計画 🔧 VMリファクタリング準備 - vm_methods.rs: VMメソッド呼び出しの分離 - plugin_loader.rs → plugin_loader/: ディレクトリ構造化 - mir/builder/exprs.rs: 式ビルダー分離 📝 新規ドキュメント追加 - 論文戦略・ロードマップ - Phase 15セルフホスティング準備資料 - Codex Androidセットアップガイド ビルドは正常に通ることを確認済み!🎉 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@ -21,7 +21,9 @@ MIR 13命令の美しさを最大限に活かし、外部コンパイラ依存
|
||||
- [ ] Nyashパーサー(800行目標)
|
||||
- [ ] MIR Lowerer(2,500行目標)
|
||||
- [ ] CraneliftBox(JITエンジンラッパー)
|
||||
- [ ] LinkerBox(リンカー統合)
|
||||
- [ ] LinkerBox(lld内蔵リンカー統合)
|
||||
- [ ] nyashrtランタイム(静的/動的ライブラリ)
|
||||
- [ ] ToolchainBox(環境診断・SDK検出)
|
||||
|
||||
### 自動生成基盤
|
||||
- [ ] boxes.yaml(Box型定義)
|
||||
@ -46,12 +48,14 @@ MIR 13命令の美しさを最大限に活かし、外部コンパイラ依存
|
||||
この究極のシンプルさにより、直接x86変換も現実的に!
|
||||
|
||||
### バックエンドの選択肢
|
||||
#### 1. Cranelift(現在の主力)
|
||||
#### 1. Cranelift + lld内蔵(ChatGPT5推奨)
|
||||
- **軽量**: 3-5MB程度(LLVMの1/10以下)
|
||||
- **JIT特化**: メモリ上での動的コンパイル
|
||||
- **Rust統合**: 静的リンクで配布容易
|
||||
- **lld内蔵**: Windows(lld-link)/Linux(ld.lld)で完全自立
|
||||
- **C ABIファサード**: `ny_mir_to_obj()`で美しい境界
|
||||
|
||||
#### 2. 直接x86エミッタ(革新的アプローチ)
|
||||
#### 2. 直接x86エミッタ(将来の革新的アプローチ)
|
||||
- **dynasm-rs/iced-x86**: Rust内で直接アセンブリ生成
|
||||
- **テンプレート・スティッチャ方式**: 2-3KBの超小型バイナリ可能
|
||||
- **完全な制御**: 依存ゼロの究極形
|
||||
@ -66,7 +70,15 @@ MIR 13命令の美しさを最大限に活かし、外部コンパイラ依存
|
||||
```nyash
|
||||
// 80,000行のRust実装が20,000行のNyashに!
|
||||
box NyashCompiler {
|
||||
init { parser, lowerer, backend }
|
||||
parser: ParserBox
|
||||
lowerer: LowererBox
|
||||
backend: BackendBox
|
||||
|
||||
birth() {
|
||||
me.parser = new ParserBox()
|
||||
me.lowerer = new LowererBox()
|
||||
me.backend = new BackendBox()
|
||||
}
|
||||
|
||||
compile(source) {
|
||||
local ast = me.parser.parse(source)
|
||||
@ -77,10 +89,34 @@ box NyashCompiler {
|
||||
|
||||
// MIR実行器も動的ディスパッチで簡潔に
|
||||
box MirExecutor {
|
||||
values: MapBox
|
||||
|
||||
birth() {
|
||||
me.values = new MapBox()
|
||||
}
|
||||
|
||||
execute(inst) { return me[inst.type](inst) }
|
||||
Const(inst) { me.values[inst.result] = inst.value }
|
||||
BinOp(inst) { /* 実装 */ }
|
||||
}
|
||||
|
||||
// lld内蔵リンカー(ChatGPT5協議)
|
||||
box LinkerBox {
|
||||
platform: PlatformBox
|
||||
lld_path: StringBox
|
||||
libraries: ArrayBox
|
||||
|
||||
birth(platform) {
|
||||
me.platform = platform
|
||||
me.lld_path = platform.findLldPath()
|
||||
me.libraries = new ArrayBox()
|
||||
}
|
||||
|
||||
link(objects, output) {
|
||||
local cmd = me.build_command(objects, output)
|
||||
return me.platform.execute(cmd)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### テンプレート・スティッチャ方式(革新的アプローチ)
|
||||
@ -113,23 +149,36 @@ box TemplateStitcher {
|
||||
|
||||
## 🔗 EXEファイル生成・リンク戦略
|
||||
|
||||
### 段階的アプローチ
|
||||
1. **Phase 1**: 外部リンカー(lld/gcc)利用
|
||||
2. **Phase 2**: lld内蔵で配布容易化
|
||||
3. **Phase 3**: ミニリンカー自作(究極の自立)
|
||||
### 統合ツールチェーン(ChatGPT5協議済み)
|
||||
```bash
|
||||
nyash build main.ny --backend=cranelift --target=x86_64-pc-windows-msvc
|
||||
```
|
||||
|
||||
### 実装戦略
|
||||
1. **MIR→Cranelift**: MIR13をCranelift IRに変換
|
||||
2. **Cranelift→Object**: ネイティブオブジェクトファイル生成(.o/.obj)
|
||||
3. **lld内蔵リンク**: lld-link(Win)/ld.lld(Linux)でEXE作成
|
||||
4. **nyashrtランタイム**: 静的/動的リンク選択可能
|
||||
|
||||
### C ABI境界設計
|
||||
- **プレフィクス**: `ny_v1_*`で統一
|
||||
- **呼出規約**: Windows(fastcall) / Linux(sysv_amd64)
|
||||
- **必須関数**: `ny_init()`, `ny_fini()`
|
||||
- **型マッピング**: `ny_handle=uint64_t`
|
||||
```c
|
||||
// 最小限の美しいインターフェース
|
||||
ny_mir_to_obj(mir_bin, target_triple) -> obj_bytes
|
||||
ny_mir_jit_entry(mir_bin) -> exit_code
|
||||
ny_free_buf(buffer)
|
||||
```
|
||||
|
||||
詳細は[**自己ホスティングlld戦略**](self-hosting-lld-strategy.md)を参照。
|
||||
|
||||
## 🔗 関連ドキュメント
|
||||
|
||||
- [🚀 自己ホスティングlld戦略](self-hosting-lld-strategy.md) **← NEW!**
|
||||
- [🧱 箱積み上げ準備メモ](box-stacking-preparation.txt) **← NEW!**
|
||||
- [セルフホスティング詳細計画](self-hosting-plan.txt)
|
||||
- [技術的実装詳細](technical-details.md)
|
||||
- [Phase 10: Cranelift JIT](../phase-10/)
|
||||
- [Phase 12.5: 最適化戦略](../phase-12.5/)
|
||||
- [Phase 12.7: ANCP圧縮](../phase-12.7/)
|
||||
|
||||
## 📅 実施時期
|
||||
|
||||
|
||||
@ -0,0 +1,149 @@
|
||||
Phase 15 自己ホスティング準備メモ - 箱積み上げ戦略
|
||||
=================================================
|
||||
Date: 2025-09-03
|
||||
Author: Claude + にゃ
|
||||
|
||||
■ 基本理念:箱を下にして積み重ねる
|
||||
=====================================
|
||||
|
||||
フォールバック不要、Rust依存なし(EXEライブラリのみ)
|
||||
一度置いた箱は動かさない
|
||||
下の箱が安定なら、上も安定
|
||||
複雑さは敵、シンプルさは友
|
||||
|
||||
■ 基礎Box群の階層構造
|
||||
======================
|
||||
|
||||
第1層(最下層):これがないと何も始まらない
|
||||
├── MemoryBox // メモリ管理
|
||||
├── StringBox // 文字列処理
|
||||
├── ArrayBox // 配列操作
|
||||
├── MapBox // 連想配列
|
||||
└── ErrorBox // エラー処理
|
||||
|
||||
第2層:言語処理の基礎
|
||||
├── TokenBox // 字句解析
|
||||
├── ASTBox // 構文木
|
||||
├── SymbolBox // シンボルテーブル
|
||||
└── ScopeBox // スコープ管理
|
||||
|
||||
第3層:コンパイラコア
|
||||
├── ParserBox // パーサー
|
||||
├── MIRBox // 中間表現(13命令)
|
||||
├── OptimizerBox // 最適化
|
||||
└── GeneratorBox // コード生成
|
||||
|
||||
第4層:実行系
|
||||
├── InterpreterBox // インタープリター
|
||||
├── VMBox // 仮想マシン
|
||||
├── JITBox // JITコンパイラ(Cranelift)
|
||||
└── LinkerBox // リンカー(lld)
|
||||
|
||||
■ 準備期間の研究項目
|
||||
====================
|
||||
|
||||
1. 依存関係マップ作成
|
||||
- 何が何に依存?
|
||||
- 最小限の依存で最大の効果
|
||||
- 循環依存の排除
|
||||
|
||||
2. インターフェース設計
|
||||
- 全Boxの共通プロトコル
|
||||
- 入力/出力の標準化
|
||||
- エラー処理の統一
|
||||
|
||||
3. ビルド順序の科学
|
||||
- Day 1: 基礎Box群
|
||||
- Day 2: 言語処理層
|
||||
- Day 3: コンパイラ層
|
||||
- 完成まで一直線
|
||||
|
||||
4. 最小ブートストラップセット
|
||||
- 自分自身をコンパイルできる最小構成
|
||||
- 必須機能の特定
|
||||
- 段階的な機能追加
|
||||
|
||||
■ 箱の品質保証原則
|
||||
==================
|
||||
|
||||
1. 単体で完結 - 他に依存しすぎない
|
||||
2. 明確な責務 - 1つの箱は1つの仕事
|
||||
3. テスト可能 - 単独で動作確認
|
||||
4. 不変インターフェース - 一度決めたら変更なし
|
||||
|
||||
■ 実装戦略
|
||||
==========
|
||||
|
||||
1. Rust実装の機能分解(Box単位)
|
||||
2. 各Boxの仕様書作成
|
||||
3. テストケースの移植計画
|
||||
4. Box間プロトコル設計
|
||||
5. 最小実装から始める
|
||||
6. 増分的に機能追加
|
||||
|
||||
■ 成功の鍵
|
||||
==========
|
||||
|
||||
- 準備こそすべて
|
||||
- 急いで実装より、じっくり設計
|
||||
- 箱を積み重ねれば必ず頂上に到達
|
||||
- フォールバックなし、後戻りなし、前進あるのみ
|
||||
|
||||
■ 革新的アイデア
|
||||
================
|
||||
|
||||
1. BoxDNA設計書
|
||||
- 各Boxの入力/出力/依存を明文化
|
||||
- 遺伝子のように継承・組み合わせ
|
||||
|
||||
2. 増分コンパイル対応
|
||||
- 変更部分だけ再コンパイル
|
||||
- 開発効率の向上
|
||||
|
||||
3. 可視化ツール
|
||||
- 進捗の見える化
|
||||
- 依存関係の図示
|
||||
|
||||
■ 数値目標
|
||||
==========
|
||||
|
||||
- 80,000行 → 20,000行(75%削減)
|
||||
- MIR13命令で全機能実現
|
||||
- ビルド時間:1分以内
|
||||
- テストカバレッジ:90%以上
|
||||
|
||||
■ コンテキスト圧縮対策
|
||||
======================
|
||||
|
||||
1. ANCP活用(Phase 12.7)
|
||||
- 90%圧縮でAIコンテキスト節約
|
||||
- [ANCP仕様書](../../phase-12.7/ancp-specs/ANCP-Token-Specification-v1.md)
|
||||
|
||||
2. モジュール分割開発
|
||||
- 各Boxを独立して開発
|
||||
- 統合は最後に実施
|
||||
|
||||
3. AI協調開発
|
||||
- Claude:実装担当
|
||||
- ChatGPT5:リファクタリング
|
||||
- Gemini:レビュー
|
||||
- Codex:デバッグ支援
|
||||
|
||||
■ 関連ドキュメント
|
||||
==================
|
||||
|
||||
- [自己ホスティングlld戦略](self-hosting-lld-strategy.md)
|
||||
- [Phase 15 README](README.md)
|
||||
- [Phase 12.7 ANCP](../../phase-12.7/)
|
||||
- [MIR13命令セット](../../../../reference/mir/INSTRUCTION_SET.md)
|
||||
|
||||
■ 次のアクション
|
||||
================
|
||||
|
||||
1. このメモをベースに詳細設計
|
||||
2. Box依存関係グラフの作成
|
||||
3. 最小実装セットの確定
|
||||
4. 各Boxの仕様書ドラフト
|
||||
|
||||
=====================================
|
||||
「箱を積み上げて、世界一美しいコンパイラを作るにゃ!」
|
||||
@ -0,0 +1,196 @@
|
||||
# Phase 15 自己ホスティング実装戦略 - MIR→Cranelift→lld
|
||||
|
||||
Author: ChatGPT5 + Claude協議
|
||||
Date: 2025-09-03
|
||||
Version: 1.0
|
||||
|
||||
## 📋 概要
|
||||
|
||||
Nyash完全自己ホスティングを実現するための具体的実装戦略。
|
||||
**「MIR→Craneliftで.o/.objを作る→lldでEXEを組む」**をNyashツールチェーンに内蔵する。
|
||||
|
||||
## 🎯 最終形(自己ホスト時の一発ボタン)
|
||||
|
||||
```bash
|
||||
nyash build main.ny \
|
||||
--backend=cranelift \
|
||||
--target=x86_64-pc-windows-msvc # or x86_64-unknown-linux-gnu
|
||||
```
|
||||
|
||||
内部処理フロー:
|
||||
1. **frontend**: AST→MIR13
|
||||
2. **codegen**: MIR→Cranelift→`.obj/.o`
|
||||
3. **link**: `lld-link`(Win) / `ld.lld`(Linux)でEXE生成
|
||||
4. 依存ランタイム`nyashrt`を自動リンク(静的/動的選択)
|
||||
|
||||
## 🏗️ 実装の芯(最小で美しいやつ)
|
||||
|
||||
### 1. コード生成ライブラリ(C ABIファサード)
|
||||
|
||||
```c
|
||||
// 最小限の美しいインターフェース
|
||||
ny_mir_to_obj(mir_bin, target_triple) -> obj_bytes
|
||||
ny_mir_jit_entry(mir_bin) -> exit_code // 開発用
|
||||
ny_free_buf(buffer) // メモリ解放
|
||||
|
||||
// エラーハンドリング
|
||||
// 例外は戻り値+NyErr(unwind禁止)
|
||||
```
|
||||
|
||||
実装のポイント:
|
||||
- 返却メモリは`ny_free_buf`で解放
|
||||
- 例外は戻り値+NyErrで統一(unwind禁止)
|
||||
- C ABIで安定した境界を作る
|
||||
|
||||
### 2. リンカー・ラッパ(プラットフォーム別)
|
||||
|
||||
#### Windows
|
||||
- 既定: `lld-link`
|
||||
- 主要フラグ:
|
||||
```bash
|
||||
lld-link <objs...> nyashrt.lib /SUBSYSTEM:CONSOLE \
|
||||
/OUT:a.exe /ENTRY:nyash_entry \
|
||||
/LIBPATH:<sdk/lib> /MACHINE:X64
|
||||
```
|
||||
- MSVC互換が要る配布向けに`/fallback:link.exe`オプションも用意可
|
||||
|
||||
#### Linux
|
||||
- 既定: `ld.lld`(開発で`mold`併用可)
|
||||
```bash
|
||||
ld.lld -o a.out main.o -L. -lnyashrt -lc -lm -pthread \
|
||||
--gc-sections --icf=all
|
||||
```
|
||||
|
||||
#### macOS(将来)
|
||||
- 日常は`ld64.lld`、配布はXcodeの`ld64` + コード署名(要Entitlements)
|
||||
|
||||
### 3. 同梱/検出戦略
|
||||
|
||||
**優先順**: 埋め込み`lld` → システム`lld` → 代替(mold/link.exe/ld64)
|
||||
|
||||
```bash
|
||||
nyash toolchain doctor # 検出&パス設定
|
||||
--linker=lld|mold|link.exe|ld64 # 明示上書き
|
||||
```
|
||||
|
||||
### 4. ランタイム同梱
|
||||
|
||||
- `nyashrt`を**static(.a/.lib)**と**shared(.so/.dll)**両用意
|
||||
- 既定は**static**(配布が楽)、`--shared-rt`で動的リンクに切替
|
||||
- Windowsは**PDB生成**、Linuxは`-g`/`-Wl,--build-id`でデバッグ容易に
|
||||
|
||||
## 🔧 エラー整合(ビルド失敗をわかりやすく)
|
||||
|
||||
| エラー種別 | 戻り値 | 説明・対処 |
|
||||
|----------|-------|-----------|
|
||||
| `ny_mir_to_obj`失敗 | `NYCG_ERR_*` | ターゲット不一致/CLIF生成失敗など |
|
||||
| リンク失敗 | リンカ標準出力 | ファイル名/未解決シンボルを整形表示 |
|
||||
|
||||
診断オプション:
|
||||
```bash
|
||||
--emit=clif,asm,obj,link-cmd # 診断をファイル出力(再現しやすい)
|
||||
```
|
||||
|
||||
## 💾 キャッシュ&クロスコンパイル
|
||||
|
||||
### オブジェクトキャッシュ
|
||||
`hash(MIR, target, codegen_ver)` → `.obj/.o`を再利用
|
||||
|
||||
### クロスコンパイル
|
||||
```bash
|
||||
--target=<triple> # .obj/.oとリンク器/SDKを切替
|
||||
```
|
||||
- Win用: `x86_64-pc-windows-msvc`(`lld-link` + MSVCライブラリ)
|
||||
- Linux: `x86_64-unknown-linux-gnu`(`ld.lld` + glibc)
|
||||
|
||||
**Zig toolchain**を併用するとクロス用のCRT/SDKが楽(内部はlld)
|
||||
|
||||
## 🎨 使いやすいCLI例
|
||||
|
||||
```bash
|
||||
nyash build main.ny --backend=cranelift --release
|
||||
nyash build main.ny --emit=obj,asm,clif # 解析用
|
||||
nyash run main.ny --backend=cranelift # JITで即実行
|
||||
nyash toolchain doctor # lld/SDK検出
|
||||
```
|
||||
|
||||
## ⚡ 地味に効く最適化スイッチ
|
||||
|
||||
### リンカ最適化
|
||||
- `ld.lld`: `--gc-sections --icf=all`(不要コード除去&同一関数折りたたみ)
|
||||
|
||||
### Cranelift最適化
|
||||
- `opt_level=speed`
|
||||
- TypedArrayの**bounds-check併合**をLowerで実装
|
||||
|
||||
### 実行時最適化
|
||||
- 起動時CPUIDで**関数ポインタ切替**(AVX2/512の専用小関数)
|
||||
|
||||
## ✅ 最初の"動くまで"チェックリスト
|
||||
|
||||
- [ ] `ny_mir_to_obj`(C ABI)で`.o/.obj`を返せる
|
||||
- [ ] `nyash link <obj> --target=<triple>`が`lld`でEXEを作れる
|
||||
- [ ] Windows/Linuxそれぞれ"Hello, Box!"実行成功
|
||||
- [ ] `--emit=clif,asm`でダンプが落ちる
|
||||
- [ ] 失敗時のエラーメッセージが**ファイル名+未解決シンボル**まで出る
|
||||
- [ ] `nyash toolchain doctor`でlld/SDK検出
|
||||
|
||||
## 📐 実装設計詳細
|
||||
|
||||
### LinkerBox設計
|
||||
```nyash
|
||||
box LinkerBox {
|
||||
init { platform, linker_path, libraries, flags }
|
||||
|
||||
link(objects, output_path) {
|
||||
local cmd = me.build_link_command(objects, output_path)
|
||||
local result = me.execute_linker(cmd)
|
||||
|
||||
if result.exit_code != 0 {
|
||||
me.format_link_error(result.stderr)
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
detect_linker() {
|
||||
// 優先順: 内蔵lld → システムlld → 代替
|
||||
if me.has_embedded_lld() {
|
||||
return me.extract_embedded_lld()
|
||||
}
|
||||
return me.find_system_linker()
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### CraneliftBox統合
|
||||
```nyash
|
||||
box CraneliftBox {
|
||||
init { target_triple, opt_level }
|
||||
|
||||
compile(mir) {
|
||||
// MIR13 → Cranelift IR → Object
|
||||
local module = me.create_module()
|
||||
|
||||
for inst in mir.instructions {
|
||||
me.lower_instruction(module, inst)
|
||||
}
|
||||
|
||||
return module.compile()
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 🌟 まとめ
|
||||
|
||||
- **Yes**: CraneliftでEXEにするには**内部でlldを叩く機能を埋め込む**のが正攻法
|
||||
- 仕組みは**MIR→Cranelift .o/.obj → lld**
|
||||
- C ABIファサード経由でcodegenを呼び、リンカは**内蔵ドライバ**で統一
|
||||
- これで**自己ホスト→即EXE生成**の"気持ちいい体験"が完成!
|
||||
|
||||
## 🔗 関連ドキュメント
|
||||
|
||||
- [Phase 15メインドキュメント](README.md)
|
||||
- [C ABI境界設計](../phase-12/c-abi-spec.md)
|
||||
- [MIR 13命令セット](../../reference/mir/INSTRUCTION_SET.md)
|
||||
- [Cranelift統合](../phase-10/)
|
||||
Reference in New Issue
Block a user