WebAssembly (Wasm) 是一种技术,它有机会重塑我们为浏览器构建应用程序的方式。它不仅将允许我们构建全新的 Web 应用程序,而且还将允许我们使用 JavaScript 编写的现有应用程序更高效。
在这篇关于 Rust 和 Wasm 生态系统现状的文章中,我将尝试解释为什么 Rust 是可以释放 WebAssembly 真正潜力的语言。
什么是 WebAssembly?
WebAssembly 是一种二进制文件格式,所有主要的浏览器(除了 IE 11)都已实现,供虚拟机运行。WebAssembly 具有比 JavaScript 更快的启动和运行速度,因为该二进制格式简单易于浏览器解析并以高度优化的方式运行。如果您对 WebAssembly 的特殊之处的技术细节感兴趣,我推荐 Lin Clark 的相关文章。
那么,为什么要使用它?
虽然我最初开始研究 WebAssembly 是为了在另一种环境(即浏览器)中编写 Rust,但这并不是 WebAssembly 的特殊之处。我喜欢编写 JavaScript(尤其是 TypeScript),并且围绕 JavaScript 构建的 Web 开发生态系统是一项巨大的资产,不应被抛弃。WebAssembly 在作为 JavaScript 的补充时效果最佳——在 JavaScript 性能不足 时进行补充。
WebAssembly 可用于编写整个 Web 应用程序,或者替换现有应用程序中性能可能不够高的小部分,使其以接近本地速度运行。此外,由于 WebAssembly 是一种类似于本地的汇编格式,因此许多语言都可以编译成它,这意味着在其他平台和 Web 之间共享代码现在更加实用。
其他语言
许多不同的语言都可以编译成 WebAssembly,包括 C# 和 Go,那么为什么不使用它们而不是 Rust 呢?虽然编程语言的使用总是受个人偏好影响,但有很多理由说明 Rust 是完成这项工作的最佳工具。由于这些语言具有大型运行时,必须包含在 WebAssembly 二进制文件中,因此它们只对全新项目真正实用(即,它们仅作为 JavaScript 的替代品实用)。这篇关于 Wasm 的 Go wiki 文章 说,最小可实现的未压缩二进制文件大小约为 2MB;这与我所看到的相符。对于 Rust 来说,它带有一个非常小的运行时(基本上只是一个分配器),在我的机器上,“hello, world” 示例在没有任何编译后大小优化的情况下编译为 1.6KB(这可以进一步缩小)。
这并不是说 Go 或 C# 在浏览器中的未来是黯淡的——我对这些努力可能带来的成果感到非常兴奋。但现实情况是,这些技术可能始终最适合全新项目。
C 和 C++ 与 Rust 一样,具有非常小的运行时,因此可以实际嵌入到现有应用程序和库中。但是,Rust 可以使用我们将在本系列的其他文章中探讨的工具轻松创建具有 相当惯用的 JavaScript 接口 的 WebAssembly 二进制文件,而 C 和 C++ 中的过程则更加手动。Rust 中的工具绝对非常棒,我认为它使整个体验更加愉快。Rust 也是一种更内存安全的语言,这意味着在 C 和 C++ 中常见的整类错误在安全的 Rust 中是不可能发生的。如果您习惯了像 JavaScript、Java 和 C# 这样的内存安全语言,(即使您不习惯),您可能想选择 Rust。
让我们继续!
如果您对 WebAssembly 感兴趣,我仍然鼓励您深入研究任何让您最快乐的 WebAssembly 支持的语言——无论是 C++、C# 还是其他语言。如果您有兴趣了解有关 Rust 中的 Wasm 开发的更多信息,请在评论中告诉我。接下来,我将介绍从 JavaScript 调用 Rust。如果您想要更全面地了解 Rust 的故事与其他语言(如 C 和 Go)的故事的比较,请告诉我,我将来会更多地撰写相关内容。
3 条评论