Files
hakorune/docs/development/roadmap/phases/phase-10.7/implementation.md
Moe Charm c13d9c045e 📚 Phase 12: Nyashスクリプトプラグインシステム設計と埋め込みVM構想
## 主な成果
- Nyashスクリプトでプラグイン作成可能という革命的発見
- C ABI制約の分析と埋め込みVMによる解決策
- MIR/VM/JIT層での箱引数サポートの詳細分析

## ドキュメント作成
- Phase 12基本構想(README.md)
- Gemini/Codex先生の技術分析
- C ABIとの整合性問題と解決策
- 埋め込みVM実装ロードマップ
- 箱引数サポートの技術詳細

## 重要な洞察
- 制約は「リンク時にC ABI必要」のみ
- 埋め込みVMでMIRバイトコード実行により解決可能
- Nyashスクリプト→C ABIプラグイン変換が実現可能

Everything is Box → Everything is Plugin → Everything is Possible!
2025-08-30 22:52:16 +09:00

4.8 KiB
Raw Blame History

Phase 10.7 実装詳細

🛠️ 技術アーキテクチャ

2段階変換パイプライン

Python AST → CorePy IR → Nyash AST → Nyashスクリプト

CorePy IRの役割:

  • Pythonの複雑な構文を正規化
  • セマンティクスを明示的にwith→try/finally等
  • 最適化しやすい中間表現

実装構造

// plugins/nyash-python-parser-plugin/src/lib.rs
#[plugin_box]
pub struct PythonParserBox {
    base: BoxBase,
}

#[plugin_methods]
impl PythonParserBox {
    pub fn parse(&self, code: &str) -> Result<Box<dyn NyashBox>> {
        Python::with_gil(|py| {
            let ast_mod = py.import("ast")?;
            let tree = ast_mod.call_method1("parse", (code,))?;
            Ok(self.convert_ast(tree)?)
        })
    }
}

📐 Python固有機能の実装戦略

1. デフォルト引数の罠

# Python: 定義時に一度だけ評価
def bad_default(lst=[]):
    lst.append(1)
    return lst
// 生成されるNyash
box GeneratedModule {
    init { _default_lst }
    
    constructor() {
        me._default_lst = new ArrayBox()  // 定義時に一度だけ
    }
    
    bad_default(lst) {
        if lst == null {
            lst = me._default_lst  // 同じインスタンスを再利用!
        }
        lst.append(1)
        return lst
    }
}

2. LEGB スコーピング

# Local → Enclosing → Global → Builtin
global_var = 1
def outer():
    enclosing_var = 2
    def inner():
        local_var = 3

実装:

  • シンボルテーブルでスコープ管理
  • クロージャはBox/Cellで実装
  • global/nonlocalフラグを追跡

3. for/else, while/else

for i in range(10):
    if i == 5:
        break
else:
    print("No break")
// 生成されるNyash
local _broken = false
local _iter = py_iter(range(10))
loop(true) {
    local _next = py_next(_iter)
    if _next.isStopIteration() { break }
    local i = _next.value
    
    if i == 5 {
        _broken = true
        break
    }
}
if not _broken {
    print("No break")
}

🔧 パスパイプライン

Parse Python AST
    ↓
Symbol table analysis
    ↓
Normalize to CorePy IR
    ↓
Scope/closure analysis
    ↓
Type metadata attachment
    ↓
Lower to Nyash AST
    ↓
Peephole optimization
    ↓
Pretty-print + source map

📊 最適化戦略

トランスパイル時の最適化

  • 定数畳み込み
  • ループ不変式の巻き上げ
  • ビルトイン関数の直接呼び出し(シャドウイングなし時)
  • 冗長なpy_truthy()の除去

Nyashコンパイラに委ねる最適化

  • インライン展開
  • レジスタ割り当て
  • ループアンローリング
  • ベクトル化

型情報の活用

def add(x: int, y: int) -> int:
    return x + y

→ 型ヒントがあればpy_binopではなく直接整数演算

🐛 エラー処理とデバッグ

ソースマップ

{
  "version": 3,
  "sources": ["example.py"],
  "mappings": "AAAA,IAAM,CAAC,GAAG...",
  "names": ["add", "x", "y"]
}

デバッグモード

nyash-transpile --debug example.py
# 出力:
# - CorePy IRダンプ
# - Nyashプレビュー元のPython行ヒント付き
# - 変換トレース

エラーメッセージ

ERROR: Cannot compile function 'async_func' at line 10
Reason: async/await not supported in Phase 1
AST Node: AsyncFunctionDef
Suggestion: Use PyRuntimeBox or wait for Phase 3

パフォーマンス最適化

ホットパス識別

// プロファイル情報を活用
if compiler.isHotPath(func) {
    // 積極的な最適化
    result = compiler.optimizeAggressive(func)
} else {
    // 標準的な変換
    result = compiler.compile(func)
}

JIT連携

// 型特化コード生成
@jit_specialize(int, int)
def add(x, y):
    return x + y

🔌 プラグインAPI

変換フック

trait TransformHook {
    fn before_lower(&mut self, node: &CorePyNode);
    fn after_lower(&mut self, node: &NyashNode);
    fn on_function(&mut self, func: &FunctionDef);
}

カスタムルール

# custom_rules.yaml
rules:
  - pattern: "dataclass"
    action: "convert_to_nyash_box"
  - pattern: "numpy.array"
    action: "use_native_array"

📋 実装チェックリスト

Phase 1必須

  • 関数定義def
  • 条件分岐if/elif/else
  • ループfor/while with else
  • 基本演算子
  • 関数呼び出し
  • return/break/continue
  • LEGB スコーピング
  • デフォルト引数

Phase 2拡張

  • 例外処理try/except/finally
  • with文
  • list/dict/set comprehensions
  • lambda式
  • *args, **kwargs

Phase 3高度

  • async/await
  • yield/yield from
  • デコレータ
  • クラス定義(基本)
  • import文