Phase 20.20 — C ABI Export via LLVM(設計・計画)
目的
- Hakorune スクリプトから LLVM(llvmlite)を用いて C ABI 互換の関数をエクスポートできる最小ラインを構築する。
- Rust 層の一部(AOT/エクスポート境界)を置き換え可能な薄い導線を用意し、段階的に Rust 依存を薄くする。
スコープ(段階導入)
- 短期(Phase 20.20): プリミティブ型(i64/i32)限定の純関数エクスポート。
@extern_c("c_symbol")注釈を MIR JSON へ反映。- llvmlite で C calling convention(ccc)・unmangled symbol・visibility を設定したラッパー関数を生成。
- C ヘッダー自動生成(extern "C"、stdint.h 依存、最小プロトタイプ)。
- 中期(次フェーズ): String(const char* readonly)、Array(ptr+len 構造体)の読み出しサポート。
- 長期: Box ABI(Arc/RefCell 相当)と GC 連携(高リスク。段階的に)
進捗(2025‑10‑30, M2 到達)
- Python/llvmlite ビルダーに C‑ABI ラッパ生成を実装(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)
- MIR(JSON) 例(v1):
非対象(このフェーズ)
- メモリ管理(自動管理)
- 参照循環/所有権を跨いだ複雑な Box ABI
- 既存 CLI/VM ラインの既定挙動変更(すべて既定 OFF の新フラグでガード)
設計原則
- Box‑First(境界を箱化): C ABI 層は
src/llvm_py/abi/(純粋ツール)に隔離。VM/Runner へ依存しない。 - Fail‑Fast: 型不一致や未対応は 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)