首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WASM:有人支持多值WASM吗?

WASM:有人支持多值WASM吗?
EN

Stack Overflow用户
提问于 2022-07-01 22:04:53
回答 1查看 239关注 0票数 3

将多个值从WebAssembly传递到Javascript可能比需要的要困难。通常,我发现我必须:

  1. 设置Javascript和WebAssembly之间共享的内存。
  2. 进行WASM工作以生成值。
  3. 将值存储在共享内存的某个位置。
  4. 输出指向Javascript的内存指针。
  5. 让Javascript从共享内存中检索值。

多值是WASM的一个特性,目的是使这更容易,其中多个值可以直接从WASM传递到Javascript,从而消除了处理指针的需要。这些步骤如下:

  1. 进行WASM工作以生成值。
  2. 将值输出到Javascript。

例如:

代码语言: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,我们得到:

代码语言:javascript
复制
(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:

代码语言: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?

EN

回答 1

Stack Overflow用户

发布于 2022-07-01 22:04:53

有一个: C.

TinyGo不生锈AssemblyScript不.我不知道谷物是否有,我也找不到任何文件。

您必须以一种特殊的方式使用Emscripten编译器。(显然只有这个Twitter条目中的任何地方都提到了这一点。)

首先,在C中构建函数,例如:

代码语言:javascript
复制
typedef struct _nums
{
    int x;
    int y;
} nums;

nums echo(int x, int y)
{
    nums result = {x,y};
    return result;
}

这定义了一个C struct,它包含两个int,然后定义一个函数,它回显发送给它的任何内容。

它可以按以下方式使用Emscripten进行编译:

代码语言:javascript
复制
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

旗帜的快速分解:

  1. -mmultivalue:告诉Clang启用多值支持
  2. -Xclang -target-abi:告诉Clang以应用程序二进制接口为目标
  3. -Xclang experimental-mv:支持更多的多值产品?
  4. -Oz:告诉Clang生成针对size的积极优化的代码
  5. -s STANDALONE_WASM:告诉Emscripten不要生成它通常生成的Javascript胶水代码
  6. -s EXPORTED_FUNCTIONS="['_echo']":告诉Emscripten,如果找不到对它的引用,就不要优化它的'echo‘函数。这允许您将代码从WebAssembly导出到Javascript。
  7. -Wl,--no-entry:告诉Emscripten不要尝试在WebAssembly中创建默认条目
  8. hello.world.c:输入C文件
  9. -o bob.wasm:输出一个名为“bob.wasm”的文件

这将导致以下代码:

代码语言:javascript
复制
(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)
 )
)

产生了大量的样板。重要的双边投资条约:

代码语言:javascript
复制
...
(export "echo" (func $0))
...
(func $0 (param $0 i32) (param $1 i32) (result i32 i32)
  (tuple.make
   (local.get $0)
   (local.get $1)
  )
 )

C是唯一能够产生多值代码的语言,这种情况可能很快就会改变。铁锈似乎偶尔会戳到固定物。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72835008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档