初识webAssembly

1.javascript是解释型的语言

c++,java这样的语言是需要编译的,编译是编译器一次性把整个程序从高级语言翻译机器语言。

解释:解释器一边运行一边跑,比如定义了一个函数,每用到这一段代码就把这一段代码翻译成机器语言。

2.Just-in-time (JIT)编译器

由于前面说的javascript在浏览器中是一边翻译一边跑的,这样的话会导致效率低下。为了解决这一问题,浏览器中引入了编译器,综合了“解释”与“编译”的优点,形成混合模式。在 JavaScript 引擎中增加一个监视器(也叫分析器),监视器监控着代码的运行情况,记录代码一共运行了多少次等信息。假设一段代码运行的次数很多,那么JIT就把它放到编译器中编译并把结果存储起来。

但是,javascript不是说好了一边翻译一边运行吗,比如一段函数 function add(a,b){ return a+b; } 会因为传入的参数不同而导致运行结果不同,而且编译后的代码显然只能有一个版本,所以,才JIT在存储编译后的代码的时候要对这段代码进行标记:“行号 + 变量类型”的索引,如果监视器监视到了执行同样的代码和同样的变量类型,那么就直接把这个已编译的版本 push 出来给浏览器。

总而言之JIT是使得 JavaScript 运行更快的一种手段,通过监视代码的运行状态,重复执行多次的代码进行优化。通过这种方式,可以使 JavaScript 应用的性能提升很多倍。

3.性能提升二

其实JIT大部分时间都不会生成优化代码。由于JIT遇到的问题是类型不确定问题和一些语言功能。就催生了让用户不去使用这些功能,同时标注他们用的类型。有两种方法:

  1. Typescript、Dart、JSX为代表的强类型语言,然后编译成Javascript。
  2. Ams.js为代表的,做一个javascript的子集,标注变量类型。

知乎高票回答-填坑史

更多信息可以参考文章

3.什么是 WebAssembly?

参考文章

WebAssembly 并不是直接的物理机器语言,而是抽象出来的一种虚拟的机器语言。这由 Google , Microsoft , Mozilla , Apple 等几家大公司合作发起的一个关于 面向Web的通用二进制和文本格式 的项目。

MDN:WebAssembly是一种新的编码方式,可以在现代的网络浏览器中运行 - 它是一种低级的类汇编语言,具有紧凑的二进制格式,可以接近原生的性能运行,并为诸如C / C ++等语言提供一个编译目标,以便它们可以在Web上运行。它也被设计为可以与JavaScript共存,允许两者一起工作。以使得以各种语言编写的代码都可以以接近原生的速度在Web中运行。在这种情况下,以前无法以此方式运行的客户端软件都将可以运行在Web中。开发人员参考文档

Brendan Eich指出:“WebAssembly实际上是一个经过压缩的AST编码,而不是一堆字节码”

MDN文档解释了WebAssembly如何工作的概念,包括它的目标、它解决的问题以及它是如何在网络浏览器的渲染引擎中运行的。

为啥这玩意会影响每一个web开发者:因为webassembly让开发者有能力选择之前那些不能用来开发web应用的语言来进行web开发??

4.wasm核心概念:

  • 模块:表示一个已经被浏览器编译为可执行机器码的WebAssembly二进制代码。能够像一个ES2015的模块一样声明导入和导出。
  • 内存:ArrayBuffer,大小可变。本质上是连续的字节数组,WebAssembly的低级内存存取指令可以对它进行读写操作。
  • 表格:带类型数组,大小可变。表格中的项存储了不能作为原始字节存储在内存里的对象的引用。
  • 实例:一个模块及其在运行时使用的所有状态,包括内存、表格和一系列导入值。一个实例就像一个已经被加载到一个拥有一组特定导入的特定的全局变量的ES2015模块。

wasm如何在浏览器中运行呢?wasm给javascript提供一个API来调用。 wasm将来能够像ES2015的模块一样被导入导出。

5.如何使用wasm(这里只举例从c/c++移植)

使用Emscripten工具能够将一段C/C++代码,编译出:

  • 一个.wasm模块
  • 用来加载和运行该模块的JavaScript”胶水“代码
  • 一个用来展示代码运行结果的HTML文档

工作流程

5.将来允许wasm能做的事情

  • WebAssembly能够直接调用webAPI
  • 垃圾回收机制

猜你喜欢

转载自blog.csdn.net/sinat_33408089/article/details/84631060