在 NodeJS 中体验 WebAssembly技术(译)

您所在的位置:网站首页 go如何运行wasm文件 在 NodeJS 中体验 WebAssembly技术(译)

在 NodeJS 中体验 WebAssembly技术(译)

2024-06-04 14:06| 来源: 网络整理| 查看: 265

原文地址: Getting Started With WebAssembly in Node.js

WebAssembly 作为一个门新的语言,已经得到了许多 Javascript 引擎的支持。WebAssembly的目标是为了让 C 和 C++ 这样的编译型语言更容易地在浏览器上运行。而让我感到激动的特性是计算性能和内存操作上的优化,这样让 Javascript 可以实现更为快速的浮点数计算而不用等到 TC39 方案的到来。在这里,借助于 NodeJS 我将会为你展示一些初级的 WebAssembly 示例。并进行一些基本的测试示例来显示其在性能方面的影响作用。

注:文中的所有只在 Node 7.2.1 中进行了测试,并开启了 --expose-wasm参数,其它环境可能无法运行。

什么是 WebAssembly ?

通过开启 --expose-wasm参数,在 NodeJS 就可以访问全局对象 Wasm, 通过它可以来创建 WebAssembly 模块。

$ ~/Workspace/node-v7.2.1-linux-x64/bin/node --expose-wasm > Wasm { verifyModule: [Function], verifyFunction: [Function], instantiateModule: [Function], experimentalVersion: 11 } >

通过 Wasm.instantiateModule() 和 Uint8Array 来创建 WebAssembly 模块。

$ ~/Workspace/node-v7.2.1-linux-x64/bin/node --expose-wasm > Wasm.instantiateModule(new Uint8Array([0x00, 0x61, 0x73, 0x6d, 0x0b, 0x00, 0x00, 0x00])); {} >

为了创建一个最基本的 WebAssembly 模块,你需要传递一组 16进制的数据给 instaniateModule 来得到,如上创建的是一个最小的 WebAssembly 模块,因为每一个 .wasm 文件都必须以这一组16进制数据开始。

两个数字求和

有许多的编译工具可以直接将 C, C++ 和 Rust 代码编译成 WebAssembly,这样我们就不用手写字节码了。也存在一种名为'WebAssembly AST'(简称wast)的中间代码格式,如下为一个简单的支持两个参数的求和函数 wast 代码。

(module (func $addTwo (param i32 i32) (result i32) (i32.add (get_local 0) (get_local 1))) (export "addTwo" $addTwo))

你可以使用这个在线工具将 wast 代码转换为 wasm 二进制代码。你也可以直接从这里下载 .wasm源码。

接下来如何用 Node.js 来运行 .wasm 文件呢?为了使用 .wasm文件,你需要通过文件模块将 .wasm 文件转换成 ArrayBuffer 格式。

const fs = require('fs'); const buf = fs.readFileSync('./addTwo.wasm'); const lib = Wasm.instantiateModule(toUint8Array(buf)).exports; // `Wasm` does **not** understand node buffers, but thankfully a node buffer // is easy to convert to a native Uint8Array. function toUint8Array(buf) {


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3