什么是 WebAssembly?
二十多年来,我们只有一种编程语言可以在Web浏览器中本地使用:广为人知的JavaScript。第三方二进制插件的逐渐消失已排除了如Java和Flash的ActionScript等其他语言作为Web开发的候选者。其他Web语言如CoffeeScript在一天结束时仅能编译为JavaScript。
如今,我们迎来了WebAssembly(Wasm)这一全新可能性。
WebAssembly是一种小型、高速的二进制格式,可为Web应用程序提供接近本机的性能。同时,它旨在成为任何语言的编译目标,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可能会有所帮助。

发表评论 (审核通过后显示评论):