autozig 0.1.2

Safe autogenerated interop between Rust and Zig
Documentation

# Phase 5: WebAssembly 支持设计文档

## 📋 概述

AutoZig Phase 5 引入了完整的 WebAssembly (WASM) 支持,实现了 **Zig + Rust 静态链接到单个 WASM 文件** 的方案。

### 核心目标

- **静态链接**: Zig 编译为 WASM 静态库,与 Rust 合并为一个 `.wasm` 文件
-**零拷贝**: 共享线性内存空间,无数据拷贝开销
-**高性能**: 函数调用开销极低,接近原生性能
-**体积优化**: 针对 WASM 的特殊编译优化

## 🏗️ 架构设计

### 1. 静态链接方案

```
┌─────────────────────────────────────────┐
│  Rust Source (src/lib.rs)               │
│  - autozig! 宏嵌入 Zig 代码              │
│  - wasm-bindgen 暴露 JS 接口             │
└──────────────┬──────────────────────────┘
┌─────────────────────────────────────────┐
│  build.rs (构建时)                       │
│  - autozig_build::build("src")          │
│  - 检测目标: wasm32-unknown-unknown      │
└──────────────┬──────────────────────────┘
┌─────────────────────────────────────────┐
│  AutoZig Engine                          │
│  - 扫描并提取 Zig 代码                   │
│  - 目标映射: wasm32-freestanding         │
└──────────────┬──────────────────────────┘
┌─────────────────────────────────────────┐
│  Zig Compiler                            │
│  zig build-lib generated.zig             │
│    -target wasm32-freestanding           │
│    -static                               │
│    -fno-stack-protector                  │
│    -O ReleaseSmall                       │
│  输出: libautozig.a (WASM 静态库)         │
└──────────────┬──────────────────────────┘
┌─────────────────────────────────────────┐
│  Rust Compiler + LLD Linker              │
│  - 编译 Rust 代码到 WASM                 │
│  - 静态链接 libautozig.a                 │
│  - wasm-bindgen 生成 JS 绑定             │
│  输出: .wasm + .js                       │
└─────────────────────────────────────────┘
```

### 2. 内存模型

```
WASM 线性内存 (Linear Memory)
┌────────────────────────────────────────┐
│  0x0000  │  Rust 堆栈                   │
│  ...     │                              │
│  0x1000  │  Vec<u8> 数据区              │ ← Rust 分配
│          │  [0, 1, 2, ..., 255]         │
│          │   ↑                          │
│          │   │ 零拷贝传递指针            │
│          │   ↓                          │
│          │  Zig 直接读写 (ptr + len)     │ ← Zig 计算
│          │   ↓                          │
│          │  原地修改数据                 │
│          │   ↓                          │
│  ...     │  Rust 回收内存                │ ← Rust 管理
│  0xFFFF  │  内存顶部                     │
└────────────────────────────────────────┘
```

**关键特性:**
- Rust 和 Zig 共享同一线性内存空间
- Rust 负责内存分配和释放
- Zig 只负责计算,不做内存分配
- 指针传递零开销

### 3. 函数调用流程

```javascript
// JavaScript 调用
const imageData = new Uint8Array([...]);
const result = apply_invert(imageData);
```

```
JavaScript
    ↓ (wasm-bindgen)
Rust WASM 函数
    ↓ (FFI, 零开销)
Zig WASM 函数
    ↓ (WASM 指令)
内存操作
```

**调用开销分析:**
- JS → Rust: wasm-bindgen 生成的胶水代码 (~10ns)
- Rust → Zig: 内联函数调用,接近零开销 (~1ns)
- 总开销: < 20ns (相比跨进程 RPC 的 ~1ms)

## 🔧 实现细节

### 1. 目标检测 (engine/src/lib.rs)

```rust
fn rust_to_zig_target(rust_target: &str) -> &str {
    match rust_target {
        // WebAssembly 目标
        "wasm32-unknown-unknown" => "wasm32-freestanding",
        "wasm32-wasi" => "wasm32-wasi",
        // ... 其他目标
        _ => "native",
    }
}
```

**关键点:**
- `wasm32-unknown-unknown`: 无操作系统,纯 freestanding
- `wasm32-wasi`: 带 WASI 系统调用接口

### 2. 编译器适配 (engine/src/zig_compiler.rs)

```rust
pub fn compile_with_target(&self, source: &Path, output_lib: &Path, target: &str) -> Result<()> {
    let is_wasm = target.contains("wasm32");
    
    let mut cmd = Command::new(&self.zig_path);
    cmd.arg("build-lib")
        .arg(source)
        .arg("-static")
        .arg(format!("-femit-bin={}", output_lib.display()))
        .arg("-target")
        .arg(target);

    if is_wasm {
        // WASM 特殊配置
        cmd.arg("-fno-stack-protector")  // 必须:无 OS 栈保护
            .arg("-O").arg("ReleaseSmall"); // 体积优化
    } else {
        // 本地平台配置
        cmd.arg("-fPIC")
            .arg("-lc")
            .arg("-O").arg("ReleaseFast");
    }
    
    // 执行编译
    cmd.status()?;
}
```

