阿里、蚂蚁、晟腾、中科加禾精彩分享 AI 基础设施洞见,现购票可享受 9 折优惠 |AICon 了解详情
写点什么

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

  • 2015-10-22
  • 本文字数:2346 字

    阅读完需:约 8 分钟

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:0011447
用户头像

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

关注

评论

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

Java百度云教程,深入java虚拟机百度云,附详细答案

Java 程序员 后端

Java的Io模型你了解多少?尚硅谷大厂学院课,Java开发面试笔试题大汇总

Java 程序员 后端

Java研发岗必问30+道高级面试题,腾讯,字节等大厂面试真题汇总

Java 程序员 后端

Java程序员面试笔记,极客时间vue开发实战,Java进阶教程视频

Java 程序员 后端

Java日常开发的12个坑,你踩过几个,一招让你拿下seata分布式事务框架

Java 程序员 后端

Java研发岗面试复盘总,4面技术5面HR附加笔试面

Java 程序员 后端

Java程序员面试中最容易答错的8道面试题,tomcat面试题及答案

Java 程序员 后端

Java程序员面试笔试真题,java零基础入门视频百度云,阿里P7大牛亲自讲解

Java 程序员 后端

Java架构师必备技能,java程序设计实用教程第五版答案,掌握这个提升路径

Java 程序员 后端

云栖发布|企业级互联网架构全新升级 ,助力数字创新

阿里巴巴云原生

阿里云 云原生 产品升级 云栖大会

Java程序员必会!开课吧java高级架构师课程,Java开发大厂面试经验

Java 程序员 后端

Java笔试题及答案详解,nginx入门到精通百度云,全网最全原理讲解

Java 程序员 后端

Java编程入门经典,linux使用教程课后答案,mysql常见笔试题

Java 程序员 后端

Java春招实习面试经验汇总,图灵学院诸葛,Java微服务架构视频下载

Java 程序员 后端

Java架构师进阶之路,马士兵的java教程,大厂Java面试总结+详细解答

Java 程序员 后端

Java框架,黑马java视频教程,面试资料分享

Java 程序员 后端

Java程序员全套,百度三面牛客网猿生活,疯狂膜拜

Java 程序员 后端

Java程序员最新职业规划,尚学堂高琪300集,初级Java工程师面试题

Java 程序员 后端

Java编程入门经典,慕课网java架构师百度网盘,字节跳动Java高级工程师

Java 程序员 后端

Java知识体系!java黑马视频和达内,链表反转的两种实现方法

Java 程序员 后端

Java知识体系!极客学院黑马程序员,BIO和NIO有啥区别

Java 程序员 后端

Java程序员如何有效提升学习效率,如何化身BAT面试收割机

Java 程序员 后端

Java算法基础面试题,java教程张孝祥百度云,Java初级程序员面试题目

Java 程序员 后端

Java编程入门自学,牛客网在线编程,Java基础入门视频教程

Java 程序员 后端

Java月薪过万要掌握的技能,javajdk下载教程,高级Java工程师面试问题

Java 程序员 后端

Java爬虫爬取视频,尚硅谷笔试答案,最全面试考点与面试技巧

Java 程序员 后端

Java百度云资源,java基础案例教程黑马程序员在线阅读,美团Java面试流程

Java 程序员 后端

Java百度云,springboot实例教程,面试大厂应该注意哪些问题

Java 程序员 后端

Java笔试编程题大全带答案,mysql入门视频教程,Java多态实现原理

Java 程序员 后端

Java经典入门教程,vue尚学堂,Java面试问项目

Java 程序员 后端

Java编程书籍推荐,尚硅谷springboot,遇到的面试官都是架构师级别

Java 程序员 后端

关于WebAssembly你需要了解的7件事_JavaScript_刘振涛_InfoQ精选文章