Skip to main content

uniffi 与 codegen 区别

UniFFI 和 Codegen 的核心区别在于:UniFFI 是一个专注于为 Rust 库生成跨语言绑定的特定工具,而 Codegen(代码生成)是一个更广泛的概念,泛指所有能自动生成代码的工具。

为了更清晰地理解,我们可以将 UniFFI 与 React Native 的 Codegen 进行对比,因为它们都是代码生成工具的具体实例,但服务于完全不同的场景。

UniFFI vs. React Native Codegen

维度UniFFIReact Native Codegen
本质一个为 Rust 语言设计的跨语言绑定生成器React Native 新架构下的一个代码生成工具
核心目的让你用 Rust 编写核心业务逻辑,然后自动生成供其他语言(如 Kotlin, Swift, Python)调用的 FFI(外部函数接口)绑定。自动生成连接 JavaScriptNative(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) 接口定义文件。使用 TypeScriptFlow 编写的 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,或是其他任何能够自动生成代码的工具。