What?

  WebAssembly 是一种二进制格式的类汇编代码,可以被浏览器加载和并进一步编译成可执行的机器码,从而在客户端运行。它还可以作为高级语言的编译目标,理论上任何语言都可以编译为 WebAssembly。

  我们知道汇编语言就是机器码的一种直译版本,它是一套指令的集合,必须与特定机器匹配。WebAssembly 虽然也可以看成汇编代码,但有一点不同,它是与特定机器无关的,它的指令被称为虚拟指令,并非真正的处理器指令。也就是说 WebAssembly 是一个平台无关的通用编译目标,可以运行在各种设备上,包括手机和物联网。

  WebAssembly 起源于 Mozilla 的一个项目:ASM.js,这玩意儿简单的说就是 JS 的一个轻简版子集,去除了动态类型、对象、垃圾回收等损耗性能的部件。它的作用是成为 C/C++ 的编译目标,从而能将大中型游戏引入浏览器,事实证明效果不错。然而 ASM.js 毕竟仍然是 JS,它不具备原生代码的一些功能,如 SIMD、线程、共享内存等,因此 ASM.js 进一步发展,就成了 WebAssembly。

  WebAssembly 的实质是 AST,而非字节码(bytecode),使用 AST 的原因是因为 AST 比字节码更容易压缩,也更容易翻译。

  作为浏览器厂商四巨头(谷歌、苹果、火狐、微软)合作共谋的产物,WebAssembly 的应用前景不可小觑。

Why?

  随着高计算量 Web 应用(3D图形、游戏、VR等)的出现,JavaScript 的速度又一次显得不够用了。WebAssembly 的目的就是让浏览器多一种运行更快速的代码。

  WebAssembly 比 JS 快这是显然的,一个接近 native code,另一个是动态类型的解释型语言,完全没法比。简单比较一下 JS 和 WebAssembly 的运行时过程就知道 WebAssembly 究竟快在哪儿了:

WebAssembly 不仅运行更快,传输也更快,因为它是二进制格式的,压缩率更高,体积更小。引用 Opera CTO 罗志宇的说法,WebAssembly 就是对 JS 性能问题的终极填坑方案。

在浏览器中引入 native code 的尝试其实早就有了,但是几乎没有一个成功的,无论是 Java Applet,还是谷歌的 Portable Native。Brendan Eich 对此的看法是,这些方案试图重建一个系统来替代 JS,这种革命式的改造在无权威的互联网世界是行不通的,因为 JS 已经在 web 端形成了自然垄断地位,如果仅仅为了改善性能问题,就彻底推翻重构,无异于削足适履,浏览器厂商是不干的。

  作为实用主义者,Brendan Eich 认为现实总是以渐进的方式改良,因此 WebAssembly 被设计为与 JS 协同使用,它既不会,也不可能替代 JS。

How?

  生成 WebAssembly 的方式有多种,可以直接手写,因为 WebAssembly 提供了文本形式,写起来跟汇编差不多。更通行的方式是将用其它语言——目前主要是静态语言(C、C++、Rust等)编写的代码编译成 WebAssembly(.wasm),编译工具最主要的是 LLVM。如果要支持动态语言,如 Python、Ruby 甚至 JS,那么编译器必须引入更多的扩展。

  LLVM 编译的基本工作机制是:首先使用一种针对特定语言的插件(类似于 webpack 中的 loader)将该语言编译为一种中间态形式(IR),然后再由 LLVM 对 IR 进一步编译、优化,从而得到.wasm。当然也有其它的编译工具,如 Emscripten、Binaryen 等。工具链的便捷程度是影响 WebAssembly 发展的一个重要因素。

得到 .wasm 文件之后怎么用呢?目前 .wasm 需要由 JS 引入后才能运行,JS 中有一个用于操作二进制代码的 API:ArrayBuffer,JS 使用 ArrayBuffer 加载 .wasm,然后调用编译方法,然后再创建实例。WebAssembly 还没有集成 Web API,要调用 Web API,就必须借助 JS。未来计划允许 WebAssembly 直接调用 Web API,并且让 .wasm 模块像 ES6 模块一样易于使用。

  目前 Chrome、FF、Edge、Safari 最新版都已支持 WebAssembly,对于不支持 WebAssembly 的浏览器,会有 polyfill 把 WebAssembly 重新翻译为 JavaScript。

Pros?

  1、WebAssembly 使得 web 应用具备了原生应用的性能;

  2、WebAssembly 提供了一种符合 W3C 标准的技术,从而可以取代私有的、非标的、安全性差的插件,如 flash 和 Silverlight;

  3、从古至今,浏览器只支持一种程序语言:JS,WebAssembly 使得有更多语言能够用于打造 web 应用;

  4、WebAssembly 是一个渐进式的方案,而非疾风骤雨,势不两立的革命,因此更具有现实可操作性。

Cons?

  现在还不好说,咱们拭目以待吧。

参考资料:

https://www.smashingmagazine.com/2017/05/abridged-cartoon-introduction-webassembly/#

https://medium.com/javascript-scene/why-we-need-webassembly-an-interview-with-brendan-eich-7fb2a60b0723

