资讯专栏INFORMATION COLUMN

[译]使用JavaScript创建一个WebAssembly模块的实例

elarity / 3122人阅读

摘要:原文链接这是系列文章第一篇使用创建一个模块的实例。将会创建模块的实例。一旦模块实例化完成,主进程就会拿到返回的实例。如果创建一个实例,你还需要其它的参数。使用这些低级装备这些来构建实例。模块本身没有任何状态。

原文链接:https://fanmingfei.com/posts/...

这是系列文章第一篇:

使用 JavaScript 创建一个 WebAssembly 模块的实例。

WebAssembly 中的 Memory

什么是 WebAssembly table?

WebAssembly是在Web上运行代码的新途径。使用它,你可以使用C/C++编写一些模块,并在浏览器上运行

目前,模块不能自动运行。随着ES模块的发展,浏览器逐步开始支持ES模块。WebAssembly 模块将会像加载 ES 模块一样被加载。比如:

我们学要加载这些代码文件才能运行它们。首先是 .js 文件,使用 React 的 JavaScript 文件。JavaScript 将会创建 WebAssembly 模块的实例。

需要使用 WebAssembly.instantiate 方法来创建实例。

我们来仔细看看这个。

第一步,.wasm 文件里的代码其实就是模块代码,我们将从 .wasm 文件中的二进制代码传递给WebAssembly.instantiate

所以我们需要将二进制代码转换成buffer,并且传递给 WebAssembly.instantiate 方法。

然后,引擎就会将这个模块编译成当前的机器所能运行的东西。

但是我们不想让它在主线程运行。主进程已经非常忙了,因为它要处理 JavaScript、DOM、layout。我们不想占用主线程,所以,WebAssembly.instantiate 返回一个 promise。

这样,主进程就可以去做一些别的事情了。一旦模块实例化完成,主进程就会拿到 promise 返回的实例。

如果创建一个实例,你还需要其它的参数。我觉得模块就像是王者荣耀的装备合成图谱。

实例就像是合成后的装备。如果想合成一个高级装备,需要一些低级装备。所以我们需要一些其它的东西才能实例化一个 WebAssembly 模块。

也就是WebAssembly.instantiate的第二个参数。这是一个需要导入到 WebAssembly 实例的对象:import object

我们将 import object 当做低级装备。使用这些低级装备(这些import object)来构建实例。就像装备打造图谱一样,每一个 WebAssembly 模块都需要特殊的 imports。

所以,如果你想实例化一个模块的话,你需要传入这个对象。传入的对象的属性值可以是一下几种类型:

values

function closures

memory

tables

Values

它可以是一个变量。WebAssembly 的数据类型只有两种,int 类型和 float 类型,所以 values 必须是这两种类型中的一种。当然 WebAssembly 规范如果增加了其它类型,这里就会变化。

Function closures

我们也可以传递函数闭包。也就是说,你传递一个 JavaScript 函数过去,WebAssembly 可以调用。

这非常的有用,因为当前版本的 WebAssembly 不能直接调用 DOM 方法。直接修改 DOM 在 WebAssembly 的规划中,不过现在规范里还没有。

你可以通过传递 JavaScript 函数过去,让 WebAssembly 调用,达到修改DOM的目的。所以 WebAssembly 可以调用一个 JS 函数

Memory

另外一个类型是 memory 对象。这个对象可以让 WebAssembly 模拟手动内存管理。Memory 对象的概念让人感到困惑,所以我在另一篇文章中进一步深入了解,这是本系列的下一篇文章。

Tables

最后可以导入的类型和安全有关。它叫做 table。它可以让你使用叫做函数指针。这个东西比较复杂,将会在这个系列文章中的第三篇中讲述。

这是所有你可以导入 WebAssembly 实例的类型。

WebAssembly.instantiate 的状态变为 resolved。它返回了两个内容:一个实例,和一个编译后的模块。

返回一个编译后的模块的好处是你可以随时拿它来生成一个新的实例。你只需要将 WebAssembly.instantiatesource 这个参数替换成拿到的 module 来生成实例。模块本身没有任何状态。也就是说,编译后的模块可以生成很多实例。

你的实例已经整装待发。你可以调用它的方法。

下一篇将会深入去讲解memory import和table import。

About

Lin Clark

Lin 是Mozilla Developer Relations团队的工程师。她使用 JavaScript、WebAssembly、Rust 和 Servo,也画一些漫画。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/84512.html

相关文章

  • []WebAssembly Memory

    摘要:使用,您可以直接访问原始字节码这可能令人担忧。可以根据索引从中拿到字符串现在,很多人并不知道如何在中使用字节码。你需要将字节码转换为有用的内容,比如说字符串。通过防止浏览器级内存泄漏并提供内存隔离,使事情变得更安全。 原文链接:https://fanmingfei.com/posts/... 这是系列文章第二篇: 使用 JavaScript 创建一个 WebAssembly 模块的实...

    junnplus 评论0 收藏0
  • []什么是 WebAssembly table imports?

    摘要:中的什么是在第一篇文章中,我介绍了可以导入的四中不同的类型。可能是以某种方式插入到内存中的恶意代码,可能嵌入到字符串中。是存在于内存之外的数组。如果模块想要调用这些函数,它将该索引传递给一个名为的操作。 原文链接: https://fanmingfei.com/posts/... 这是系列文章第三篇: 使用 JavaScript 创建一个 WebAssembly 模块的实例。 Web...

    Java_oldboy 评论0 收藏0
  • Webpack 4.0 发布:有哪些新特性?(

    摘要:有哪些新特性有哪些改进学着使用这个新版本,来构建更快的应用吧。继版本之后,花了将近八个月的时间来发布。的创始人之一,,建议用户使用,以便使用最优的性能,是因为源代码使用了新特性。全新的插件系统配备了全新整改的插件系统。 本文原文地址:https://auth0.com/blog/webpac...第一次翻译,不当之处,欢迎指正 官方已经发布了Webpack 4.0。有哪些新特性?有哪些...

    HitenDev 评论0 收藏0
  • WebAssembly 初尝

    摘要:在当前阶段,仅仅只是字节码规范。如果都没有将代码编译为字节码的工具,要起步就很困难了。接下来要做的是使用将格式的代码转换为二进制码。运行文件,最后就能得到浏览器需要的真正的二进制码。 本文转载自:众成翻译译者:文蔺链接:http://www.zcfy.cc/article/1031原文:http://cultureofdevelopment.com/blog/build-your-fi...

    anonymoussf 评论0 收藏0
  • 2017-07-20 前端日报

    摘要:前端日报精选入门指南工作原理的新功能前端本地存储数据库实例教程模块深入探究调查问卷中文译掘金第期构建高性能展开收缩动画译代码检查工具对比前端之旅译年了,这么多前端框架,你会怎样选择掘金译不配置,不出事那些坑其一前端面试的大 2017-07-20 前端日报 精选 CSS入门指南-1:工作原理2017 Amsterdam CSS DayWebpack 3 的新功能:Scope Hoisti...

    JessYanCoding 评论0 收藏0

发表评论

0条评论

elarity

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<