Files
hakorune/docs/private/roadmap/phases/phase-15.76/MILESTONE.md

5.8 KiB
Raw Blame History

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

構文受理

  • extern_c "symbol"(args) 構文を受理AST: ExternCCall
  • MIRは統一経路Call + Callee::Extern("ffi.dynamic.symbol")
  • VMは動的FFIを実装0/1/2引数、CString→i64、Fail-Fast
  • 既定はDeny最小ホワイトリスト: getpid/strlen/system

実行モデル

// 基本形
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 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出力

# 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運用ガイド完成: セキュリティポリシーが明確

推奨条件

  1. スモークテスト全緑extern_c関連
  2. 既存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背骨