将多个值从WebAssembly传递到Javascript可能比需要的要困难。通常,我发现我必须:
多值是WASM的一个特性,目的是使这更容易,其中多个值可以直接从WASM传递到Javascript,从而消除了处理指针的需要。这些步骤如下:
例如:
(module
(func $multResult (export "multResult")
(result f64 f64)
f64.const 1
f64.const 2
)
)我们直接输出1和2。
我可以使用的有用函数从WAT编译WASM (使用轻微固定正确地支持多值标志):
node ./bin/watwasm bugrepro.wat -o newoutput.wasm -O3 --multi-value
将生成的WASM编译转换回WAT,我们得到:
(module
(type $none_=>_f64_f64 (func (result f64 f64)))
(export "multResult" (func $0))
(func $0 (result f64 f64)
(tuple.make
(f64.const 1)
(f64.const 2)
)
)
)tuple.make命令是使函数在Javascript中直接使用的秘密沙司。如果我写这个Javascript:
const fs = require('fs');
const wasmBytes = fs.readFileSync('./newoutput.wasm');
WebAssembly.instantiate(wasmBytes)
.then(obj => obj.instance.exports)
.then(exported => exported.multResult())
.then(res => console.log(res));我可以看到[1,2]由WASM函数返回。太棒了。
我希望能用比WAT更高级的语言来做这件事。是否有任何高级语言产生多值WASM?
发布于 2022-07-01 22:04:53
有一个: C.
TinyGo不;生锈;AssemblyScript不.我不知道谷物是否有,我也找不到任何文件。
您必须以一种特殊的方式使用Emscripten编译器。(显然只有这个Twitter条目中的任何地方都提到了这一点。)
首先,在C中构建函数,例如:
typedef struct _nums
{
int x;
int y;
} nums;
nums echo(int x, int y)
{
nums result = {x,y};
return result;
}这定义了一个C struct,它包含两个int,然后定义一个函数,它回显发送给它的任何内容。
它可以按以下方式使用Emscripten进行编译:
emcc -mmultivalue -Xclang -target-abi -Xclang experimental-mv -Oz -s STANDALONE_WASM -s EXPORTED_FUNCTIONS="['_echo']" -Wl,--no-entry hello.world.c -o bob.wasm旗帜的快速分解:
-mmultivalue:告诉Clang启用多值支持-Xclang -target-abi:告诉Clang以应用程序二进制接口为目标-Xclang experimental-mv:支持更多的多值产品?-Oz:告诉Clang生成针对size的积极优化的代码-s STANDALONE_WASM:告诉Emscripten不要生成它通常生成的Javascript胶水代码-s EXPORTED_FUNCTIONS="['_echo']":告诉Emscripten,如果找不到对它的引用,就不要优化它的'echo‘函数。这允许您将代码从WebAssembly导出到Javascript。-Wl,--no-entry:告诉Emscripten不要尝试在WebAssembly中创建默认条目hello.world.c:输入C文件-o bob.wasm:输出一个名为“bob.wasm”的文件这将导致以下代码:
(module
(type $none_=>_i32 (func (result i32)))
(type $i32_=>_none (func (param i32)))
(type $i32_=>_i32 (func (param i32) (result i32)))
(type $i32_i32_=>_i32_i32 (func (param i32 i32) (result i32 i32)))
(memory $0 256 256)
(table $0 1 1 funcref)
(global $global$0 (mut i32) (i32.const 5243920))
(export "memory" (memory $0))
(export "echo" (func $0))
(export "__indirect_function_table" (table $0))
(export "__errno_location" (func $4))
(export "stackSave" (func $1))
(export "stackRestore" (func $2))
(export "stackAlloc" (func $3))
(func $0 (param $0 i32) (param $1 i32) (result i32 i32)
(tuple.make
(local.get $0)
(local.get $1)
)
)
(func $1 (result i32)
(global.get $global$0)
)
(func $2 (param $0 i32)
(global.set $global$0
(local.get $0)
)
)
(func $3 (param $0 i32) (result i32)
(global.set $global$0
(local.tee $0
(i32.and
(i32.sub
(global.get $global$0)
(local.get $0)
)
(i32.const -16)
)
)
)
(local.get $0)
)
(func $4 (result i32)
(i32.const 1024)
)
)产生了大量的样板。重要的双边投资条约:
...
(export "echo" (func $0))
...
(func $0 (param $0 i32) (param $1 i32) (result i32 i32)
(tuple.make
(local.get $0)
(local.get $1)
)
)C是唯一能够产生多值代码的语言,这种情况可能很快就会改变。铁锈似乎偶尔会戳到固定物。
https://stackoverflow.com/questions/72835008
复制相似问题