uniffi 与 codegen 区别
UniFFI 和 Codegen 的核心区别在于:UniFFI 是一个专注于为 Rust 库生成跨语言绑定的特定工具,而 Codegen(代码生成)是一个更广泛的概念,泛指所有能自动生成代码的工具。
为了更清晰地理解,我们可以将 UniFFI 与 React Native 的 Codegen 进行对比,因为它们都是代码生成工具的具体实例,但服务于完全不同的场景。
UniFFI vs. React Native Codegen
| 维度 | UniFFI | React Native Codegen |
|---|---|---|
| 本质 | 一个为 Rust 语言设计的跨语言绑定生成器。 | React Native 新架构下的一个代码生成工具。 |
| 核心目的 | 让你用 Rust 编写核心业务逻辑,然后自动生成供其他语言(如 Kotlin, Swift, Python)调用的 FFI(外部函数接口)绑定。 | 自动生成连接 JavaScript 与 Native(iOS/Android)的“胶水代码”,减少手动编写 Bridge 代码的工作。 |
| 适用场景 | 跨平台原生应用开发:尤其适合 Mozilla 这类需要为 iOS (Swift) 和 Android (Kotlin) 共享一份 Rust 核心库的场景。 | React Native 应用或库的开发:用于创建高性能的 Turbo Native Module 或 Fabric Native Component。 |
| 输入 (Input) | Rust 代码中的 过程宏 (proc-macros) 或 UDL (UniFFI Definition Language) 接口定义文件。 | 使用 TypeScript 或 Flow 编写的 API 规范文件(Spec)。 |
| 输出 (Output) | 1. Rust 脚手架代码 (Scaffolding) 2. 多种目标语言的外部绑定 (Foreign Language Bindings),如 Kotlin, Swift, Python 等。 | C++ 胶水代码,以及 Android (Java) 和 iOS (Objective-C++) 的平台特定代码。 |
| 触发时机 | 通常在 构建时 (Build Time) 通过 build.rs 或命令行工具 uniffi-bindgen 触发。 | 在 构建时 (Build Time) 由 React Native 的脚本自动调用。 |
简单来说,UniFFI 是 Codegen 这个大家族中的一个特定成员。它应用“代码生成”这项技术,来解决“让 Rust 代码能被其他语言轻松调用”这个特定问题。
补充:UniFFI 与其他绑定生成工具的对比
在 Rust 生态中,UniFFI 并非唯一的选择。了解它与其他工具的对比,有助于更全面地理解其定位。
- 与
bindgen对比:bindgen主要用于为 Rust 生成 C/C++ 库 的绑定,方向是“让 Rust 调用 C/C++”。而 UniFFI 的方向相反,是“让其他语言调用 Rust”。 - 与
wasm-bindgen对比:wasm-bindgen专注于为 WebAssembly (WASM) 生成绑定,以便在 JavaScript 中调用。UniFFI 则专注于为移动端和桌面端的原生语言(如 Swift, Kotlin)生成绑定。 - 与
boltffi对比:boltffi是另一个新兴的 Rust 绑定生成器,宣称在性能上远超 UniFFI(例如,在某些基准测试中高达 1000 倍)。这显示了 UniFFI 在性能方面可能存在优化空间。
总结
总而言之,“Codegen”是一个通用概念,而“UniFFI”是这个概念下一个非常具体的、为 Rust 服务的实现。当你谈论 UniFFI 时,你是在谈论一个特定的工具;而当你谈论 Codegen 时,你可能在谈论 UniFFI、React Native Codegen,或是其他任何能够自动生成代码的工具。