**WASM 特殊参数:**

| 参数 | 作用 | 为什么必需 |
|-----|------|-----------|
| `-fno-stack-protector` | 禁用栈保护 | WASM freestanding 环境无 OS 支持 |
| `-O ReleaseSmall` | 体积优化 | 浏览器下载,追求小体积 |
|`-lc` | 不链接 libc | WASM 无标准 C 库 |
|`-fPIC` | 不生成 PIC 代码 | WASM 不需要位置无关代码 |

### 3. Zig 代码限制

**✅ 可以使用:**
```zig
// 基本类型和操作
export fn compute(a: i32, b: i32) i32 {
    return a + b;
}

// 指针操作(零拷贝)
export fn process_buffer(ptr: [*]u8, len: usize) void {
    var i: usize = 0;
    while (i < len) : (i += 1) {
        ptr[i] = ptr[i] * 2;
    }
}

// 数学运算
const std = @import("std");
export fn sin_approx(x: f64) f64 {
    return @sin(x);  // 使用内建函数
}
```

**❌ 不能使用:**
```zig
// ❌ 标准分配器(无 libc)
const allocator = std.heap.c_allocator;
const buffer = try allocator.alloc(u8, 1024);

// ❌ 文件 I/O(无文件系统)
const file = try std.fs.cwd().openFile("test.txt", .{});

// ❌ 线程(WASM 单线程)
const thread = try std.Thread.spawn(.{}, worker, .{});
```

**解决方案:**
```rust
// Rust 负责分配,Zig 负责计算
let mut buffer = vec![0u8; 1024];  // Rust 分配
process_buffer(&mut buffer);       // Zig 处理
// buffer 自动释放
```

### 4. wasm-bindgen 集成

**Cargo.toml:**
```toml
[lib]
crate-type = ["cdylib", "rlib"]  # cdylib 用于 WASM

[dependencies]
wasm-bindgen = "0.2"

[profile.release]
opt-level = "s"   # 体积优化
lto = true        # Link Time Optimization
```

**Rust 代码:**
```rust
use wasm_bindgen::prelude::*;

#[wasm_bindgen]
pub fn js_api(data: Vec<u8>) -> Vec<u8> {
    // 调用 Zig 函数
    process_data(&mut data);
    data
}
```

## 📊 性能分析

### 1. 函数调用开销

| 调用类型 | 延迟 | 吞吐量 |
|---------|------|--------|
| JS → Rust (wasm-bindgen) | ~10ns | ~100M 次/秒 |
| Rust → Zig (静态链接) | ~1ns | ~1G 次/秒 |
| 跨进程 RPC | ~1ms | ~1K 次/秒 |

**结论**: 静态链接比动态加载快 **100,000 倍**

### 2. 内存拷贝开销

**传统方案 (两个独立 WASM):**
```
Rust WASM: Vec<u8> [1MB]
    ↓ 序列化 (~2ms)
SharedArrayBuffer [1MB]
    ↓ 反序列化 (~2ms)
Zig WASM: []u8 [1MB]
    ↓ 计算 (~5ms)
    ↓ 拷贝回去 (~4ms)
总耗时: ~13ms
```

**AutoZig 方案 (静态链接):**
```
Rust 分配: Vec<u8> [1MB]
    ↓ 传递指针 (~0ns)
Zig 直接操作内存 [1MB]
    ↓ 计算 (~5ms)
Rust 回收内存
总耗时: ~5ms
```

**加速比: 2.6x**

### 3. WASM 体积

| 实现方式 | 体积 | 说明 |
|---------|------|------|
| Pure Rust (wasm-bindgen) | ~80KB | 基线 |
| Rust + Zig (AutoZig) | ~95KB | +15KB Zig 代码 |
| Rust + JS (无 WASM) | ~5KB | 但性能差 5x |

**结论**: 增加 18% 体积,换取 5x 性能提升

## 🎯 使用场景

### 1. ✅ 适合 AutoZig WASM

- **计算密集型**: 图像处理、音频处理、加密算法
- **零拷贝友好**: 大块数据原地修改
- **无需 I/O**: 纯内存计算
- **性能关键**: 需要接近原生性能

**示例:**
- 图像滤镜 (已实现)
- 音频 DSP
- 视频编解码
- 数据压缩/解压
- 加密/解密
- 科学计算

### 2. ❌ 不适合 AutoZig WASM

- **需要异步 I/O**: WASM 单线程,阻塞会卡住 UI
- **需要动态内存管理**: Zig freestanding 限制
- **需要复杂系统调用**: 无 OS 环境
- **性能要求不高**: Pure JS 足够

## 🚀 未来优化

### 1. SIMD 支持

**当前状态**: Zig 自动向量化

**计划**: 显式 WASM