10月19, 2017

【译】关于WebAssembly你需要知道的7个大事件

在这篇文章中,我们将探究WebAssembly的7个关键点,WebAssembly将是未来几年中网络经历的最大变化之一。它真的会不负所望么?来,继续读!

介绍

如果你还不熟悉WebAssembly相关的概念,建议你通过阅读由ArsTechnica的Peter Bright所写的不错的文章 或者 来自Brendan Eich个人博客的一篇介绍文章来进行了解。

为了更好的说明问题,这里有几个术语简单给大家介绍一下:

  • Source code:(源码) 开发者所写的代码。
  • Compiler:(编译器) 将源代码转换为程序集,字节码或是机器代码的应用程序。
  • Assembly : (程序集)机器或应用程序特定的底层源码。
  • Bytecode: (字节码)代码的二进制表示,可以运行在其他应用程序中。
  • Machine code:(机器代码)代码的二进制表示,可以直接在硬件中运行的。

WebAssembly旨在成为web网站的Bytecode。接下来介绍未来将如何使用WebAssembly:

  1. 开发一个App(使用任何一种可以编译成WebAssembly的语言进行编写source code)。
  2. 使用一个Compilersource code转化成为WebAssembly Bytecode(如果需要的话,可能也需要转化成assembly-code)。
  3. 在浏览器中加载bytecode并运行。

alt

事件1:WebAssembly并不是Javascript的终结

之前就有提过,这里再次声明:Javascirpt会继续保留。随着web的发展,Javascirpt在开发者和开发工具中已经变成了一种通用语。WebAssembly并不会变更这个事实。WebAssembly试图填补如今Javascript被强制占据的空缺:一个可以作为编译器底层代码的目标。随着越来越多的语言和平台开始聚焦web发展,Javascript和浏览器供应商在提供必要的缺失功能方面压力越来越大。一些功能与Javascript复杂语义兼容的并不好。 WebAssembly很好的解答了上面的问题:

  • 从一开始,它就是按照作为一个编译器的目标而设计的。
  • 它被所有主流浏览器厂商兼容。
  • 它可以根据具体的需要脱离Javascript语义。

WebAssembly是Javascript在web中的一个必要的补充。

事件2:WebAssembly是由asm.js和(P)NaCl背后的团队开发衍生而来的

如果你对近些年web发展有所关注的话,不难发现WebAssembly旨在完成一个很艰难的目标:为不易于映射到JavaScript的语言提供统一的编译标准。这个目标不仅从技术角度上来讲难于实现,从标准的角度来讲也是非常艰难的。 由于web并不只是由单一供应商控制,所以每一个改变都将是共同努力的结果。幸好,WebAssembly背后的团队了解这一点。在亚马逊,一组核心开发人员试图以asm.js的形式提供解决方式:将JavaScript的一个子集用作编译器。另一方面,Google在Native Client(NaCl)和Portable Native Client(PNaCl)上运行,这是一种基于LLVM的网络二进制格式。尽管这些解决方案都在某种程度上有效,但是并没有为解决目前所存在的所有问题提供解决方案。 随着这个经历,Web Assembly应运而生:要实现提供一种跨浏览器编译器的目标需要共同努力。对 WebAssembly来讲,未来是光明的。

事件3: WebAssembly是向下兼容的

向下兼容对于web发展是十分必要的。WebAssembly也不例外:一个polyfill将会用于旧版本浏览器以实现对旧版本的兼容。事实上,原型已经可以使用了。不信你可以看这里或是这里

事件4: WebAssembly并不像CPU部件

当你看到“ assembly”这个词的时候,大脑中首先闪现的是“不可读”。值得庆幸的是,这并不是WebAssembly的特点。对比其他的底层编码表示或是更多的字节码,WebAssembly描述了一个抽象语法树(abstract syntax tree (AST))。没错,WebAssembly提供了更高级的构造方式,比如:循环和分支( loops and branches)。这意味着事实上可以直接写WebAssembly,或者是将现有二进制文件反编译成比操作码或指令更易读的东西。你也许会想:“那变量名称怎么办?”。WebAssembly将支持添加调试信息到编译文件中。

这是一个文字表示的简单的例子,这个例子使用s-expressions(ASTs的一个轻量级语言):

alt

查看完整代码

