生成的WebAssembly模块如何查看大量动态数据

时间:2018-04-27 20:55:07

标签: webassembly

假设将生成包含大量数据的WebAssembly模块(wat格式)。程序开始运行后,数据将在运行时动态更改和更改。我不太清楚我知道将数据放在生成的WebAssembly模块中的哪个位置。

我正在努力完成(在WebAssembly中)这个JavaScript演示的内容:

var data = [
  100.1, 100.2, 200.1, 200.2,
  300.12, 300.123, ...
]

我最终会做的事情如下:

var subset = data.slice(2, 4)
storeSubset(subset)
data[5] = 500.3
subset[2] = 600

...但是在WebAssembly而不是JavaScript中,datasubset是某些函数的局部变量;它们不是全局变量。尽管如果有必要,可能还有一个全局数据集。

想知道将数据放在生成的模块中的哪个位置。因此,程序将从头开始将这些数据内置到其中。基本上,有一些初始化数据将在运行时动态修改。

这就是我在伪代码中尝试完成的事情:

(module
  (load float16 memorylocation, 200.1)
  (load float16 memorylocation, 200.2)
  ... for every piece of data
)

不确定(a)是否应该这样做(一次一件),或(b)它可以以某种方式批量完成。像这样:

(module
  (static memorylocation, 0101010110101...) ;; the bytes of all the `data`
  (block (loop ...)) ;; loop through it and do `(load ...)` for each,
  ;; not sure if that would be better / performance / etc.
  ...
)

将所有字节加载到一个位置并循环显示它们?

或者可能有一种更标准的.data功能,例如汇编(虽然我不确定这是否适合动态数据)。

(module
  (data float16 memorylocation, 200.1)
  (data float16 memorylocation, 200.2)
  ...
)

到目前为止,我了解如何在WebAssembly中执行 functions ,而不是如何处理初始化数据,因为它似乎会生成WebAssembly的 lot ,并且不确定应该是什么样的WebAssembly。

1 个答案:

答案 0 :(得分:2)

WebAssembly二进制文件包含一个data segment部分,该部分在调用start之前和实例开始运行之前复制到内存中。

C ++编译器会将.rodata的等效项和.data的任何其他静态初始化放在那里。然后可以在运行时修改它。