WebAssembly发展史

1、WebAssemblyJavaScript的关系

JavaScript

  • 特点:变量类型是固定,使用变量前需要先判断类型。
  • 影响:增加了运算的复杂度,降低了执行效能。

Asm.js

  • 特点:预判变量类型的数值运算;数据类型只有符号整数、无符号整数和浮点数(谋Mozilla)
  • 影响:避免了JavaScript弱类型变量语法带来的执行效能低下的问题。根据测试,针对asm.js优化的引擎执行速度和C/C++原生应用在一个数量级。

WebAssembly

  • 特点:使用了二进制编码技术
  • 影响:比ams.js有更高的执行效能;模块体积更小;解析速度更快。接近机器码

​​​​​​​2、WebAssembly的诞生与优势

诞生

  • 20156月,谋智公司在asm.js的基础上发布了WebAssembly项目; 20187WebAssembly1.0标准正式发布。WebAssembly是在谋智(Mozilla)、谷歌(Google)、微软(Microsoft)、苹果(Apple)等各大厂商的大力推进下诞生的。
  • 目前包括ChromeFirefoxSafariOperaEdge在内的大部分主流浏览器均已支持WebAssembly

​​​​​​​特点

  • 跨平台(浏览器。国产化,linux ,win,mac,Android,ios);
  • 安全(无法读取本地数据
  • 免安装(不需下载插件/APP
  • 快速部署:升级只需在服务器更新代码
  • 小体积:尽可能小的程序体积

​​​​​​​3、WebAssembly程序生命周期

WebAssembly发展史_第1张图片

  • 使用WebAssembly文本格式或其他语言C/C++GoRustC#)编写程序,通过各自的工具链编译为WebAssembly汇编格式(.wasm文件)
  • 网页使用fetchXMLHttpRequest等获取.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虚拟机(chromeEdgeFirefoxSafari);然而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 VMheap memory JS 提供;操作 DOMWebGL 都要经过 JS API

WASM 个革命性的技术,代表了一种跨平台的全新方向,wasm作为其他语言编译target,从而实现js写前端的可能,工程化效率很高,对于后端 Rust/C/C++/Go 开发者来说,机会去做一个复杂的前端App

 

 

你可能感兴趣的:(Emscripten)