docs: restore docs/private/roadmap from 7b4908f9 (Phase 20.31)

This commit is contained in:
nyash-codex
2025-10-31 18:00:10 +09:00
parent 1d49e24bf0
commit 8fd3a2b509
433 changed files with 108935 additions and 0 deletions

View File

@ -0,0 +1,21 @@
# 🎉 Self-Hosting Achieved
Date: 2025-10-14 (Phase 15.76完了時)
## 宣言
Hakorune完全セルフホスト達成。
今後:
- マクロ拡張・構文拡張 → Hakorune側で開発
- Rust層 → ブートストラップ基盤として凍結
- 開発サイクル → 凍結EXEhako-frozen-v1.exe使用
業界標準パターンRust stage0, Go 1.4, OCaml ocamlc踏襲。
---
**Date**: 2025-10-14
**Milestone**: Phase 15.76完了
**Team**: 1人 + 2AI (ChatGPT + Claude Code)
**開発期間**: 2ヶ月
**Lines changed**: 800万行作成+削除)
**開発速度**: 業界標準の52倍Linux比較

View File

@ -0,0 +1,192 @@
# 内蔵 vs プラグイン設計方針Phase 15.76
## 🎯 設計原則
凍結EXEhako-frozen-v1.exeに「何を内蔵し、何をプラグイン化するか」は**ブートストラップの安定性とTCB最小化のトレードオフ**。
### 基本方針
- **内蔵**: 日常開発の土台、小さく安全、外部依存なし
- **外付け**: ツールチェーン・重量物・セキュリティ影響大
---
## ✅ 凍結EXEに内蔵すべき最小セット静的同梱
### 📌 Core必須・小さく安全
- **String/Integer/Bool**: 核となる箱
- **Array/Map**: 言語データ構造の土台
- **Console/Time**: 診断と時刻(`env.console.log`, `nyrt.time.now_ms`程度)
### 📌 JSON最小
- **MIR JSONブリッジ**: parse/serialize最小機能
- **設定読み込み**: hako.toml等の設定解析
### 📌 File最小・読み込み中心
- **read_text/exists**: 読み込み中心の最小I/O
- **write**: プロファイルでON安全重視
### 📌 extern_c ランタイム導線(実装済み)
- **ffi.dynamic 経路**: deny-by-default + allowlist設定
### 🎯 理由
- 日常開発で必要な土台を外部依存なしで安定稼働
- 凍結EXEの再配布を容易にする再現性・TCB最小
---
## 🔌 外付け(プラグイン)に回すべきもの
### 🚀 AOT/ツールチェーンC ABI出力 ⭐最重要判断
**形態**: バックエンドプラグインcdylibとして提供
**理由**:
- VM/言語仕様と分離、差し替え容易
- セキュリティ・配布単位が明確
- CIでも扱いやすい
**実装例**:
```hakorune
// libllvm_backend.so経由でC ABI出力
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
}
// 将来拡張
link_objects(objs: ArrayBox, out: StringBox) -> IntegerBox {
return extern_c "llvm_link_objects"(objs, out)
}
compile_to_ll(mir: StringBox, out: StringBox) -> IntegerBox {
return extern_c "llvm_compile_mir_to_ll"(mir, out)
}
}
```
**外部ファイル**:
- `plugins/libllvm_backend.so` (Rust cdylib)
- `extern "C" { fn llvm_compile_mir_to_object(...) -> i64; }`
- allowlist: `ffi.dynamic.llvm_compile_mir_to_object = "allow"`
### 🌐 ネットワーク/HTTP
- セキュリティ影響が広い
- プロファイルでONENV/TOML
### 📂 拡張FS書込み/監視/権限)
- 安全重視(読み込みは内蔵、書き込みは外付け)
### 🎨 重量物(圧縮/暗号/画像/正規表現)
- 必要時のみ導入(サイズ/依存削減)
### ⚙️ OS/Process拡張spawn/env/pty等
- extern_c経由で十分
- 許可はENV/TOMLで局所的に
---
## 🔮 未作成だが内蔵を検討する候補(将来)
### 🛤️ Path/URI軽量ユーティリティ
- 文字列操作を補助(パス結合・正規化)程度の純関数
- 小さく安全であれば内蔵候補
### 📍 Minimal JSON Pointer/Path読み取り専用
- コンパイラ周辺(設定/メタ)にあると便利
- 重いJSON機能は別プラグインで
---
## 📋 プラグイン優先度リスト
### 🔥 最優先Phase 15.76 Week 1-2
1. **libllvm_backend** - C ABI出力.o生成
2. **extern_c allowlist** - 許可機構完成
### ⚡ 高優先Week 3-4
3. **Network/HTTP** - 外付けプラグイン化
4. **拡張FS書き込み** - 外付けプラグイン化
### 📦 中優先Week 5-8
5. **Path/URI** - 軽量ユーティリティ内蔵
6. **JSON拡張** - Pointer/Path読み取り専用
### 🎁 低優先(将来)
7. 圧縮/暗号/画像/正規表現
8. OS/Process拡張spawn等
---
## 🎯 凍結EXE最終構成目標
```
hako-frozen-v1.exe (静的同梱)
├── Core Boxes (String/Int/Bool/Array/Map)
├── Console/Time最小
├── JSON最小
├── File読み込み専用
└── extern_c runtimeallowlist機構
plugins/ (動的ロード)
├── libllvm_backend.so ⭐C ABI出力
├── libnetwork.soHTTP/Socket
├── libfs_write.so書き込み専用
└── lib*.so将来拡張
```
### 🔒 セキュリティ設計
- **deny-by-default**: すべてのextern_cはデフォルト拒否
- **allowlist**: ENV/TOMLで明示的に許可
- **監査可能**: 許可リストは1ファイルで管理
---
## 💡 重要な洞察
### ChatGPTの指摘2025-10-14
> 「C ABI出力.o 生成・リンク補助)はプラグイン(バックエンドプラグイン)として切り出すのが最適だよ。」
### 理由
1. **VM/言語仕様から独立** - Hakorune構文変更の影響なし
2. **入替え容易** - LLVM 18→19等のアップグレード簡単
3. **セキュリティ境界明確** - コンパイラとツールチェーンの責任分離
4. **CIでも扱いやすい** - プラグインのみ差し替えでテスト可能
---
## 📊 比較: 内蔵 vs 外付け
| 機能 | 内蔵 | 外付け | 理由 |
|-----|------|--------|------|
| String/Int/Bool | ✅ | ❌ | 核となる箱 |
| Array/Map | ✅ | ❌ | 言語データ構造 |
| Console/Time | ✅ | ❌ | 診断・時刻(最小) |
| JSON最小 | ✅ | ❌ | MIR/設定 |
| File読み込み | ✅ | ❌ | 日常開発 |
| File書き込み | ❌ | ✅ | 安全重視 |
| C ABI出力 | ❌ | ✅ | ツールチェーン分離 ⭐ |
| Network/HTTP | ❌ | ✅ | セキュリティ影響大 |
| 圧縮/暗号 | ❌ | ✅ | 重量物 |
---
## 🚀 次のアクション
### Week 1-2Phase 15.76前半)
1. libllvm_backend プラグイン化
2. extern_c allowlist機構完成
3. 凍結EXE最小構成確定
### Week 3-4Phase 15.76後半)
4. Network/HTTP外付け化
5. 拡張FS書き込み外付け化
6. セキュリティ監査
---
**作成日**: 2025-10-14
**関連**: Phase 15.76, extern_c戦略, 凍結EXE設計

