# Python Native実装例

## 🎯 実装イメージ

### 使用例1: 基本的な関数のネイティブ化

```nyash
// example1_basic.hako
// Pythonコードをネイティブコンパイル

// Step 1: Pythonコードを用意
code = """
def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

def factorial(n):
    if n == 0:
        return 1
    return n * factorial(n-1)
"""

// Step 2: パース
parser = new PythonParserBox()
ast = parser.parse(code)
print("Parsed functions: " + parser.getStats().get("functions"))

// Step 3: コンパイル
compiler = new PythonCompilerBox()
mir_module = compiler.compile(ast)

// Step 4: 実行
if mir_module.isOk() {
    // ネイティブ実行！
    module = mir_module.get()
    
    // 関数を取得して実行
    fib = module.getFunction("fibonacci")
    result = fib.call(10)
    print("fibonacci(10) = " + result)  // 55
    
    fact = module.getFunction("factorial")  
    result = fact.call(5)
    print("factorial(5) = " + result)   // 120
} else {
    print("Compilation failed: " + mir_module.getError())
}
```

### 使用例2: コンパイル可否の明確な判定

```nyash
// example2_clear_separation.hako
// コンパイルできるかどうか事前に判定

// Phase 1対応のコード
code_phase1 = """
def compute_sum(n):
    total = 0
    for i in range(n):
        total += i * i
    return total

def factorial(n):
    if n == 0:
        return 1
    return n * factorial(n-1)
"""

// Phase 1未対応のコード
code_unsupported = """
def fibonacci_generator(n):
    a, b = 0, 1
    for _ in range(n):
        yield a
        a, b = b, a + b
"""

// コンパイラーで判定
parser = new PythonParserBox()
compiler = new PythonCompilerBox()

// Phase 1対応コードのチェック
ast1 = parser.parse(code_phase1)
result1 = compiler.compile(ast1)
if result1.isOk() {
    print("✅ Phase 1 code compiled successfully!")
    module = result1.get()
    print("compute_sum(100) = " + module.call("compute_sum", 100))
} else {
    print("❌ Compilation failed: " + result1.getError())
}

// 未対応コードのチェック
ast2 = parser.parse(code_unsupported)
result2 = compiler.compile(ast2)
if result2.isOk() {
    print("✅ Compiled successfully!")
} else {
    print("❌ Cannot compile: " + result2.getError())
    print("   Reason: yield expression not supported in Phase 1")
    print("   Please use PyRuntimeBox instead")
}
```

### 使用例3: プログレッシブ最適化

```nyash
// example3_progressive.hako
// 実行しながら徐々に最適化

// 型推論付きコンパイラー
compiler = new PythonCompilerBox()
compiler.enableTypeInference(true)
compiler.enableProfiling(true)

// 初回実行（型情報収集）
code = """
def matrix_multiply(A, B):
    # 最初は型が不明
    result = []
    for i in range(len(A)):
        row = []
        for j in range(len(B[0])):
            sum = 0
            for k in range(len(B)):
                sum += A[i][k] * B[k][j]
            row.append(sum)
        result.append(row)
    return result
"""

// プロファイル付き実行
for i in range(5) {
    mir = compiler.compile(parser.parse(code))
    
    // 実行してプロファイル収集
    module = mir.get()
    A = [[1, 2], [3, 4]]
    B = [[5, 6], [7, 8]]
    result = module.call("matrix_multiply", A, B)
    
    // 型情報が蓄積される
    print("Iteration " + i + ": ")
    print("  Type confidence: " + compiler.getTypeConfidence())
    print("  Optimization level: " + compiler.getOptimizationLevel())
}

// 5回実行後、完全に最適化されたコードが生成される
```

### 使用例4: 言語間相互運用

```nyash
// example4_interop.hako  
// PythonコードとNyashコードのシームレスな連携

// Pythonで数値計算関数を定義
python_math = """
import math

def distance(x1, y1, x2, y2):
    return math.sqrt((x2-x1)**2 + (y2-y1)**2)

def normalize(vector):
    magnitude = math.sqrt(sum(x**2 for x in vector))
    return [x/magnitude for x in vector]
"""

// コンパイルしてNyashから使用
module = compile_python(python_math)

// Nyash側のゲームロジック
box GameObject {
    init { x, y, vx, vy }
    
    update(dt) {
        // Python関数をネイティブ速度で呼び出し
        me.x = me.x + me.vx * dt
        me.y = me.y + me.vy * dt
        
        // 正規化（Pythonの関数を使用）
        local normalized = module.normalize([me.vx, me.vy])
        me.vx = normalized[0]
        me.vy = normalized[1]
    }
    
    distanceTo(other) {
        // Pythonの距離計算関数を使用
        return module.distance(me.x, me.y, other.x, other.y)
    }
}

// 完全にネイティブコードとして実行される！
```

### 使用例5: デバッグとプロファイリング

```nyash
// example5_debug.hako
// 開発時のデバッグ支援

// デバッグモード有効
parser = new PythonParserBox()
parser.enableDebug(true)

compiler = new PythonCompilerBox()
compiler.enableDebug(true)
compiler.enableSourceMap(true)  // 元のPythonコードへのマッピング

problematic_code = """
def buggy_function(items):
    total = 0
    for item in items:
        # バグ: itemが文字列の場合エラー
        total += item * 2
    return total / len(items)
"""

// コンパイル試行
result = compiler.compile(parser.parse(problematic_code))

if result.isErr() {
    // 詳細なエラー情報
    diag = compiler.getDiagnostics()
    print("Compilation failed at line " + diag.line)
    print("Issue: " + diag.message)
    print("Suggestion: " + diag.suggestion)
    
    // フォールバックで実行してランタイムエラーを確認
    runtime = new PythonRuntimeBox()
    try {
        runtime.exec(problematic_code)
        runtime.call("buggy_function", ["a", "b", "c"])
    } catch (e) {
        print("Runtime error: " + e.message)
        print("This would have been caught at compile time!")
    }
}

// プロファイリング情報
profiler = new PythonProfiler()
profiler.attach(module)
profiler.run()

print("Hot spots:")
print(profiler.getHotSpots())
print("Type instability:")
print(profiler.getTypeInstability())
```

## 🎯 実装の進化

### Phase 1（現在）
```python
# これらがネイティブ化可能
def add(x, y): return x + y
def factorial(n): ...
def fibonacci(n): ...
```

### Phase 2（予定）
```python
# 特殊メソッド対応
class Vector:
    def __add__(self, other): ...
    def __len__(self): ...
    
# 内包表記
squares = [x**2 for x in range(10)]
```

### Phase 3（将来）
```python
# 完全な言語機能
async def fetch_data(): ...
@decorator
def enhanced_function(): ...
yield from generator
```

## 🚀 パフォーマンス期待値

```
Benchmark: Fibonacci(30)
CPython:     1.234s
PyPy:        0.123s  
Nyash Native: 0.012s  (100x faster!)

Benchmark: Matrix Multiplication (100x100)
CPython:     5.678s
NumPy:       0.234s
Nyash Native: 0.198s  (NumPyに匹敵!)
```