JS如何调用wasm

1.生成wasm文件
javascript 复制代码
const fs = require("fs");
const wabt = require("wabt")(); // 注意 () 表示初始化

(async () => {
  const wabtModule = await wabt;

  const wat = `
(module
  (func (export "add") (param i32 i32) (result i32)
    local.get 0
    local.get 1
    i32.add)
  )
`;

  // 把 WAT 转换成二进制 WASM
  const parsed = wabtModule.parseWat("add.wat", wat);
  const { buffer } = parsed.toBinary({});

  fs.writeFileSync("add.wasm", Buffer.from(buffer));
  console.log("✅ 已生成 add.wasm");
})();
2.JavaScript 调用wasm文件
javascript 复制代码
const fs = require("fs");

async function init() {
  // 1. 读取 .wasm 文件
  const bytes = fs.readFileSync("add.wasm");

  // 2. 编译并实例化
  const { instance } = await WebAssembly.instantiate(bytes);

  // 3. 调用导出的函数
  console.log("2 + 3 =", instance.exports.add(2, 3));
}

init();
3.wasm调用JavaScript

在实例化传入importObject

javascript 复制代码
const fs = require("fs");
const wabt = require("wabt"); // 确保已安装:npm install wabt

// 完整的异步执行函数
async function runWasm() {
  // 1. 初始化 wabt(关键:2.x+ 版本返回的是对象,需解构出 parseWat)
  const { parseWat } = await wabt();

  // 2. 定义 WAT 文本(WebAssembly 文本格式)
  const wat = `
    (module
      ;; 导入 env.log 函数(接收 i32 参数)
      (import "env" "log" (func $log (param i32)))
      ;; 导出 run 函数(供 JS 调用)
      (func (export "run")
        i32.const 42  ;; 压入常量 42 到栈
        call $log     ;; 调用导入的 log 函数
      )
    )
  `;

  // 3. 转换 WAT -> 二进制 WASM(修复核心:用解构出的 parseWat 函数)
  const parsed = parseWat("module.wat", wat, {
    // 可选配置:启用 WebAssembly 标准特性
    exceptions: false,
    mutable_globals: true,
    sat_float_to_int: true,
    sign_extension: true,
  });

  // 4. 生成 WASM 二进制文件
  const { buffer } = parsed.toBinary({});
  fs.writeFileSync("module.wasm", Buffer.from(buffer));
  console.log("✅ module.wasm 已生成");

  // 5. 定义导入对象(给 WASM 提供 JS 环境的函数)
  const importObject = {
    env: {
      log: (num) => console.log("WASM 调用 log 函数:", num),
    },
  };

  // 6. 读取 WASM 二进制并实例化
  const wasmBytes = fs.readFileSync("module.wasm");
  const { instance } = await WebAssembly.instantiate(wasmBytes, importObject);

  // 7. 调用 WASM 导出的 run 函数
  instance.exports.run(); // 输出:WASM 调用 log 函数: 42
}

// 执行函数并捕获错误
runWasm().catch((err) => {
  console.error("执行失败:", err);
});
相关推荐
aqiu1111111 小时前
【C++算法打怪专栏】8. 字符串转换整数 (atoi)
开发语言·c++·算法
爱吃香菜的初学者2 小时前
十四.Linux——消息队列
linux·运维·开发语言
迅猛龙办公室2 小时前
python实现倒序输出数字
开发语言·python
夏幻灵8 小时前
JavaScript this 面试:五种绑定规则、优先级与常见面试陷阱
开发语言·javascript·面试
程序猿编码8 小时前
榨干 RTX5090 算力!Qwen3 专用单卡推理引擎,手写C++/CUDA 算子实现 MTP 推测解码
开发语言·c++·大模型推理·qwen3·多模态推理
三天不学习8 小时前
Egg.js 4 突然爆火,原因是否归结于AI 原生落地需求爆发?
前端·javascript·全栈·egg.js
xcs194059 小时前
前端 vue 的前端页面debugger 进不去
前端·javascript·vue.js
bkspiderx9 小时前
Qt 插件机制:动态扩展应用功能的核心框架
开发语言·qt·元数据·qt 插件·qpluginloader
程序员老陆10 小时前
深入理解 C++ thread_local:线程私有存储的正确打开方式
开发语言·c++·程序设计
沐晓时光10 小时前
C语言入门,深入理解指针(3)
c语言·开发语言