WebAssembly发展史

1、WebAssembly和JavaScript的关系
WebAssembly发展史
文章图片

JavaScript

  • 特点:变量类型是不固定,使用变量前需要先判断类型。
  • 影响:增加了运算的复杂度,降低了执行效能。
Asm.js
  • 特点:预判变量类型的数值运算;数据类型只有符号整数、无符号整数和浮点数(谋智Mozilla)) 。
  • 影响:避免了JavaScript弱类型变量语法带来的执行效能低下的问题。根据测试,针对asm.js优化的引擎执行速度和C/C++原生应用在一个数量级。
WebAssembly
  • 特点:使用了二进制编码技术;
  • 影响:比ams.js有更高的执行效能;模块体积更小;解析速度更快。接近机器码。
???????2、WebAssembly的诞生与优势
诞生
  • 2015年6月,谋智公司在asm.js的基础上发布了WebAssembly项目; 2018年7月WebAssembly1.0标准正式发布。WebAssembly是在谋智(Mozilla)、谷歌(Google)、微软(Microsoft)、苹果(Apple)等各大厂商的大力推进下诞生的。
  • 目前包括Chrome、Firefox、Safari、Opera、Edge在内的大部分主流浏览器均已支持WebAssembly。
【WebAssembly发展史】???????特点
  • 跨平台(浏览器。国产化,linux ,win,mac,Android,ios);
  • 更安全(无法读取本地数据)
  • 免安装(不需下载插件/APP)
  • 快速部署:升级只需在服务器更新代码
  • 小体积:尽可能小的程序体积
???????3、WebAssembly程序生命周期
WebAssembly发展史
文章图片

  • 使用WebAssembly文本格式或其他语言(C/C++、Go、Rust、C#等)编写程序,通过各自的工具链编译为WebAssembly汇编格式(.wasm文件)。
  • 在网页使用fetch、XMLHttpRequest等获取.wasm文件。
  • 网页将.wasm编译为模块。编译过程中进行合法性检查。
  • 实例化。初始化导入对象,创建模块的实例。
  • 执行实例的导出函数,完成所需操作。
4、Emscripten编译器
  • 为了在浏览器中运行C/C++程序,从1995年起,许多知名项目相继开发。例如IE中可以直接嵌入运行本地代码的ActiveX控件。
  • 除尝试直接运行本地C++代码外,也有技术人员另辟蹊径,将其他语言直接转译为JavaScript后运行,Emscripten就是其中一个,它利用LLVM编译器前端编译C++代码,生成LLVM特有的跨平台中间语言代码,最终再将LLVM跨平台中间语言代码转译为JavaScript的子集WebAssembly。
  • 这样C/C++程序经过编译后不仅可在旧的JavaScript引擎上正确运行,同时也可以被优化为机器码之后高速运行。
???????5、总结
  • Emscripten是一种编译工具。可以将C++代码编译成WebAssembly汇编格式.wasm文件。
  • WebAssembly是一种特有的汇编语言。JavaScript代码运行在JavaScript虚拟机上,相对地,WebAssembly代码也运行在其特有的虚拟机上;大部分最新的浏览器均提供了WebAssembly虚拟机(chrome、Edge、Firefox、Safari);然而WebAssembly代码并非只能在浏览器中运行,Node.js 8.0之后的版本也能运行WebAssembly。
  • JS或者网页可以通过获取.wasm文件运行C++程序。
???????6、应用场景
  • 对于后端技术团队:把复杂的原生应用通过编译成wasm,在 Web端进行跨平台的应用->非常有潜力。
  • 对于前端技术团队:①既然WASM更快,是不是只要把JS里的代码/前端框架用C写出来,编成wasm就可以提高性能->①不一定(JS引擎中的JIT),不要盲目all in,只是多了一种在性能、开发成本和效果之间权衡的选择;②前端框架引入wasm或完全用wasm重写,这种趋势已经开启。②对于计算密集型的应用,可以通过编写成wasm方式在前端运行。而前端应用大多是IO 密集型。
  • 编译工具链和依赖库生态,基本完全不涉及 JS。①一个原生应用,需要编译、汇编和链接过程,才能变为一个可执行文件;②clang 、gcc->Emscripten;③Emscripten 提供了面向 WASM 平台,编译成 JS 格式的一套动态库;例如#include之后,调用glTexImage2D API就是动态库里提供的。???????
???????7、局限性
  • WASM 是 CPU 上的计算:对于可以高度并行化的任务,使用 WebGL 来做 GPU 加速往往更快。但WebGL 的加速存在精度问题。
  • 硬解:Mozilla尝试将WebIDL(浏览器原生的API)开发给WASM;引入了WASM Interface Types概念->也许未来WASM有硬解的功能。
  • runtime:wasm寄生于 JS VM;heap memory 由 JS 提供;操作 DOM、WebGL 都要经过 JS API 。
WASM 是个革命性的技术,代表了一种跨平台的全新方向,wasm作为其他语言编译target,从而实现了绕开js写前端的可能,工程化效率很高,对于后端 Rust/C/C++/Go 开发者来说,机会去做一个复杂的前端App。


    推荐阅读