等等!s-expressions就是最终格式了么?不!WebAssembly的文字表示方式尚未正式通过。这是另外一个例子,使用完全不同的语法,但是你看上去会比较熟悉:

alt

查看完整代码

事件5:WebAssembly将扩展超出JavaScript所需的功能

WebAssembly的初衷是与 WebAssembly的初始实现旨在与asm.js进行特征匹配。换言之,如今你使用asm.js做的事情,都可以使用WebAssembly来替代甚至会达到更好的效果。在初始版本中值得期待的一个改进就是更快的加载时间。WebAssembly背后的二进制编码格式可以比asm.js的文字表达更快的解析。所以即使在初始版本中,WebAssembly也会在原来的基础上有一定的改进。这就是WebAssembly目前文档中所说的细小可行产品(minimum viable product (MVP))。在未来版本中,我们也将看到以下改进:

  • 全线程支持
  • SIMD类型和内在函数
  • 零成本异常(堆叠检查和展开)
  • 协同程序
  • 动态链接
  • DOM集成
  • 综合垃圾收集
  • 回调优化
  • 多进程支持

其中一些会很难使用JavaScript实现或者是纯asm.js。 WebAssembly在开发中考虑到这些功能并将作为支持这些功能的很好的语言平台。

事实6: Source-map将使你在浏览器中更加容易调试编译后的代码

编译语言的缺点之一就是使调试变得更加困难。如果你使用目前转换为JavaScript的任何一种语言,当你尝试精准的将生成的代码映射到源代码时,你可能就会遇到调试问题。WebAssembly旨在成为其他语言的很好的平台,所以针对这一特点的解决方案已经在开发中了。与目前的本地编译很相似,WebAssembly 将允许使用二进制的调试信息和源映射。Source maps将告诉浏览器和调试器如何将生成的代码映射到源代码中。易于调试(Easy debugging)也是WebAssembly规范的一部分。

事件7: 你不需要等待WebAssembly准备就绪

尽管WebAssembly目前依然在襁褓中,你也可以使用许多WebAssembly将来提供的优势。正如我们在事件2中所提到的,WebAssembly是asm.js和NaCl多年改进和发展的产物。如果你现在想要使用这些特性, asm.js就是个不错的尝鲜方式。举个例子,Emscripten如今允许你编译你的代码到 asm.js。如果你认为如今提交asm.js是个坏主意,请记住,WebAssembly也处于起步阶段。即使如此,WebAssembly依然致力于将与asm.js持平作为第一目标。所以不要害怕在asm.js上下赌注。WebAssembly正在被作为当前解决方案的升级路径进行开发,所以,也许开始考虑未来是个不错的注意,但那绝不意味着asm.js如今没有得到很好的支持。开始行动吧!

另外补充:WebAssembly和现有的库

在Auth0中(译者注:Auth0是一家“身份验证即服务”提供商,旨在为开发人员提供简单易用的身份管理服务。博文原文即来自Auth0)我们所有的工作都使用JavaScript。WebAssembly炫酷技能在于可以调用JavaScript库(反之亦然)。打个比方,你可以直接在C++中调用Auth0 JavaScript 库。炫酷在哪里?更多信息看这里吧。

总结

在过去几年中,我们看到了框架,编译器和其他类型的解决方案的爆炸式增长,目的都是使web与现有代码兼容。这对社区造成了很大的困扰。一方面,不符合JavaScript语义或意识形态的功能已经在实现者论坛中开始出现,并引发了JavaScript开发中严重的问题,另一方面,那些想要使用现有代码或是想要使用他们熟悉的语言或框架的开发者们,发现自己被锁死在了web中,或者是要面对严峻的调试挑战。即使现在的解决方案,如asm.js或PNaCl已经做了很多工作来减少这些问题,但是到目前为止,依然没有一个合适的跨供应商的解决方案。WebAssembly试图去解决这个问题。为编译器提供一个适当的,跨供应商的跨语言目标来创建一个支持所有必要特性的全面友好的平台。赌注虽高,但是是值得的。工作在这方面的开发人员了解,WebAssembly其实是开发人员长期以来要求的一个想法的演变。WebAssembly将会是未来。

原文链接:https://auth0.com/blog/7-things-you-should-know-about-web-assembly/

本文链接:https://www.imwineki.cn/post/WebAssemblyfeature.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。