WebAssembly 介绍
创始人
2024-03-02 07:00:22
0

到底什么是 WebAssembly?

WebAssembly,也叫 Wasm,是一种为 Web 优化的代码格式和 API(应用编程接口),它可以大大提高网站的性能和能力。WebAssembly 的 1.0 版本于 2017 年发布,并于 2019 年成为 W3C 官方标准。

该标准得到了所有主流浏览器供应商的积极支持,原因显而易见:官方列出的 “浏览器内部”用例 中提到了,其中包括视频编辑、3D 游戏、虚拟和增强现实、p2p 服务和科学模拟。除了让浏览器的功能比JavaScript 强大得多,该标准甚至可以延长网站的寿命:例如,正是 WebAssembly 为 互联网档案馆的 Flash 动画和游戏 提供了持续的支持。

不过,WebAssembly 并不只用于浏览器,目前它还被用于移动和基于边缘环境的 Cloudflare Workers 等产品中。

WebAssembly 如何工作?

.wasm 格式的文件包含低级二进制指令(字节码),可由使用通用栈的虚拟机以“接近 CPU 原生速度”执行。这些代码被打包成模块(可以被浏览器直接执行的对象),每个模块可以被一个网页多次实例化。模块内部定义的函数被列在一个专用数组中,或称为 表 Table ,相应的数据被包含在另一个结构中,称为 缓存数组 arraybuffer 。开发者可以通过 Javascript WebAssembly.memory() 的调用,为 .wasm 代码显式分配内存。

.wasm 格式也有纯文本版本,它可以大大简化学习和调试。然而,WebAssembly 并不是真的要供人直接使用。从技术上讲,.wasm 只是一个与浏览器兼容的编译目标:一种用高级编程语言编写的软件编译器可以自动翻译的代码格式。

这种选择正是使开发人员能够使用数十亿人熟悉的语言(C/C++、Python、Go、Rust 等)直接为用户界面进行编程的方式,但以前浏览器无法对其进行有效利用。更妙的是,至少在理论上程序员可以利用它们,无需直接查看 WebAssembly 代码,也无需担心物理 CPU 实际运行他们的代码(因为目标是一个虚拟机)。

但是我们已经有了 JavaScript,我们真的需要 WebAssembly 吗?

是的,有几个原因。首先,作为二进制指令,.wasm 文件比同等功能的 JavaScript 文件小得多,下载速度也快得多。最重要的是,Javascript 文件必须在浏览器将其转换为其内部虚拟机可用的字节码之前进行完全解析和验证。

而 .wasm 文件则可以一次性验证和编译,从而使“流式编译”成为可能:浏览器在开始下载它们的那一刻就可以开始编译和执行它们,就像串流电影一样。

这就是说,并不是所有可以想到的 WebAssembly 应用都肯定会比由专业程序员手动优化的等效 JavaScript 应用更快或更小。例如,如果一些 .wasm 需要包含 JavaScript 不需要的库,这种情况可能会发生。

WebAssembly 是否会让 JavaScript 过时?

一句话:不会。暂时不会,至少在浏览器内不会。WebAssembly 模块仍然需要 JavaScript,因为在设计上它们不能访问文档对象模型 (DOM)—— 主要用于修改网页的 API。此外,.wasm 代码不能进行系统调用或读取浏览器的内存。WebAssembly 只能在沙箱中运行,一般来说,它能与外界的交互甚至比 JavaScript 更少,而且只能通过 JavaScript 接口进行。

因此,至少在不久的将来 .wasm 模块将只是通过 JavaScript 提供那些如果用 JavaScript 语言编写会消耗更多带宽、内存或 CPU 时间的部分。

Web 浏览器如何运行 WebAssembly?

一般来说,浏览器至少需要两块来处理动态应用:运行应用代码的虚拟机(VM),以及可以同时修改浏览器行为和网页显示的 API。

现代浏览器内部的虚拟机通过以下方式同时支持 JavaScript 和 WebAssembly:

  1. 浏览器下载一个用 HTML 标记语言编写的网页,然后进行渲染
  2. 如果该 HTML 调用 JavaScript 代码,浏览器的虚拟机就会执行该代码。但是…
  3. 如果 JavaScript 代码中包含了 WebAssembly 模块的实例,那么就按照上面的描述获取该实例,然后根据需要通过 JavaScript 的 WebAssembly API 来使用该实例
  4. 当 WebAssembly 代码产生的东西将修改 DOM(即“宿主”网页)的结构,JavaScript 代码就会接收到,并继续进行实际的修改。

我如何才能创建可用的 WebAssembly 代码?

越来越多的编程语言社区支持直接编译到 Wasm,我们建议从 webassembly.org入门指南 开始,这取决于你使用什么语言。请注意,并不是所有的编程语言都有相同水平的 Wasm 支持,因此你的工作量可能会有所不同。

我们计划在未来几个月内发布一系列文章,提供更多关于 WebAssembly 的信息。要自己开始使用它,你可以报名参加 Linux 基金会的免费 WebAssembly 介绍在线培训课程。

这篇WebAssembly 介绍首次发布在 Linux Foundation – Training


via: https://www.linux.com/news/an-introduction-to-webassembly/

作者:Dan Brown 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

相关内容

不要使用MIME类型为ap...
Blazor WebAssembly 在默认情况下会使用 appl...
2025-01-10 22:01:25
不同编程语言下的WebAs...
要评估不同编程语言下的WebAssembly速度,可以按照以下步骤...
2025-01-08 07:30:54
部署wasm-webass...
这个错误通常出现在使用IIS服务器进行部署时。问题可能是因为服务器...
2025-01-07 23:00:39
部署的 WebAssemb...
在部署的WebAssembly Blazor应用程序上,如果身份验...
2025-01-07 10:01:09
拨号tcp:协议不可用go...
要解决"拨号tcp:协议不可用go webassembly测试"错...
2024-12-23 10:31:33
Blazor(Webass...
Blazor目前可以使用Blazor WebAssembly工作室...
2024-12-22 11:01:45

热门资讯

为什么计量 IT 的生产力如此... 在某些行业里,人们可以根据一些测量标准判定一个人的生产力。比如,如果你是一个零件制造商,可以通过一个...
硬核观察 #885 苹果 AR... 苹果 AR 眼镜被无限期推迟据报道,由于技术上的挑战,苹果公司已经无限期推迟了其轻型增强现实(AR)...
值得收藏的 27 个机器学习的... 机器学习 ( Machine Learning ) 有很多方面,当我开始研究学习它时,我发现了各种各...
PHP最佳实践(译) 简介PHP是一门复杂的语言,经过多年折腾,使其不同版本之间高度不一致,有时还有些bug。 每个版本都...
8个有趣的Linux提示与技巧... 我们时不时给你带来关于Linux的提示与技巧。和这个系列保持一致,这里有8个我们从读者收到最有趣的提...
8 个提升你的隐私防护的开源密... 使用一些顶级开源密码管理器,确保你的登录凭证安全无虞。密码管理器是一项非常有用的实用程序。在你想寻找...
Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
2020 年的 GitHub ... 距离 2020 年结束只剩下区区 24 天,我们即将结束魔幻的 2020 ,迎来新的一年,新的一年或...
开源新闻速递:openSUSE... 今日关注openSUSE 项目组的 Dominique Leuenberger 在他的周报中说:“这...
KDE4.11 Beta1 正...   KDE 项目工作组刚刚发布了 KDE Software Compilation 4.11 Bet...