写点什么

关于 WebAssembly 你需要了解的 7 件事

2015 年 10 月 22 日

Auth0 是一家企业级网络认证服务提供商,致力于为用户提供流畅可扩展的认证解决方案。近日,该公司的工程师 Seba Peyrott 在文章中为我们介绍了关于WebAssembly 技术你需要了解的7 件事情

WebAssembly 是一项由 Mozilla、谷歌、微软及苹果联合开发的项目,致力于为各种语言定义一种二进制形式的编译目标格式,并设计一种可与当前的 Web 平台集成并在 Web 环境中执行的方案,最终实现在各类平台上以接近原生的速度调用常见的硬件功能。如果你尚未接触过 WebAssembly,可以阅读发表于 InfoQ 的译文《 WebAssembly:面向 Web 的通用二进制和文本格式》稍作了解,也可查看 WebAssembly 团队发布于 Github 的相关设计文档进行深入探究。

Seba Peyrott 首先定义了五个与 WebAssembly 有关的词:源代码、编译器、汇编、字节码、机器码,其中字节码是一种可运行于其它应用中的低阶二进制代码表示,机器码是可直接运行于硬件之上的二进制代码表示。而 WebAssembly 所做的正是为 Web 打造一套专用的字节码,这项标准在未来应用场景可能是这样的:

  1. 开发应用,但使用任何一门可被编译为 WebAssembly 的语言编写源代码。
  2. 用编译器将源代码转换为 WebAssembly 字节码,也可按需转换为汇编代码。
  3. 在浏览器中加载字节码并运行。

而你需要了解的这七个事实分别是:

  1. WebAssembly 不会替代 JavaScript。Sebastián 认为,越来越多的语言和平台想在 Web 上大展手脚,这会迫使 JavaScript 和浏览器厂商不得不加快步伐来补充缺失的功能,其中某些功能通过复杂的 JavaScript 语义来实现并不合适,所以 WebAssembly 可以作为 JavaScript 的补集加入到 Web 阵营中来。WebAssembly 最一开始的设计初衷就是作为不依赖于 JavaScript 的编译目标而存在,进而获得了主流浏览器厂商的广泛支持。

  2. WebAssembly 由参与组建 asm.js 和§NaCl 的团队共同开发。Mozilla 的asm.js项目初始目标是制定一套 JavaScript 子集作为编译目标,然而 Google 的§NaCl((Portable) Native Client)则选择为基于 LLVM 的 Web 平台提供一套二进制格式。Web 平台不由某一厂商独立控制,理应由大家共同参与维护,所以这些团队目前正共同开发一套跨浏览器的编译目标。

  3. WebAssembly 向后兼容。团队会针对老版本浏览器提供 polyfill 支持,目前已经构建出初始原型,也可以通过 demo1 和 demo2 体验最新的技术(注:高能预警,请提前保存所有重要文档,打开 demo 后会非常卡)。

  4. WebAssembly 比 CPU 汇编代码更简单易懂。WebAssembly 所以描述的结构是抽象语法树(abstract syntax tree,简称 AST),它同时也提供一些高阶结构,例如:循环和分支。如果了解语法规则,你可以手写 WebAssembly 结构,将编译后的二进制文件反编译的结果也是可读的,WebAssembly 甚至支持在已编译文件中添加调试信息。下面有两段 WebAssembly 示例可以参考:

  5. s- 表达式AST,完整示例

复制代码
;; Iterative factorial named
(func $fac-iter (param $n i64) (result i64)
(local $i i64)
(local $res i64)
(set_local $i (get_local $n))
(set_local $res (i64.const 1))
(label $done
(loop
(if
(i64.eq (get_local $i) (i64.const 0))
(break $done)
(block
(set_local $res (i64.mul (get_local $i) (get_local $res)))
(set_local $i (i64.sub (get_local $i) (i64.const 1)))
)
)
)
)
(return (get_local $res))
)
  1. 另一种表示方法,完整示例
复制代码
export func main() i32 {
storeI32(temp, 0);
var i i32 = 0;
done: while (i < 10) {
i = i + 1;
if (i >= 7) {
break done;
}
}
return (i + ifelse(0, 1, 2) * 2) * loadI32(temp) + loadI32(scale);
}
  1. WebAssembly 将超出 JavaScript 所需的功能进行扩展。根据项目文档中的最小可行产品(MVP)原则,WebAssembly 初期将实现 asm.js 的所有功能,但是会将其文字表达形式转换为二进制格式,以此来进一步优化加载时间。在未来的版本中,可能有如下几方面的突破:
  • 完整的线程支持
  • 单指令多数据(SIMD)类型与内联函数
  • 零成本异常(堆栈检查与展开)
  • 协同程序
  • 动态连接
  • DOM 集成
  • 集成垃圾回收
  • 尾调用优化
  • 多进程支持
  1. 支持在浏览器中开启 Source-maps 功能调试编译后代码。通过添加 Source-maps 的支持,可以在调试字节码的过程中有效避免“调试地狱”,WebAssembly 也支持在二进制格式文件中直接添加调试信息,简化调试过程是其标准中定义的内容之一。
  2. 即刻行动,无须等待。WebAssembly 集 asm.js 与 NaCl 二者之精华,如果你想马上体验这些新兴的技术,建议选择 asm.js 进行体验, Emscripten 可以帮助你把其它代码转换成 asm.js。由于 WebAssembly 尚处于孕育期,开发者们仍然会继续维护 asm.js,通过它在 Github 上的仓库你仍可得到相应的支持。

