WebAssembly 对象

WebAssembly 对象

WebAssembly 是一个对象,但不是一个构造函数,所以不能 new,主要有以下几个方法:

  • WebAssembly.instantiate() :函数加载 WebAssembly 代码
  • WebAssembly.Memory()/ WebAssembly.Table() :创建新的内存和表实例
  • WebAssembly.CompileError()/WebAssembly.LinkError()/WebAssembly.RuntimeError() :提供 WebAssembly 中的错误信息。

关键概念

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

因为 JavaScript 能够完全控制 WebAssembly 代码如何下载、编译运行,所以,JavaScript 开发者甚至可以把 WebAssembly 想象成一个高效地生成高性能函数的 JavaScript 特性。

将来,WebAssembly 模块将会像ES2015模块那样加载(使用<script type=’module’>),这也就意味着JavaScript 代码能够像轻松地使用一个ES2015模块那样来获取、编译和导入一个 WebAssembly 模块。

模块加载

再回顾一下上一章加载 wasm 模块的内容:再获取到 wasm 模块资源之后,通过 arrayBuffer 转换成带类型数组。最后,使用 WebAssembly.instantiate 函数一步实现编译和实例化带类型数组。

fetch('module.wasm').then(response =>
  response.arrayBuffer()
).then(bytes =>
  WebAssembly.instantiate(bytes, importObject)
).then(results => {
  // Do something with the compiled results!
});
复制代码

instantiate 函数接受待编译的字节码作为参数并且返回一个 promise 并且该 promise 可以解析为一个包含已编译的模块对象及其实例的对象。

{
  module : Module // 新编译的WebAssembly.Module对象,
  instance : Instance // 新的模块对象实例
}
复制代码

除此之外,还有另外一种实例化的方法:WebAssembly.instantiateStreaming。此函数可以直接接受二进制资源,而不需要转换成带类型数组。


fetch('module.wasm').then(response =>
  WebAssembly.instantiateStreaming(response, importObject)
).then(results => {
  // Do something with the compiled results!
});
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享