WebAssembly:随风潜入夜的更多相关文章

  1. EOS 新增的 WebAssembly 解释器,是什么鬼?

    Daniel Larimer 在最近的博客中透露,EOS 新增了官方的 WebAssembly 解释器,用来解释执行 WebAssembly 智能合约,加上之前的编译执行,EOS 智能合约有了两种执行 ...

  2. emscripten、 WebAssembly,传递字符串给c函数

    下面看具体的实例. 下面的代码是一个C函数,实现简单的字符串拼接,然后返回拼接的字符串. #include <stdio.h> #include <string>  char* ...

  3. WebAssembly让你的Javascript计算性能提升70%

    现在的JavaScript代码要进行性能优化,通常使用一些常规手段,如:延迟执行.预处理.setTimeout等异步方式避免处理主线程,高大上一点的会使用WebWorker.即使对于WebWorker ...

  4. WebAssembly完全入门——了解wasm的前世今身

    前言 接触WebAssembly之后,在google上看了很多资料.感觉对WebAssembly的使用.介绍.意义都说的比较模糊和笼统.感觉看了之后收获没有达到预期,要么是文章中的例子自己去实操不能成 ...

  5. 初探WebAssembly

    1.前言 参加完2018年上海的QCon大会,想到了会议中来自Microsoft的朱力旻大佬讲的WebAssembly,感触颇深. 我之前完全没有了解过WebAssembly,之前没有了解的原因也很简 ...

  6. 如何在React项目中直接使用WebAssembly

    前言 自从入坑WebAssembly以来,躺了很多坑,也浏览了很多资料,都没有看到很多能够直接在前端项目中使用WebAssembly的例子.即使有,我自己按照介绍的步骤一步一步来, 也会报各种错误,官 ...

  7. JavaScript与WebAssembly进行比较

    本文由云+社区发表 作者:QQ音乐前端团队 在识别和描述核心元素的过程中,我们分享了构建SessionStack时使用的一些经验法则,这是一个轻量级但健壮且高性能的JavaScript应用程序,以帮助 ...

  8. 不安分的 Go 语言开始入侵 Web 前端领域了!( WebAssembly )

    参考:https://blog.csdn.net/csdnnews/article/details/84038848 从 Go 语言诞生以来,它就开始不断侵蚀 Java .C.C++ 语言的领地.今年 ...

  9. .Net与 WebAssembly 随笔

    WebAssembly 是啥 - WebAssembly 是一种浏览器支持的字节码格式,WebAssembly 字节码和底层机器码很相似可快速装载运行,因此性能相对于 JS 解释执行大大提升,需要放到 ...

随机推荐

  1. Jenkins 远程构建任务

    开发过程中提交代码以后,如何不登录Jenkins就自动触发jenkins 任务来发布软件版本. 1.首先我们创建一个Jenkins任务. 2.选择"构建触发器"->勾选&qu ...

  2. 必知的 15 个jQuery小技巧(干货)

    jQuery小技巧(干活) 1.返回顶部按钮 你可以利用 animate 和 scrollTop 来实现返回顶部的动画,而不需要使用其他插件. $('a.top').click(function(){ ...

  3. JVM与对象初始化

    一个对象从无到有的过程 A a = new A() 1.JVM遇到new指令就会去堆内存分配一块内存空间,内存的大小在编译期间就可以确定 2.接着调用A的构造函数,这里构造的时候会沿着继承树逆流而上, ...

  4. 2、Java应用中常见的JDBC连接字符串(SQLite、MySQL、Oracle、Sybase、SQLServer、DB2)

    2.Java应用中常见的JDBC连接字符串 Java应用中连接数据库是不可或缺的,于是便整理一些可能用到的JDBC的jar包及其相匹配的URL,以备日后查阅. 1)SQLite Class.forNa ...

  5. EntityFramework6.X之DataAnnotations

    DataAnnotations 在web开发中不仅在客户端需要执行验证逻辑,会对会对用户向表单中输入的数据给出一个即时反馈:且在服务器端也需验证逻辑,因为来自网络的信息都是不能信任的.在MVC中通常是 ...

  6. 你会python不?当你听到这个问题要谨慎回答!!!

    问:你会python不? 答:python啊,略微有点小研究,虽然不精通,但是写写网络小爬虫,搜集搜集网络资源,学习视频什么的,还是手到擒来的...(for循环一小时中) 旁白:然而你没有明白人家的真 ...

  7. Hibernate与Jpa的关系(1)

    [转自:http://freewind.me/blog/20111129/588.html ] 我知道Jpa是一种规范,而Hibernate是它的一种实现.除了Hibernate,还有EclipseL ...

  8. 《算法4》2.1 - 插入排序算法(Insertion Sort), Python实现

    排序算法列表电梯: 选择排序算法:详见 Selection Sort 插入排序算法(Insertion Sort):非常适用于小数组和部分排序好的数组,是应用比较多的算法.详见本文 插入排序算法的语言 ...

  9. day5_ 导入模块和包

    ######################模块导入模块做的事1.产生新的名称空间2.以新建的名称空间为全局名称空间,执行文件的代码3.拿到一个模块名spam,指向spam.py产生的名称空间 imp ...

  10. Ant + Jenkies +Tomcat 自动构建部署Web项目

    前言:博主资历尚浅,很多东西都还在刚起步学习的阶段,这几天开发任务比较轻,就在自己window系统下,模拟部署远程服务器,利用Jenkies + Ant + Tomcat 搭建了一个自动发布部署的环境 ...