Files
hakorune/docs/private/roadmap/phases/phase-20.20

Phase 20.20 — C ABI Export via LLVM設計・計画

目的

  • Hakorune スクリプトから LLVMllvmliteを用いて C ABI 互換の関数をエクスポートできる最小ラインを構築する。
  • Rust 層の一部AOT/エクスポート境界)を置き換え可能な薄い導線を用意し、段階的に Rust 依存を薄くする。

スコープ(段階導入)

  • 短期Phase 20.20: プリミティブ型i64/i32限定の純関数エクスポート。
    • @extern_c("c_symbol") 注釈を MIR JSON へ反映。
    • llvmlite で C calling conventionccc・unmangled symbol・visibility を設定したラッパー関数を生成。
    • C ヘッダー自動生成extern "C"、stdint.h 依存、最小プロトタイプ)。
  • 中期(次フェーズ): Stringconst char* readonly、Arrayptr+len 構造体)の読み出しサポート。
  • 長期: Box ABIArc/RefCell 相当)と GC 連携(高リスク。段階的に)

進捗20251030, M2 到達)

  • Python/llvmlite ビルダーに CABI ラッパ生成を実装flags.extern_c / metadata.extern_c
    • MIR(JSON) 例v1:
      {
        "schema_version": "1.0",
        "functions": [
          { "name": "add/2",
            "params": [{"name":"a","type":"i64"},{"name":"b","type":"i64"}],
            "blocks": [],
            "flags": { "extern_c": "hako_add" }
          }
        ]
      }
      
    • 生成IR: define i64 @hako_add(i64,i64) が挿入され、内部 @"add/2" を呼び出す
    • 使い方: python3 tools/llvmlite_harness.py --in mir.json --emit-ll out.ll(または --out out.o

非対象(このフェーズ)

  • メモリ管理(自動管理)
  • 参照循環/所有権を跨いだ複雑な Box ABI
  • 既存 CLI/VM ラインの既定挙動変更(すべて既定 OFF の新フラグでガード)

設計原則

  • BoxFirst境界を箱化: C ABI 層は src/llvm_py/abi/純粋ツールに隔離。VM/Runner へ依存しない。
  • FailFast: 型不一致や未対応は IR 生成前にエラーメッセージで停止。
  • ENV 最小: 既定は CLI フラグ優先。ENV は開発支援の短命 TTL のみ。

受け入れ基準MVP

  • @extern_c("hako_add") を付与した i64 加算関数が .o.h に出力され、C からリンクして実行可能。
  • Linux/Mac/Win いずれか 1 プラットフォームで visibility/dllexport 設定に問題がない(警告なし)。
  • MIR 注釈 → IR ラッパ生成 → ヘッダー生成の一貫性SSOTを満たす。

関連ドキュメント(起票予定)

  • docs/development/abi/README.md — C ABI 全体設計・制約
  • docs/development/abi/types.md — MIR 型→C 型マッピングSSOT