You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求WebAssembly中数组传递与返回的完整多语言样板示例

WebAssembly处理数组平方的多语言实现示例

以下是针对JavaScript数组传入WebAssembly计算元素平方后返回的多语言实现样板,包含内存管理的关键步骤:

C语言实现

核心代码(square.c)

#include <emscripten.h>
#include <stdlib.h>

// 全局变量存储输出数组长度
int output_length;

EMSCRIPTEN_KEEPALIVE
int* square_array(int* input, int length) {
    output_length = length;
    // 分配WASM内存存储结果
    int* output = (int*)malloc(length * sizeof(int));
    for (int i = 0; i < length; i++) {
        output[i] = input[i] * input[i];
    }
    return output;
}

EMSCRIPTEN_KEEPALIVE
void free_memory(int* ptr) {
    free(ptr);
}

编译命令

emcc square.c -o square.js -s EXPORTED_FUNCTIONS='["_square_array", "_free_memory", "_output_length"]' -s EXPORTED_RUNTIME_METHODS='["ccall", "cwrap", "malloc", "free"]'

JavaScript调用代码

// 加载WASM模块
const module = await import('./square.js');

function processArray(arr) {
    const length = arr.length;
    // 分配WASM内存存储输入数组(int占4字节)
    const inputPtr = module._malloc(length * 4);
    // 将JS数组拷贝到WASM内存
    module.HEAP32.set(new Int32Array(arr), inputPtr / 4);
    
    // 调用WASM函数获取结果指针
    const outputPtr = module._square_array(inputPtr, length);
    // 从WASM内存读取结果数组
    const result = Array.from(module.HEAP32.subarray(outputPtr / 4, outputPtr / 4 + length));
    
    // 释放内存,避免泄漏
    module._free_memory(outputPtr);
    module._free(inputPtr);
    
    return result;
}

// 测试
console.log(processArray([1,2,3,4])); // 输出 [1,4,9,16]

C++语言实现

核心代码(square.cpp)

#include <emscripten.h>
#include <cstdlib>

extern "C" {
    int output_length;

    EMSCRIPTEN_KEEPALIVE
    int* square_array(int* input, int length) {
        output_length = length;
        int* output = (int*)std::malloc(length * sizeof(int));
        for (int i = 0; i < length; i++) {
            output[i] = input[i] * input[i];
        }
        return output;
    }

    EMSCRIPTEN_KEEPALIVE
    void free_memory(int* ptr) {
        std::free(ptr);
    }
}

编译命令

emcc square.cpp -o square.js -s EXPORTED_FUNCTIONS='["_square_array", "_free_memory", "_output_length"]' -s EXPORTED_RUNTIME_METHODS='["ccall", "cwrap", "malloc", "free"]'

JavaScript调用代码

与C语言的调用代码完全一致。


Go语言实现

核心代码(square.go)

package main

import (
    "syscall/js"
)

func squareArray(this js.Value, args []js.Value) interface{} {
    inputArr := args[0]
    length := inputArr.Get("length").Int()
    
    // 创建JS结果数组
    result := js.Global().Get("Array").New(length)
    
    for i := 0; i < length; i++ {
        val := inputArr.Index(i).Int()
        result.SetIndex(i, val*val)
    }
    
    return result
}

func main() {
    // 导出函数到JS环境
    js.Global().Set("squareArray", js.FuncOf(squareArray))
    // 阻塞防止Go程序退出
    select {}
}

编译命令

GOOS=js GOARCH=wasm go build -o square.wasm square.go

JavaScript调用代码

// 引入Go WASM运行时文件(可从GOROOT/misc/wasm/wasm_exec.js获取)
import { Go } from './wasm_exec.js';

const go = new Go();
const result = await WebAssembly.instantiateStreaming(fetch('square.wasm'), go.importObject);
go.run(result.instance);

// 测试
console.log(squareArray([1,2,3,4])); // 输出 [1,4,9,16]

Rust语言实现

核心代码(src/lib.rs)

use wasm_bindgen::prelude::*;

#[wasm_bindgen]
pub fn square_array(input: &[i32]) -> Vec<i32> {
    input.iter().map(|&x| x * x).collect()
}

编译命令

先安装wasm-pack:cargo install wasm-pack,再执行:

wasm-pack build --target web

JavaScript调用代码

import init, { square_array } from './pkg/square.js';

await init();

// 测试
console.log(square_array([1,2,3,4])); // 输出 [1,4,9,16]

内容的提问来源于stack exchange,提问作者SteepAtticStairs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 03:45:42