无论在官方文档还是在其它文章中,我们一直关注如何在 Web 平台上应用 WebAssembly 技术,往往忽略了通过这个平台同时也实现了 JavaScript 与其它语言互相调用的可能性。总而言之,WebAssembly 刚刚起步,同时它是多个主流厂商共同支持的解决方案,念念不忘,必有回响,我们继续期待着。


感谢徐川对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。

2015 年 10 月 22 日 19:0010971
用户头像

发布了 63 篇内容, 共 126.8 次阅读, 收获喜欢 35 次。

关注

评论

发布
暂无评论
发现更多内容

网络攻防学习笔记 Day24

穿过生命散发芬芳

5月日更 网络攻防

极光开发者周刊【No.0521】

极光开发者

我粉了!阿里大牛从内部带出来的百亿级高并发系统,从基础到实战、面面俱到

云流

Java 程序员 架构 面试

NumPy之:ndarray中的函数

程序那些事

Python Numpy

BMP、GIF、TIFF、PNG、JPG和SVG格式图像的特点

不脱发的程序猿

图像格式

技术干货 | 基于MindSpore更好的理解Focal Loss

华为云开发者社区

函数 mindspore Focal Loss 样本

GitHub开源的AI下五子棋

不脱发的程序猿

人工智能 GitHub 开源 五子棋 AI五子棋

阿里P9架构师强烈推荐:想拿60W以上年薪必看,Java高并发四套小册。

Java架构追梦

Java 阿里巴巴 架构 面试 高并发

云计算下半场:打法已变,谁主沉浮

ToB行业头条

云计算

iOS面试--拼多多最新iOS开发面试题

一意孤行的程序员

ios swift 面试 ios开发 知识分享

记十亿级Es数据迁移mongodb成本节省及性能优化实践

杨亚洲(专注mongodb及高性能中间件)

MySQL 数据库 mongodb 架构 分布式数据库mongodb

WizTree——一个扫描快似Everything的硬盘空间分析工具

DisonTangor

DevOps windows

M1 Dock智能硬件环境搭建(MaixPy安装及使用)

不脱发的程序猿

人工智能 开发板 智能硬件 AIOT M1 Dock

「技术人生」第2篇:学会分析事物的本质

阿里巴巴中间件

技术 工具 技术人 技术人生 一号位

「DataPipeline」完成数千万B轮融资,加速构建中国的世界级数据中间件产品

DataPipeline数见科技

融资

Nginx的11个执行阶段详解

运维研习社

nginx 运维 源码剖析 5月日更

MindSpore:不用摘口罩也知道你是谁

华为云开发者社区

算法 人脸识别 口罩 mindspore 口罩人脸

2021 DevOpsDays 东京站完美收官 | CODING 专家受邀分享最新技术资讯

CODING DevOps

CI/CD DevOpsDays CODING DevOps

重命名表,应该怎么做?

Simon

MySQL

探索GaussDB(DWS)的过程化SQL语言能力

华为云开发者社区

数据库 GaussDB(DWS) SQL语言 PLSQL语言 索引表达式

懂得取舍才是缓存设计的真谛

万俊峰Kevin

Go 缓存 cache 分布式缓存

新思科技为中兴通讯提供BSIMM软件安全评估

InfoQ_434670063458

5G 新思科技 中兴 软件安全 BSIMM

云小课|聊一聊DRS的数据过滤特性

华为云开发者社区

数据库 DRS 数据复制服务 数据过滤 数据库引擎

聊聊dubbo协议2

捉虫大师

dubbo 协议

LRU 和 LFU

且听且吟

这么狠,私塾在线架构师系列课程全都免费发放

InfoQ_d2212957090d

Java

并发王者课 - 青铜 3: 双刃剑-理解多线程带来的安全问题

技术八点半

Java 多线程 并发 王者并发课

老生常谈:面试必问“三次握手,四次挥手”这么讲,保证你忘不了

程序员小毕

Java 程序员 面试 TCP 网络

☕【JVM技术之旅】你真正掌握了Java对象创建的流程吗?

李浩宇/Alex

JVM java对象分析 java对象 对象创建 5月日更

Spark知识点简单总结

五分钟学大数据

大数据 spark 5月日更

2021年中国信创生态报告发布 指引未来信创产业发展

融云 RongCloud

开源中间件技术学习路线

开源中间件技术学习路线

关于WebAssembly你需要了解的7件事-InfoQ