Files
hakorune/src/llvm_py
nyash-codex 419214a5a9 feat(naming): Python NamingHelper実装 - Rust NamingBoxのミラー完成
Phase 25.4 メンテナンス: Python LLVM側のNamingBox SSOT統一

## 📦 実装内容

### 1. Python NamingHelper作成
- 新規作成: `src/llvm_py/naming_helper.py`
- Rust `src/mir/naming.rs` と完全同一の意味論を実装
- 3つの関数:
  - `encode_static_method(box_name, method, arity)` → "BoxName.method/arity"
  - `canonical_box_name(raw)` → "main" → "Main"
  - `normalize_static_global_name(func_name)` → "main._nop/0" → "Main._nop/0"
- doctest 9個全てPASS 

### 2. Python LLVM側の統一修正
- `instructions/boxcall.py:437` - f"Main.{method_name}/{arity}" → encode_static_method()
- `instructions/call.py:170-173` - traced_names タプル生成をNamingHelper経由に変更
- `pyvm/intrinsic.py:17, 50` - "Main.esc_json/1", "Main.dirname/1" → encode_static_method()
- `builders/entry.py:16` - 'Main.main/1' → encode_static_method("Main", "main", 1)

## 🎯 技術的成果
- **意味論一致**: Rust ↔ Python で完全同一の命名規則
- **保守性向上**: ハードコード4箇所 → NamingHelper一元管理
- **テスト完備**: doctest 9個でRust NamingBoxと同一動作を保証

## テスト結果
 python3 -m py_compile: 全ファイル構文OK
 python3 -m doctest naming_helper.py: 9 tests passed

## 参考
- Phase 25.4-A (Rust側): fa9cea51, bceb20ed
- Rust NamingBox SSOT: src/mir/naming.rs

🎉 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-21 09:38:49 +09:00
..

LLVM Python Backend (Experimental)

📝 概要

Rust/inkwellの複雑性を回避し、llvmliteを使ってシンプルに実装する実験的バックエンド。 ChatGPTが設計したdocs/development/design/legacy/LLVM_LAYER_OVERVIEW.mdの設計原則に従う。

🎯 目的

  1. 検証ハーネス - PHI/SSA構造の高速検証
  2. プロトタイプ - 新機能の迅速な試作
  3. 教育的価値 - シンプルで理解しやすい実装
  4. バックアップ - Rustが詰まった時の代替案

📂 構造

llvm_py/
├── README.md                  # このファイル
├── llvm_builder.py            # メインのLLVM IR生成パスのオーケストレーション
├── mir_reader.py              # MIR(JSON) ローダ
├── resolver.py                # 値解決SSA/PHIの局所化とキャッシュ
├── utils/
│   └── values.py              # 同一ブロック優先の解決などの共通ポリシー
├── cfg/
│   └── utils.py               # CFG ビルドpred/succ
├── prepass/
│   ├── loops.py               # ループ検出while 形)
│   └── if_merge.py            # if-mergeret-merge前処理PHI前宣言プラン
├── instructions/
│   ├── controlflow/
│   │   ├── branch.py          # 条件分岐
│   │   ├── jump.py            # 無条件ジャンプ
│   │   └── while_.py          # 通常の while 降下LoopForm 失敗時のフォールバック)
│   ├── binop.py               # 2項演算
│   ├── compare.py             # 比較演算i1生成
│   ├── const.py               # 定数
│   ├── copy.py                # CopyMIR13 PHI-off の合流表現)
│   ├── call.py                # Ny 関数呼び出し
│   ├── boxcall.py             # Box メソッド呼び出し
│   ├── externcall.py          # 外部呼び出し
│   ├── newbox.py              # Box 生成
│   ├── ret.py                 # return 降下if-merge の前宣言PHIを優先
│   ├── typeop.py              # 型変換
│   ├── safepoint.py           # safepoint
│   └── barrier.py             # メモリバリア
└── test_simple.py             # 基本テスト

🚀 使い方

# MIR JSONからオブジェクトファイル生成
python src/llvm_py/llvm_builder.py input.mir.json -o output.o

# 環境変数で切り替え(将来)
NYASH_LLVM_USE_HARNESS=1 ./target/release/nyash program.hako

🔧 開発用フラグ(プリパス/トレース)

  • NYASH_LLVM_USE_HARNESS=1 … Rust 実行から llvmlite ハーネスへ委譲
  • NYASH_LLVM_PREPASS_LOOP=1 … ループ検出プリパスONwhile 形を構造化)
  • NYASH_LLVM_PREPASS_IFMERGE=1 … if-mergeret-mergeプリパスONret値 PHI を前宣言)
  • NYASH_LLVM_TRACE_PHI=1 … PHI 配線と end-of-block 解決の詳細トレース
  • NYASH_CLI_VERBOSE=1 … 降下やスナップショットの詳細ログ
  • NYASH_MIR_NO_PHI=1 … MIR13PHI-offを明示既定1
  • NYASH_VERIFY_ALLOW_NO_PHI=1 … PHI-less を検証で許容既定1

📋 設計原則LLVM_LAYER_OVERVIEWに準拠

  1. Resolver-only reads原則: 直接の cross-block vmap 参照は避け、resolver 経由で取得
  2. Localize at block start: ブロック先頭で PHI を作るif-merge は prepass で前宣言)
  3. Sealed SSA: ブロック末 snapshot を用いた finalize_phis 配線
  4. Builder cursor discipline: 生成位置の厳格化terminator 後に emit しない)

🎨 実装状況

  • 基本構造MIR読み込み
  • ControlFlow 分離branch/jump/while_regular
  • CFG/Prepass 分離cfg/utils.py, prepass/loops.py, prepass/if_merge.py
  • if-mergeret-mergeの PHI 前宣言(ゲート: NYASH_LLVM_PREPASS_IFMERGE=1
  • ループプリパス(ゲート: NYASH_LLVM_PREPASS_LOOP=1
  • 追加命令/Stage-3 の持続的整備

テスト・検証

  • パリティllvmlite vs PyVM。既定は終了コードのみ比較
    • ./tools/pyvm_vs_llvmlite.sh apps/tests/ternary_nested.hako
    • 代表例(プリパス有効):
      • NYASH_LLVM_PREPASS_IFMERGE=1 ./tools/pyvm_vs_llvmlite.sh apps/tests/ternary_nested.hako
      • NYASH_LLVM_PREPASS_LOOP=1 ./tools/pyvm_vs_llvmlite.sh apps/tests/loop_if_phi.hako
  • 厳密比較(標準出力+終了コード)
    • CMP_STRICT=1 ./tools/pyvm_vs_llvmlite.sh <file.hako>
  • まとまったスモークPHI-off 既定)
    • tools/smokes/curated_llvm.sh
    • PHI-on 検証(実験的): tools/smokes/curated_llvm.sh --phi-on

📊 予想行数

  • 全体: 800-1000行
  • コア実装: 300-400行

「簡単最高」の精神を体現!