View File

@ -0,0 +1,34 @@
# 二重セルフビルドテスト(決定性検証)
## 目的
コンパイラの決定性保証Rust/Go業界標準
## 方式
```
Stage 0 (凍結EXE) → Hako₁
Hako₁ → Hako₂
Hako₂ → Hako₃
検証: Hako₂ == Hako₃ (バイト同一)
```
## 実装
```bash
# tools/ci/double-selfhost-test.sh
STAGE0=./bin/hako-frozen-v1.exe
$STAGE0 apps/selfhost/full_compiler.hako -o hako-stage1.exe
./hako-stage1.exe apps/selfhost/full_compiler.hako -o hako-stage2.exe
./hako-stage2.exe apps/selfhost/full_compiler.hako -o hako-stage3.exe
cmp -s hako-stage2.exe hako-stage3.exe || exit 1
echo "✅ Deterministic!"
```
## CI統合
- GitHub Actions: 毎push/PR
- quick-selfhost プロファイル追加検討
- 失敗時 → 非決定性コンパイル警報
## タイミング
Phase 15.76完了後 → 凍結EXE生成時に設定

View File

@ -0,0 +1,386 @@
# Phase 15.76 Guard Rails - 安全性設計
## 🔒 セキュリティ原則
### 基本方針
1. **Deny by Default** - すべてのextern_cはデフォルト拒否
2. **Explicit Allowlist** - 明示的に許可したもののみ実行
3. **Fail-Fast** - 不正な呼び出しは即座にエラー
4. **Audit Trail** - 許可リストは1ファイルで管理
---
## 🛡️ 許可モデル4層防御
### Layer 1: 既定ホワイトリスト(最小セット)
**場所**: `src/runtime/ffi/default_allowlist.rs`
```rust
pub const DEFAULT_ALLOWLIST: &[&str] = &[
"getpid", // プロセスID取得安全
"strlen", // 文字列長取得(安全)
"system", // コマンド実行(制御必要)
];
```
**選定基準**:
- ✅ 読み取り専用または副作用が限定的
- ✅ デバッグ・診断に有用
- ✅ 一般的なC標準関数
**除外基準**:
- ❌ ファイル書き込み(`fopen`, `fwrite`
- ❌ ネットワーク(`socket`, `bind`
- ❌ プロセス生成(`fork`, `exec`
- ❌ メモリ操作(`malloc`, `free`
### Layer 2: TOML設定プロジェクト固有
**場所**: `hako.toml` または `nyash.toml`
```toml
# プロジェクトで必要な追加関数
[ffi.dynamic]
allow = [
"getppid", # 親プロセスID
"getuid", # ユーザーID
"gethostname", # ホスト名取得
]
```
**運用方針**:
- プロジェクトに必要な関数のみ追加
- コミット時にレビュー必須
- 理由をコメントで明記
### Layer 3: ENV変数一時的追加
**場所**: 環境変数 `HAKO_FFI_ALLOW_LIST`
```bash
# 一時的に getppid を許可
HAKO_FFI_ALLOW_LIST=getppid ./hako program.hako
# 複数関数を許可(カンマ区切り)
HAKO_FFI_ALLOW_LIST=getppid,getuid,gethostname ./hako program.hako
```
**用途**:
- 開発中の試行錯誤
- CI/CDでの特定テスト
- デバッグ用途
**制限**:
- TOMLとマージ上書きではない
- 本番環境では使用禁止
### Layer 4: Dev許可開発専用
**場所**: 環境変数 `HAKO_FFI_ALLOW_ALL=1`
```bash
# 全関数を許可(開発専用)
HAKO_FFI_ALLOW_ALL=1 ./hako program.hako
```
**⚠️ 重大な制限**:
- **CI不可**: CIでこのフラグが立っていたらエラー
- **本番不可**: 本番環境では絶対に使用禁止
- **監査必須**: 使用時はログに記録
**検出方法**:
```bash
# CI/CDで検出
if [ "$HAKO_FFI_ALLOW_ALL" = "1" ]; then
echo "❌ ERROR: HAKO_FFI_ALLOW_ALL=1 is not allowed in CI"
exit 1
fi
```
---
## 🎯 許可の優先順位
```
高 ↑ 1. 既定ホワイトリストDEFAULT_ALLOWLIST
| 2. TOML設定hako.toml, nyash.toml
| 3. ENV変数HAKO_FFI_ALLOW_LIST
低 ↓ 4. Dev許可HAKO_FFI_ALLOW_ALL=1← CI不可
※ 上層で許可されていれば、下層の設定は不要
※ マージ動作:すべて「追加」(上書きではない)
```
---
## 🔍 実行時チェック
### 呼び出し時の検証フロー
```rust
// src/backend/mir_interpreter/handlers/extern_c.rs
pub fn execute_extern_c(
symbol: &str,
args: Vec<Value>,
allowlist: &AllowList,
) -> Result<Value, RuntimeError> {
// Step 1: 許可チェック
if !allowlist.is_allowed(symbol) {
return Err(RuntimeError::ExternCDenied {
symbol: symbol.to_string(),
reason: "not in allowlist".to_string(),
});
}
// Step 2: 引数型チェック
validate_args(symbol, &args)?;
// Step 3: 動的ロード
let func = load_symbol(symbol)?;
// Step 4: 実行Fail-Fast
call_extern_function(func, args)
}
```
### エラーメッセージ例
```
❌ ERROR: ExternCDenied
Symbol: my_custom_func
Reason: not in allowlist
To allow this function:
1. Add to hako.toml: [ffi.dynamic] allow = ["my_custom_func"]
2. Use ENV: HAKO_FFI_ALLOW_LIST=my_custom_func
3. Dev only: HAKO_FFI_ALLOW_ALL=1 (⚠️ CI not allowed)
```
---
## 🧪 テストケース
### ✅ 許可された関数PASS
```bash
# 既定関数
./hako -c 'extern_c "getpid"()' # ✅ PASS
# TOML許可
# hako.toml: [ffi.dynamic] allow = ["getppid"]
./hako -c 'extern_c "getppid"()' # ✅ PASS
# ENV許可
HAKO_FFI_ALLOW_LIST=getuid ./hako -c 'extern_c "getuid"()' # ✅ PASS
```
### ❌ 拒否された関数FAIL
```bash
# 許可されていない関数
./hako -c 'extern_c "fork"()' # ❌ FAIL: ExternCDenied
# 出力例:
# ERROR: ExternCDenied
# Symbol: fork
# Reason: not in allowlist
```
### 🔧 Dev許可開発専用
```bash
# 開発時のみ全許可
HAKO_FFI_ALLOW_ALL=1 ./hako -c 'extern_c "fork"()' # ✅ PASS (dev only)
# CIでは拒否
# CI環境でHAKO_FFI_ALLOW_ALL=1が設定されていたらエラー
```
---
## 📋 監査ガイドライン
### プロジェクト設定の監査
```bash
# hako.toml の許可リストを確認
grep -A 10 '\[ffi.dynamic\]' hako.toml
# チェックポイント:
# ✅ 各関数の用途が明確か?
# ✅ 最小権限原則が守られているか?
# ✅ 危険な関数fork/exec/socket等が含まれていないか
```
### 実行時ログ(将来実装)
```bash
# extern_c呼び出しをログに記録
HAKO_FFI_LOG=1 ./hako program.hako
# 出力例:
# [FFI] Called: getpid() → 12345
# [FFI] Called: strlen("hello") → 5
# [FFI] Denied: fork() (not in allowlist)
```
---
## 🚨 危険な関数リスト(参考)
### 絶対に許可すべきでない関数
```c
// プロセス制御
fork() // プロセス複製
exec*() // プログラム実行
system() // ⚠️ 既定に含まれるが制御必要
// メモリ操作
malloc() // メモリ確保
free() // メモリ解放
realloc() // メモリ再確保
// ファイル書き込み
fopen() // ファイルオープン
fwrite() // ファイル書き込み
remove() // ファイル削除
// ネットワーク
socket() // ソケット生成
bind() // ポートバインド
listen() // 接続待ち受け
```
### 慎重に許可すべき関数
```c
// 読み取り専用(比較的安全)
getpid() // ✅ プロセスID
getuid() // ✅ ユーザーID
strlen() // ✅ 文字列長
// 副作用あり(用途確認必要)
system() // ⚠️ コマンド実行
getenv() // ⚠️ 環境変数取得
setenv() // ❌ 環境変数設定
```
---
## 🔐 ライブラリ探索のセキュリティ
### 探索パスの優先順位
```
高 ↑ 1. target/release/ (ビルド成果物)
| 2. $NYASH_ROOT/target/release/(プロジェクトルート)
| 3. カレントディレクトリ (実行場所)
低 ↓ 4. $HAKO_FFI_LIB_PATHS ENV指定
```
### セキュリティ制約
```bash
# ✅ 安全: プロジェクト内のライブラリ
./target/release/libllvm_backend.so
# ⚠️ 注意: システムライブラリ
/usr/lib/libcustom.so
# ❌ 危険: 任意のパス
/tmp/malicious.so # 探索パスに含めない
```
### 実装
```rust
pub fn find_library(name: &str) -> Option<PathBuf> {
// Step 1: ホワイトリスト確認
if !is_allowed_library(name) {
return None;
}
// Step 2: 安全なパスのみ探索
let safe_paths = [
"target/release",
&format!("{}/target/release", env!("NYASH_ROOT")),
".",
];
for path in safe_paths {
let lib_path = Path::new(path).join(name);
if lib_path.exists() {
return Some(lib_path);
}
}
None
}
```
---
## 📊 セキュリティチェックリスト
### 開発時
- [ ] 新しいextern_c呼び出しはTOMLに追加したか
- [ ] 各関数の用途を明確に説明できるか?
- [ ] 最小権限原則が守られているか?
### コミット前
- [ ] hako.toml の [ffi.dynamic] をレビューしたか?
- [ ] 危険な関数fork/exec等が含まれていないか
- [ ] テストで許可機構の動作を確認したか?
### リリース前
- [ ] 本番環境で HAKO_FFI_ALLOW_ALL=1 が使われていないか?
- [ ] CIでセキュリティチェックが通っているか
- [ ] 監査ログを確認したか?
---
## 🎯 推奨運用方針
### ステージング別設定
```toml
# hako.dev.toml開発環境
[ffi.dynamic]
allow = [
"getpid", "strlen", "system", # 既定
"getppid", "getuid", # デバッグ用
]
# hako.prod.toml本番環境
[ffi.dynamic]
allow = [
"getpid", "strlen", # 最小限
]
```
### CI/CD設定
```yaml
# .github/workflows/test.yml
- name: Security Check
run: |
# HAKO_FFI_ALLOW_ALL=1 の検出
if [ "$HAKO_FFI_ALLOW_ALL" = "1" ]; then
echo "❌ ERROR: HAKO_FFI_ALLOW_ALL=1 not allowed in CI"
exit 1
fi
# 危険な関数の検出
if grep -r "fork\|exec\|socket" hako.toml; then
echo "⚠️ WARNING: Dangerous functions found in hako.toml"
fi
```
---
**作成日**: 2025-10-14
**レビュー**: セキュリティ設計確定
**関連**: Phase 15.76, extern_c許可モデル, セキュリティ

View File

@ -0,0 +1,251 @@
# Phase 15.76 - extern_c & Frozen Toolchain INDEX
## 🎯 Phase概要
**extern_c構文実装 + 凍結EXEhako-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
**Usertomoakiの思考プロセス**:
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 12025-10-14 - 10-18
- [ ] extern_c構文実装Parser→AST→MIR
- [ ] VM動的FFI基盤0/1/2引数対応
- [ ] 既定ホワイトリスト実装
### Week 22025-10-19 - 10-25
- [ ] ENV/TOML許可機構
- [ ] libs/llvm_backend プラグイン化
- [ ] lib探索パス実装
### Week 32025-10-26 - 11-01
- [ ] AOT導線整備MIR JSON→.o→EXE
- [ ] 補助スクリプト作成
- [ ] ドキュメント完成
### Week 42025-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 frozenbootstrap用
- **OCaml**: ocamlc frozen自己ホスト用
---
**作成日**: 2025-10-14
**Phase開始**: 2025-10-14
**想定期間**: 4週間Week 1-4

View File

@ -0,0 +1,201 @@
# Phase 15.76 Milestone & Goal Line
## 🎯 このフェーズのゴール
**extern_c構文 + 凍結EXEの背骨を完成させる**
- Hakoruneから直接C関数を呼べるRustの`extern "C"`と同等)
- LLVM BackendをプラグインとしてC ABI経由で呼び出し
- MIR JSON → .o生成 → EXE化の導線確立
- 凍結EXEhako-frozen-v1.exe作成の準備完了
---
## ✅ Goal Line受け入れ基準/DoD
### 1⃣ 機能extern_c
#### 構文受理
- [x] `extern_c "symbol"(args)` 構文を受理AST: ExternCCall
- [x] MIRは統一経路Call + Callee::Extern("ffi.dynamic.symbol")
- [ ] VMは動的FFIを実装0/1/2引数、CString→i64、Fail-Fast
- [ ] 既定はDeny最小ホワイトリスト: getpid/strlen/system
#### 実行モデル
```hakorune
// 基本形
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
}
}
```
### 2⃣ 設定ベース許可
#### ENV変数
- [ ] `HAKO_FFI_ALLOW_LIST=foo,bar` - 既定に追加マージ
- [ ] `HAKO_FFI_ALLOW_ALL=1` - Dev専用CI不可
#### TOML設定
- [ ] `hako.toml` または `nyash.toml``[ffi.dynamic]`
- [ ] `allow = ["symbol1", "symbol2"]` をマージ
#### 優先順位
```
1. 既定ホワイトリストgetpid/strlen/system
2. TOML設定hako.toml, nyash.toml
3. ENV変数HAKO_FFI_ALLOW_LIST
4. Dev許可HAKO_FFI_ALLOW_ALL=1← CI不可
```
### 3⃣ バックエンドプラグインC ABI
#### ビルド
- [ ] cdylib: `libs/llvm_backend` をビルド可能
- [ ] `cargo build -p llvm_backend` でlibllvm_backend.so生成
#### シンボル
```c
// C ABI
extern "C" {
int64_t llvm_compile_mir_to_object(
const char* mir_json,
const char* output_path
);
// 戻り値: 0=成功, -1=失敗
}
```
#### VM側探索対応
- [ ] lib探索パス実装
- `target/release/`
- `$NYASH_ROOT/target/release/`
- カレントディレクトリ
- `$HAKO_FFI_LIB_PATHS` (コロン区切り)
### 4⃣ AOT導線最小⭐⭐⭐
#### MIR JSON出力
```bash
# Step 1: MIR JSON生成
./hako --backend mir --emit-mir-json program.mir.json program.hako
# Step 2: extern_c経由で .o 生成
./hako tools/aot/emit_object_via_extern_c.hako program.mir.json program.o
# Step 3: clangでリンク
clang program.o -o program.exe libhakorune_kernel.a
```
#### 補助スクリプト
- [ ] `tools/aot/emit_object_via_extern_c.sh <mir.json> <out.o>`
- [ ] `tools/aot/link_exe.sh <program.o> <out.exe>`
### 5⃣ ドキュメント
- [ ] `docs/reference/language/extern_c.md` - 構文/許可モデル/探索/優先順位
- [ ] `docs/guides/frozen-toolchain.md` - MIR JSON→.o→リンクのクイックレシピ
- [ ] `docs/private/roadmap/phases/phase-15.76/INDEX.md` - Phase概要
- [ ] `docs/private/roadmap/phases/phase-15.76/GUARD_RAILS.md` - 安全性設計
### 6⃣ スモーク(軽量・観測)
#### quick-selfhost プロファイル
- [ ] `extern_c_strlen_vm.sh` - 基本動作(緑)
- [ ] `extern_c_getpid_vm.sh` - システムコール(緑)
- [ ] `extern_c_system_vm.sh` - コマンド実行(緑)
- [ ] `extern_c_env_allowlist_getppid_vm.sh` - ENV許可
- [ ] `extern_c_deny_unknown_vm.sh` - Deny確認
#### ランナー正規化
- [ ] 出力が `OK` / `[PASS]` なら exit 0集計の安定化
---
## ❌ Out of Scopeこのフェーズではやらない
### リンクの内蔵
- `extern_c "link_exe"(...)` 等の内蔵リンカーは次フェーズ候補
- 理由: clang/lldを外部依存で十分、スコープ拡大回避
### 凍結EXEの確定配布
- タグ付けv1.0.0-frozen
- 配布物生成tar.gz/zip
- 理由: AOT導線が安定してから安全に実施
### 複雑なFFI
- 構造体渡し/可変長引数は次フェーズ以降
- 理由: 最小導線確立を優先
---
## 🚀 次フェーズ開始条件15.77/凍結へ)
### 必須条件
1. **AOTルート再現可能**: MIR JSON→.o→EXEの手順がdocs通りに動作
2. **libs/llvm_backend ビルド緑**: 最低LinuxUbuntu/WSLで安定
3. **allowlist/TOML運用ガイド完成**: セキュリティポリシーが明確
### 推奨条件
4. スモークテスト全緑extern_c関連
5. 既存quick-selfhostへの影響なし170 PASS維持
---
## ⚠️ リスク & 対策
### リスク1: FFI拡大の安全性
**対策**: 既定Deny + ENV/TOMLは追加のみFail-Fast
### リスク2: 環境差lib探索/リンク)
**対策**: 検索パスENV + 手順をdocsに固定、疑問はスクリプトで補助
### リスク3: LLVM Backend依存
**対策**: プラグイン化により差し替え容易(セキュリティ境界明確)
---
## 📊 進捗管理
### Week 12025-10-14 - 10-18
- [ ] extern_c構文実装Parser→AST→MIR
- [ ] VM動的FFI基盤0/1/2引数対応
- [ ] 既定ホワイトリスト実装
### Week 22025-10-19 - 10-25
- [ ] ENV/TOML許可機構
- [ ] libs/llvm_backend プラグイン化
- [ ] lib探索パス実装
### Week 32025-10-26 - 11-01
- [ ] AOT導線整備MIR JSON→.o→EXE
- [ ] 補助スクリプト作成
- [ ] ドキュメント完成
### Week 42025-11-02 - 11-08
- [ ] スモークテスト追加
- [ ] 統合テストquick-selfhost
- [ ] レビュー・調整
---
## 🎯 このラインで締めると...
**「凍結EXEを作るための背骨extern_c + .o生成」が整う**
→ Rustラインを凍結しても日常開発が回る
→ Hakoruneパーサーのみ開発2重メンテ回避
→ 安全な試行錯誤凍結EXEで戻れる
---
**作成日**: 2025-10-14
**ChatGPT Goal Line採用**: 2025-10-14
**関連**: Phase 15.76, extern_c戦略, 凍結EXE背骨

View File

@ -0,0 +1,198 @@
# Phase 15.76 - extern_c & Frozen Toolchain
**期間**: 2025-10-14 - 2025-11-084週間
**状態**: 🚧 計画中ChatGPT実装開始準備
---
## 🎯 このフェーズで実現すること
**extern_c構文 + 凍結EXEhako-frozen-v1.exeの背骨確立**
1. **extern_c構文**: HakoruneからC関数を直接呼び出しRust `extern "C"` 相当)
2. **LLVM Backendプラグイン化**: C ABI経由で.o生成
3. **AOT導線確立**: MIR JSON → .o → EXE
4. **凍結EXE準備**: Rust層を凍結しても日常開発が回る
---
## 💡 発見の経緯2025-10-14
**Usertomoakiの直感**:
> 「HakoruneからC ABIを呼びたい」
> → 「あ、Rustもやってる`extern "C"`」
> → 「じゃあHakoruneでも`extern_c`構文を!」
**結果**: 業界標準パターンRust stage0, Go 1.4 frozenへの独自収束 ⭐論文価値
---
## 📁 ドキュメント
### 🎯 必読
- **[INDEX.md](INDEX.md)** - Phase全体像・実装の流れ
- **[MILESTONE.md](MILESTONE.md)** ⭐最重要 - ゴールラインDoD
- **[GUARD_RAILS.md](GUARD_RAILS.md)** - セキュリティ設計
### 📚 設計資料
- **[BUILTIN_VS_PLUGIN_DESIGN.md](BUILTIN_VS_PLUGIN_DESIGN.md)** - 内蔵 vs プラグイン方針
---
## 🚀 クイックスタート(実装後)
### 基本的なextern_c呼び出し
```hakorune
// プロセスID取得
static box SystemInfo {
get_pid() -> IntegerBox {
local pid = extern_c "getpid"()
return pid
}
}
```
### LLVM Backendプラグイン呼び出し
```hakorune
// MIR JSON → .o 生成
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
}
}
```
### AOT導線
```bash
# Step 1: MIR JSON生成
./hako --backend mir --emit-mir-json program.mir.json program.hako
# Step 2: .o生成
./hako compiler_wrapper.hako program.mir.json program.o
# Step 3: リンク
clang program.o -o program.exe libhakorune_kernel.a
```
---
## 🔒 セキュリティ
### 既定Deny + Allowlist
```toml
# hako.toml
[ffi.dynamic]
allow = [
"getpid", # 既定
"strlen", # 既定
"system", # 既定
"getppid", # 追加
]
```
### 開発時のみ全許可CI不可
```bash
HAKO_FFI_ALLOW_ALL=1 ./hako program.hako # ⚠️ Dev only
```
詳細: [GUARD_RAILS.md](GUARD_RAILS.md)
---
## 📊 進捗Week 1-4
### Week 12025-10-14 - 10-18
- [ ] extern_c構文実装Parser→AST→MIR
- [ ] VM動的FFI基盤0/1/2引数対応
- [ ] 既定ホワイトリスト実装
### Week 22025-10-19 - 10-25
- [ ] ENV/TOML許可機構
- [ ] libs/llvm_backend プラグイン化
- [ ] lib探索パス実装
### Week 32025-10-26 - 11-01
- [ ] AOT導線整備MIR JSON→.o→EXE
- [ ] 補助スクリプト作成
- [ ] ドキュメント完成
### Week 42025-11-02 - 11-08
- [ ] スモークテスト追加
- [ ] 統合テストquick-selfhost
- [ ] レビュー・調整
詳細: [MILESTONE.md](MILESTONE.md)
---
## 🎯 成功基準
### 必須DoD
1. ✅ extern_c構文が動作getpid/strlen/system
2. ✅ libs/llvm_backend プラグイン化完了
3. ✅ AOT導線再現可能MIR JSON→.o→EXE
4. ✅ allowlist/TOML運用ガイド完成
### 推奨
5. ✅ スモークテスト全緑extern_c関連
6. ✅ 既存テスト影響なし170 PASS維持
---
## 🚀 次のフェーズPhase 15.77/凍結へ)
### 開始条件
- AOTルートが安定稼働
- libs/llvm_backend ビルド緑Linux
- セキュリティ運用ガイド完成
### Phase 15.77 目標
- **凍結EXE確定**: hako-frozen-v1.exe タグ付け・配布
- **Rust層最小化**: 100-200行VM実行エンジンのみ
- **脱Rust加速**: Hakoruneパーサーのみ開発
---
## 📚 関連リソース
### 前フェーズ
- [Phase 15.75 - 脱Rust大作戦](../phase-15.75/)
- [Phase 15.78 - Frozen UX Polish & Parity](../phase-15.78/)
- [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 frozenbootstrap用
- **OCaml**: ocamlc frozen自己ホスト用
---
## 💬 質問・議論
### ChatGPTと相談
このフェーズはChatGPTが主導で実装予定。設計判断はChatGPT↔tomoaki↔Claude三者で合意形成。
### Claudeのレビュー担当
- コード品質チェック
- セキュリティレビュー
- ドキュメント整備
---
**作成日**: 2025-10-14
**実装開始**: ChatGPT2025-10-14 Stage 4完了後
**レビュー**: Claude実装後

View File

@ -0,0 +1,27 @@
# Phase 15.76 — TODOextern_c / SelfHost Bootstrap
短期Week 1 — extern_c MVPVMのみ
- [ ] Parser: `extern_c "name" (args)` 構文を AST に追加
- [ ] MIR Builder: `extern_call``interface="ffi.dynamic"` を発行
- [ ] VM: `call_dynamic_ffi()` 実装0/1/2 引数・i64 返り)+ ホワイトリスト
- [ ] スモーク3本: getpid()/strlen()/system() の最小動作
短期Week 2 — ネイティブライブラリ
- [ ] `libs/llvm_backend/` 雛形+ C API`llvm_compile_mir_to_object`
- [ ] Python llvmlite ハーネス呼び出し連携
- [ ] スモーク: MIR JSON → .o戻り 0
短期Week 3 — LLVM AOT
- [ ] llvmlite ビルダーの `ffi.dynamic` 対応declare/call
- [ ] `.hako -> mir.json -> .o -> exe` を 1 ケース通す
- [ ] パリティVM/AOT
短期Week 4 — SelfHost 最小統合
- [ ] apps/selfhost/compiler.hako最小: 1ファイル .o 化→clang link 実行
- [ ] スモーク: selfhost mini パイプラインoptin
参照
- 戦略(全体像): ../phase-15.75/stage-4-chatgpt/EXTERN_C_SELFHOST_STRATEGY.md
- CABI最小: ../phase-15.75/stage-4-chatgpt/C_ABI_MIN_SPEC.md
- 統合方針Claude: ../phase-15.75/stage-4-chatgpt/INTEGRATION_STRATEGY_CLAUDE.md
- Stage4CABIハーネス: ../phase-15.75/stage-4-chatgpt/INDEX.md