前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >WebAssembly简介

WebAssembly简介

作者头像
CNCF
发布2021-03-15 14:32:54
1.2K0
发布2021-03-15 14:32:54
举报
文章被收录于专栏:CNCF

作者:Marco Fioretti

WebAssembly到底是什么?

WebAssembly[1],也称为Wasm,是一种web优化的代码格式和API(应用程序编程接口),可以极大地提高网站的性能和功能。WebAssembly的1.0版本于2017年发布,并于2019年成为W3C官方标准。

所有主要浏览器供应商都积极支持该标准,原因很明显:官方列出的“浏览器内”用例[2]中提到了视频编辑、3D游戏、虚拟和增强实景、p2p服务和科学模拟等。除了比JavaScript更能让浏览器更强大之外,这个标准甚至可能延长网站的寿命:例如,WebAssembly支持Internet Archive的Flash动画和游戏[3]

WebAssembly并不只是针对浏览器;目前,它被用于移动和基于边缘的环境中,与Cloudflare Workers等产品一起使用。

WebAssembly是如何工作

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

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

正是这种选择让开发人员能够直接为数十亿人首选的用户界面编程,使用他们已经知道的语言(C/ c++、Python、Go、Rust等),但之前的浏览器无法有效使用。更好的是,程序员可以做到这一点——至少在理论上——而不必直接查看WebAssembly代码或担心(因为目标是虚拟机)哪个物理CPU会实际运行他们的代码。

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

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

相反,.wasm文件可以一次验证和编译,从而使“流编译(Streaming Compilation)”成为可能:浏览器可以在开始下载它们的时候开始编译和执行它们,就像流媒体电影一样。

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

WebAssembly让JavaScript过时了吗?

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

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

浏览器如何运行WebAssembly

一般来说,浏览器至少需要两个部分来处理动态应用程序:一个运行应用程序代码和标准API的虚拟机(VM),这些代码可以用来修改浏览器的行为和它所显示的网页内容。

现代浏览器中的虚拟机同时支持JavaScript和WebAssembly,方式如下:

  1. 浏览器下载一个用HTML标记语言编写的网页,并呈现它
  2. 如果HTML调用JavaScript代码,浏览器的VM将执行它。但是…
  3. 如果JavaScript代码包含一个WebAssembly模块的实例,就会像上面解释的那样获取该模块,然后根据需要通过WebAssembly API由JavaScript使用
  4. 当WebAssembly代码产生一些改变DOM(即“主机”web页面的结构)的东西时,JavaScript代码接收它并继续进行实际的改变。

如何创建可用的WebAssembly代码?

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

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

这篇文章首先在Linux基金会培训[6]发布。

参考资料

[1]

WebAssembly: https://webassembly.org/

[2]

“浏览器内”用例: https://webassembly.org/docs/use-cases/

[3]

Internet Archive的Flash动画和游戏: https://blog.archive.org/2020/11/19/flash-animations-live-forever-at-the-internet-archive/

[4]

入门指南: https://webassembly.org/getting-started/developers-guide/

[5]

Introduction to WebAssembly: https://training.linuxfoundation.org/training/introduction-to-webassembly-lfd133/

[6]

Linux基金会培训: https://training.linuxfoundation.org/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CNCF 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • WebAssembly到底是什么?
  • WebAssembly是如何工作
  • 但我们已经有JavaScript了。我们真的需要WebAssembly吗?
  • WebAssembly让JavaScript过时了吗?
  • 浏览器如何运行WebAssembly
  • 如何创建可用的WebAssembly代码?
    • 参考资料
    相关产品与服务
    机器翻译
    机器翻译(Tencent Machine Translation,TMT)结合了神经机器翻译和统计机器翻译的优点,从大规模双语语料库自动学习翻译知识,实现从源语言文本到目标语言文本的自动翻译,目前可支持十余种语言的互译。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档