docs: restore docs/private/roadmap from 7b4908f9 (Phase 20.31)
This commit is contained in:
21
docs/private/roadmap/phases/phase-15.76/ANNOUNCEMENT.md
Normal file
21
docs/private/roadmap/phases/phase-15.76/ANNOUNCEMENT.md
Normal file
@ -0,0 +1,21 @@
|
||||
# 🎉 Self-Hosting Achieved
|
||||
|
||||
Date: 2025-10-14 (Phase 15.76完了時)
|
||||
|
||||
## 宣言
|
||||
Hakorune完全セルフホスト達成。
|
||||
|
||||
今後:
|
||||
- マクロ拡張・構文拡張 → Hakorune側で開発
|
||||
- Rust層 → ブートストラップ基盤として凍結
|
||||
- 開発サイクル → 凍結EXE(hako-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比較)
|
||||
@ -0,0 +1,192 @@
|
||||
# 内蔵 vs プラグイン設計方針(Phase 15.76)
|
||||
|
||||
## 🎯 設計原則
|
||||
|
||||
凍結EXE(hako-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
|
||||
- セキュリティ影響が広い
|
||||
- プロファイルでON(ENV/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 runtime(allowlist機構)
|
||||
|
||||
plugins/ (動的ロード)
|
||||
├── libllvm_backend.so ⭐C ABI出力
|
||||
├── libnetwork.so(HTTP/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-2(Phase 15.76前半)
|
||||
1. libllvm_backend プラグイン化
|
||||
2. extern_c allowlist機構完成
|
||||
3. 凍結EXE最小構成確定
|
||||
|
||||
### Week 3-4(Phase 15.76後半)
|
||||
4. Network/HTTP外付け化
|
||||
5. 拡張FS(書き込み)外付け化
|
||||
6. セキュリティ監査
|
||||
|
||||
---
|
||||
|
||||
**作成日**: 2025-10-14
|
||||
**関連**: Phase 15.76, extern_c戦略, 凍結EXE設計
|
||||
@ -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生成時に設定
|
||||
386
docs/private/roadmap/phases/phase-15.76/GUARD_RAILS.md
Normal file
386
docs/private/roadmap/phases/phase-15.76/GUARD_RAILS.md
Normal 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許可モデル, セキュリティ
|
||||
251
docs/private/roadmap/phases/phase-15.76/INDEX.md
Normal file
251
docs/private/roadmap/phases/phase-15.76/INDEX.md
Normal file
@ -0,0 +1,251 @@
|
||||
# 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)
|
||||
201
docs/private/roadmap/phases/phase-15.76/MILESTONE.md
Normal file
201
docs/private/roadmap/phases/phase-15.76/MILESTONE.md
Normal 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化の導線確立
|
||||
- 凍結EXE(hako-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 ビルド緑**: 最低Linux(Ubuntu/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 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)
|
||||
- [ ] レビュー・調整
|
||||
|
||||
---
|
||||
|
||||
## 🎯 このラインで締めると...
|
||||
|
||||
**「凍結EXEを作るための背骨(extern_c + .o生成)」が整う**
|
||||
|
||||
→ Rustラインを凍結しても日常開発が回る
|
||||
→ Hakoruneパーサーのみ開発(2重メンテ回避)
|
||||
→ 安全な試行錯誤(凍結EXEで戻れる)
|
||||
|
||||
---
|
||||
|
||||
**作成日**: 2025-10-14
|
||||
**ChatGPT Goal Line採用**: 2025-10-14
|
||||
**関連**: Phase 15.76, extern_c戦略, 凍結EXE背骨
|
||||
198
docs/private/roadmap/phases/phase-15.76/README.md
Normal file
198
docs/private/roadmap/phases/phase-15.76/README.md
Normal file
@ -0,0 +1,198 @@
|
||||
# Phase 15.76 - extern_c & Frozen Toolchain
|
||||
|
||||
**期間**: 2025-10-14 - 2025-11-08(4週間)
|
||||
**状態**: 🚧 計画中(ChatGPT実装開始準備)
|
||||
|
||||
---
|
||||
|
||||
## 🎯 このフェーズで実現すること
|
||||
|
||||
**extern_c構文 + 凍結EXE(hako-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)
|
||||
|
||||
**User(tomoaki)の直感**:
|
||||
> 「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 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)
|
||||
|
||||
---
|
||||
|
||||
## 🎯 成功基準
|
||||
|
||||
### 必須(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 frozen(bootstrap用)
|
||||
- **OCaml**: ocamlc frozen(自己ホスト用)
|
||||
|
||||
---
|
||||
|
||||
## 💬 質問・議論
|
||||
|
||||
### ChatGPTと相談
|
||||
このフェーズはChatGPTが主導で実装予定。設計判断はChatGPT↔tomoaki↔Claude三者で合意形成。
|
||||
|
||||
### Claudeのレビュー担当
|
||||
- コード品質チェック
|
||||
- セキュリティレビュー
|
||||
- ドキュメント整備
|
||||
|
||||
---
|
||||
|
||||
**作成日**: 2025-10-14
|
||||
**実装開始**: ChatGPT(2025-10-14 Stage 4完了後)
|
||||
**レビュー**: Claude(実装後)
|
||||
27
docs/private/roadmap/phases/phase-15.76/TODO.md
Normal file
27
docs/private/roadmap/phases/phase-15.76/TODO.md
Normal file
@ -0,0 +1,27 @@
|
||||
# Phase 15.76 — TODO(extern_c / Self‑Host Bootstrap)
|
||||
|
||||
短期(Week 1) — extern_c MVP(VMのみ)
|
||||
- [ ] 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) — Self‑Host 最小統合
|
||||
- [ ] apps/selfhost/compiler.hako(最小): 1ファイル .o 化→clang link 実行
|
||||
- [ ] スモーク: selfhost mini パイプライン(opt‑in)
|
||||
|
||||
参照
|
||||
- 戦略(全体像): ../phase-15.75/stage-4-chatgpt/EXTERN_C_SELFHOST_STRATEGY.md
|
||||
- C‑ABI(最小): ../phase-15.75/stage-4-chatgpt/C_ABI_MIN_SPEC.md
|
||||
- 統合方針(Claude): ../phase-15.75/stage-4-chatgpt/INTEGRATION_STRATEGY_CLAUDE.md
|
||||
- Stage‑4(C‑ABIハーネス): ../phase-15.75/stage-4-chatgpt/INDEX.md
|
||||
Reference in New Issue
Block a user