252 lines
6.9 KiB
Markdown
252 lines
6.9 KiB
Markdown
# Phase 15.76 - extern_c & Frozen Toolchain INDEX
|
||
|
||
## 🎯 Phase概要
|
||
|
||
**extern_c構文実装 + 凍結EXE(hako-frozen-v1.exe)の背骨確立**
|
||
|
||
Hakoruneから直接C関数を呼び出し、LLVM BackendをプラグインとしてC ABI経由で利用可能にする。これにより、Rust層を凍結しても日常開発が回る基盤を確立。
|
||
|
||
---
|
||
|
||
## 📁 ドキュメント構成
|
||
|
||
### 🎯 計画・戦略
|
||
- **[MILESTONE.md](MILESTONE.md)** ⭐最重要 - ゴールライン(受け入れ基準/DoD)
|
||
- **[BUILTIN_VS_PLUGIN_DESIGN.md](BUILTIN_VS_PLUGIN_DESIGN.md)** - 内蔵 vs プラグイン設計方針
|
||
- **[GUARD_RAILS.md](GUARD_RAILS.md)** - 安全性・セキュリティ設計(作成予定)
|
||
|
||
### 📚 技術資料
|
||
- **[docs/reference/language/extern_c.md](../../reference/language/extern_c.md)** - extern_c構文リファレンス(作成予定)
|
||
- **[docs/guides/frozen-toolchain.md](../../guides/frozen-toolchain.md)** - 凍結ツールチェーン使用ガイド(作成予定)
|
||
|
||
### 🔧 実装資料
|
||
- **[libs/llvm_backend/](../../../../../../../libs/llvm_backend/)** - LLVM Backendプラグイン実装(作成予定)
|
||
- **[tools/aot/](../../../../../../../tools/aot/)** - AOT補助スクリプト(作成予定)
|
||
|
||
---
|
||
|
||
## 🚀 Phase 15.76 の核心アイデア
|
||
|
||
### 💡 発見の経緯(2025-10-14)
|
||
|
||
**User(tomoaki)の思考プロセス**:
|
||
1. 「HakoruneからC ABIを呼びたい」
|
||
2. 「あ、Rustもやってる!`extern "C"`」
|
||
3. 「じゃあHakoruneでも`extern_c`構文を!」
|
||
|
||
**結果**: 業界標準パターンへの独自収束 ⭐論文価値
|
||
|
||
### 🎯 3つのルール
|
||
|
||
1. **単一パーサ**: Hakoruneパーサーのみ開発(Rust凍結)
|
||
2. **stage0(凍結EXE)**: hako-frozen-v1.exe 基盤使用
|
||
3. **床=Rust / 家=Hakorune**: Rustは基盤、Hakoruneは拡張
|
||
|
||
### ⚡ なぜこの戦略
|
||
|
||
- **開発速度**: Rustビルド3-5分 → 凍結EXE即座
|
||
- **決定性**: パーサ1つのみ保守 → 2重メンテ回避
|
||
- **回帰コスト**: 凍結EXEで戻れる → 安全試行錯誤
|
||
|
||
---
|
||
|
||
## 📋 実装の全体像
|
||
|
||
### 1️⃣ extern_c構文(Hakorune言語側)
|
||
|
||
```hakorune
|
||
// 基本形: C関数を直接呼び出し
|
||
static box SystemInfo {
|
||
get_pid() -> IntegerBox {
|
||
local pid = extern_c "getpid"()
|
||
return pid
|
||
}
|
||
|
||
string_length(s: StringBox) -> IntegerBox {
|
||
local len = extern_c "strlen"(s.to_cstring())
|
||
return len
|
||
}
|
||
|
||
run_command(cmd: StringBox) -> IntegerBox {
|
||
local result = extern_c "system"(cmd.to_cstring())
|
||
return result
|
||
}
|
||
}
|
||
```
|
||
|
||
### 2️⃣ バックエンドプラグイン(C ABI出力)
|
||
|
||
```hakorune
|
||
// LLVM Backendをプラグインとして呼び出し
|
||
static box Compiler {
|
||
compile_to_object(mir: StringBox, out: StringBox) -> IntegerBox {
|
||
local result = extern_c "llvm_compile_mir_to_object"(
|
||
mir.to_cstring(),
|
||
out.to_cstring()
|
||
)
|
||
return result
|
||
}
|
||
}
|
||
```
|
||
|
||
### 3️⃣ AOT導線
|
||
|
||
```bash
|
||
# Step 1: MIR JSON生成
|
||
./hako --backend mir --emit-mir-json program.mir.json program.hako
|
||
|
||
# Step 2: extern_c経由で .o 生成
|
||
./hako compiler_wrapper.hako program.mir.json program.o
|
||
|
||
# Step 3: clangでリンク
|
||
clang program.o -o program.exe libhakorune_kernel.a
|
||
```
|
||
|
||
---
|
||
|
||
## 🔒 セキュリティ設計
|
||
|
||
### 既定Deny + Allowlist
|
||
|
||
```toml
|
||
# hako.toml
|
||
[ffi.dynamic]
|
||
allow = [
|
||
"getpid", # 既定
|
||
"strlen", # 既定
|
||
"system", # 既定
|
||
"getppid", # 追加
|
||
]
|
||
```
|
||
|
||
### ENV変数
|
||
|
||
```bash
|
||
# 開発時のみ許可(CI不可)
|
||
HAKO_FFI_ALLOW_ALL=1 ./hako program.hako
|
||
|
||
# 追加許可(マージ)
|
||
HAKO_FFI_ALLOW_LIST=getppid,getuid ./hako program.hako
|
||
```
|
||
|
||
### 優先順位
|
||
|
||
```
|
||
1. 既定ホワイトリスト(最小セット)
|
||
2. TOML設定(hako.toml, nyash.toml)
|
||
3. ENV変数(HAKO_FFI_ALLOW_LIST)
|
||
4. Dev許可(HAKO_FFI_ALLOW_ALL=1)← CI不可
|
||
```
|
||
|
||
---
|
||
|
||
## 📦 内蔵 vs プラグイン方針
|
||
|
||
### ✅ 凍結EXEに内蔵(静的同梱)
|
||
|
||
- **Core Boxes**: String/Integer/Bool/Array/Map
|
||
- **Console/Time**: 診断・時刻(最小)
|
||
- **JSON**: MIR JSONブリッジ(最小)
|
||
- **File**: 読み込み専用(最小)
|
||
- **extern_c runtime**: allowlist機構
|
||
|
||
### 🔌 プラグイン(動的ロード)
|
||
|
||
- **libllvm_backend.so** ⭐C ABI出力(.o生成)
|
||
- **Network/HTTP**: セキュリティ影響大
|
||
- **拡張FS**: 書き込み専用
|
||
- **重量物**: 圧縮/暗号/画像/正規表現
|
||
|
||
詳細: [BUILTIN_VS_PLUGIN_DESIGN.md](BUILTIN_VS_PLUGIN_DESIGN.md)
|
||
|
||
---
|
||
|
||
## 🧪 テスト戦略
|
||
|
||
### quick-selfhost プロファイル
|
||
|
||
```bash
|
||
# 基本動作
|
||
tools/smokes/v2/profiles/quick-selfhost/extern_c_strlen_vm.sh
|
||
tools/smokes/v2/profiles/quick-selfhost/extern_c_getpid_vm.sh
|
||
tools/smokes/v2/profiles/quick-selfhost/extern_c_system_vm.sh
|
||
|
||
# 許可機構
|
||
tools/smokes/v2/profiles/quick-selfhost/extern_c_env_allowlist_getppid_vm.sh
|
||
tools/smokes/v2/profiles/quick-selfhost/extern_c_deny_unknown_vm.sh
|
||
```
|
||
|
||
### 期待結果
|
||
|
||
```
|
||
extern_c_strlen_vm... [PASS] (0.5s)
|
||
extern_c_getpid_vm... [PASS] (0.3s)
|
||
extern_c_system_vm... [PASS] (0.4s)
|
||
extern_c_env_allowlist_getppid_vm... [PASS] (0.3s)
|
||
extern_c_deny_unknown_vm... [PASS] (0.3s)
|
||
```
|
||
|
||
---
|
||
|
||
## 📊 進捗トラッキング
|
||
|
||
### Week 1(2025-10-14 - 10-18)
|
||
- [ ] extern_c構文実装(Parser→AST→MIR)
|
||
- [ ] VM動的FFI基盤(0/1/2引数対応)
|
||
- [ ] 既定ホワイトリスト実装
|
||
|
||
### Week 2(2025-10-19 - 10-25)
|
||
- [ ] ENV/TOML許可機構
|
||
- [ ] libs/llvm_backend プラグイン化
|
||
- [ ] lib探索パス実装
|
||
|
||
### Week 3(2025-10-26 - 11-01)
|
||
- [ ] AOT導線整備(MIR JSON→.o→EXE)
|
||
- [ ] 補助スクリプト作成
|
||
- [ ] ドキュメント完成
|
||
|
||
### Week 4(2025-11-02 - 11-08)
|
||
- [ ] スモークテスト追加
|
||
- [ ] 統合テスト(quick-selfhost)
|
||
- [ ] レビュー・調整
|
||
|
||
詳細: [MILESTONE.md](MILESTONE.md)
|
||
|
||
---
|
||
|
||
## 🚀 次のフェーズ(Phase 15.77/凍結へ)
|
||
|
||
### 開始条件
|
||
1. AOTルート再現可能(MIR JSON→.o→EXE)
|
||
2. libs/llvm_backend ビルド緑(Linux)
|
||
3. allowlist/TOML運用ガイド完成
|
||
|
||
### Phase 15.77 目標
|
||
- **凍結EXE確定**: hako-frozen-v1.exe タグ付け・配布
|
||
- **Rust層最小化**: 100-200行(VM実行エンジンのみ)
|
||
- **脱Rust加速**: Hakoruneパーサーのみ開発
|
||
|
||
---
|
||
|
||
## 📚 関連リソース
|
||
|
||
### 設計資料
|
||
- [Phase 15.75 - 脱Rust大作戦](../phase-15.75/)
|
||
- [Stage 4 - Dual Parser Harness](../phase-15.75/stage-4/)
|
||
- [ChatGPT extern_c戦略](../phase-15.75/stage-4-chatgpt/EXTERN_C_SELFHOST_STRATEGY.md)
|
||
|
||
### 論文資料
|
||
- [Rapid Self-Hosting Paper](../../../../private/papers-active/rapid-selfhost-ai-collaboration/)
|
||
- [Pattern Rediscovery Evidence](../../../../private/papers-active/rapid-selfhost-ai-collaboration/03_DATA_ANALYSIS.md)
|
||
|
||
### 業界標準パターン
|
||
- **Rust**: stage0(凍結ツールチェーン)
|
||
- **Go**: Go 1.4 frozen(bootstrap用)
|
||
- **OCaml**: ocamlc frozen(自己ホスト用)
|
||
|
||
---
|
||
|
||
**作成日**: 2025-10-14
|
||
**Phase開始**: 2025-10-14
|
||
**想定期間**: 4週間(Week 1-4)
|