为什么不是C++
- 缺乏现代工具(合适的依赖管理器、羸弱的stdlib)
- 内存不安全:比如for循环忘记退出,获得不属于应用的内存
- C++已经很久了, 通常要动态链接库和共享代码机制对程序做扩展
Rust
- 强类型 & 编译
- 丰富的标准库:智能指针、容器、迭代器
- Cargo生态繁荣
- 编译时检查内存
WebAssembly
- 便携二进制,由X86架构组装
- 非原生,虚拟机执行
- 多种语言编译而成,受主流浏览器支持
- 可用AssemblyScript编写
对比
Rust增加60%性能,WASM增加45%,可见Rust比WASM快45%。像Java和C的对比一样,原生永远比虚拟机快,因为没有转换层。
选择
原生还是WASM
- 原生模块可以调用标准库
- 原生库可以被其它语言通过FFI调用,而JS不支持FFI
- WASM没有标准库的权限,无法与文件系统、网络或操作系统交互,需要等WASI推进
- WASM只能在虚拟机之间通用
- WASM遇到自定义结构,需要做映射转换
开发者友好性
- WASM-bindgen自动转换基本类型(i32, i64, f32, f64)
- neon需要胶水层做Rust到JS的转换
- 原生模块依赖宿主环境,像mac/win编译产物不互通,需要借助docker提高开发体验
- 新手上手WASM更容易,C/C++/Rust都可以完美编译成WASM,Python/Ruby/Go部分支持
总结
通常我们在追求极致性能时,选用原生模块扩展Nodejs,当遇到业务中性能不佳的模块时,选择采用WASM。
Rust | WASM | |
---|---|---|
性能 | ✅ | |
复用 | 🤔 | 🤔 |
易用性 | ✅ | |
标准库 | ✅ | |
上手 | ✅ | |
浏览器环境 | 🤔 | 🤔 |