什么是 WebAssembly?
二十多年来,我们只有一种编程语言可以在 Web 浏览器中本地使用:著名且臭名昭著的 JavaScript。第三方二进制插件的缓慢消亡已经排除了其他语言,例如 Java 和 Flash 的 ActionScript,作为 Web 开发的老一等公民。其他 Web 语言,如 CoffeeScript,在一天结束时只是编译成 JavaScript。
但现在我们有了一种新的可能性:WebAssembly,简称 Wasm。
WebAssembly 是一种小型、快速的二进制格式,可为 Web 应用程序提供接近本机的性能。此外,WebAssembly 旨在成为任何语言的编译目标,JavaScript 只是其中之一。
现在每个主要浏览器都支持 WebAssembly,是时候开始认真考虑为 Web 编写可以编译为 WebAssembly 的客户端应用程序了。
值得注意的是,WebAssembly 应用程序并不打算取代 JavaScript 应用程序——至少目前还没有。相反,将 WebAssembly 视为 JavaScript 的伴侣。 JavaScript 是灵活的、动态类型的,并通过人类可读的源代码交付,而 WebAssembly 是高速的、强类型的,并通过紧凑的二进制格式交付。
开发人员应考虑将 WebAssembly 用于性能密集型用例,例如游戏、音乐流、视频编辑和 CAD 应用程序。许多网络服务已经采取了行动,例如谷歌地球。 Figma 是一个协作绘图和图表应用程序,即使 WebAssembly 相对较新,它也转向 WebAssembly 来缩短加载时间和执行速度。
WebAssembly 的工作原理
由 W3C 开发的 WebAssembly 用其创建者的话来说是一个“编译目标”。开发人员不直接编写 WebAssembly;他们用自己选择的语言编写,然后编译成 WebAssembly 字节码。然后字节码在客户端上运行——通常是在网络浏览器中——在那里它被翻译成本地机器代码并高速执行。
WebAssembly 代码旨在比 JavaScript 更快地加载、解析和执行。当 Web 浏览器使用 WebAssembly 时,仍然存在下载 Wasm 模块并进行设置的开销。对于较大的 Wasm 项目,这些模块可以运行到几兆字节,因此这些延迟可能很重要。但在其他条件相同的情况下,WebAssembly 运行得更快。
WebAssembly 还提供了一个沙盒执行模型,该模型基于 JavaScript 现在存在的相同安全模型。 Wasm 应用程序无法直接访问沙箱之外的任何内容,包括它们正在运行的网页的 DOM。与机器其余部分的任何交互都必须使用 WebAssembly 系统接口 (WASI) 等 ABI。 WASI 提供对程序中经常需要的文件、网络、系统时钟和其他系统服务的受控访问。
目前,在 Web 浏览器中运行 WebAssembly 是最常见的用例,但 WebAssembly 的目的不仅仅是基于 Web 的解决方案。 Wasmer 项目在服务器端运行 WebAssembly 应用程序,与 Node.js 运行时在浏览器之外运行 JavaScript 的方式非常相似。
用例
WebAssembly 最基本的用例是作为编写浏览器内软件的目标。编译成 WebAssembly 的组件可以用多种语言中的任何一种编写;然后通过 JavaScript 将最终的 WebAssembly 有效负载传递给客户端。
WebAssembly 在设计时考虑了许多性能密集型、基于浏览器的用例:游戏、音乐流、视频编辑、CAD、加密和图像识别等等。
更一般地说,在确定您的特定 WebAssembly 用例时,关注这三个领域是有益的:
已经存在于目标语言中的高性能代码。例如,如果你有一个已经用 C 语言编写的高速数学函数,并且想要将它合并到一个 Web 应用程序中,你可以将它部署为一个 WebAssembly 模块。应用程序中对性能不太重要、面向用户的部分可以保留在 JavaScript 中。
需要从头开始编写的高性能代码,其中 JavaScript 并不理想。以前,有人可能使用 asm.js 来编写这样的代码。你仍然可以这样做,但 WebAssembly 被定位为更好的长期解决方案。
将桌面应用程序移植到 Web 环境。 asm.js 和 WebAssembly 的许多技术演示都属于这一类。 WebAssembly 可以为比仅通过 HTML 呈现的 GUI 更雄心勃勃的应用程序提供基础。在浏览器中查看 WebDSP 和 Windows 2000 的演示以获取两个示例。
如果你有一个现有的 JavaScript 应用程序没有突破任何性能极限,那么在 WebAssembly 的这个开发阶段最好不要管它。但是,如果您需要该应用程序运行得更快,WebAssembly 可能会有所帮助。
发表评论 (审核通过后显示评论):