- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
将多个值从 WebAssembly 传递到 Javascript 可能比需要的更难。通常,我发现我必须:
多值是 WASM 的一个特性,旨在使这更容易,多个值可以直接从 WASM 传递到 Javascript,无需处理指针。步骤变为:
例如:
(module
(func $multResult (export "multResult")
(result f64 f64)
f64.const 1
f64.const 2
)
)
我们直接输出1和2。
我可以使用 Rick Battagline's helpful functions从 WAT 编译 WASM(使用 slight fix 以正确支持多值标志):
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?
最佳答案
有一个:C。
TinyGo does not ; Rust does not ; AssemblyScript does not .我不知道 Grain 是否这样做;无论哪种方式,我都找不到文档。
您必须以特殊方式使用 Emscripten 编译器。 (这显然只在 this Twitter entry 的任何地方提到过。)
首先,在 C 中构建函数。例如:
typedef struct _nums
{
int x;
int y;
} nums;
nums echo(int x, int y)
{
nums result = {x,y};
return result;
}
这定义了一个包含两个 int
的 C struct
,然后定义了一个函数来回显发送给它的任何内容。
可以用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 以应用程序二进制接口(interface)为目标-Xclang experimental-mv
:启用更多多值内容?-Oz
:告诉 Clang 生成针对大小积极优化的代码-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 是唯一能够生成多值代码的语言的情况可能很快就会改变。 Rust 似乎偶尔会修复一个问题。
关于c - WASM : does anyone support multi-value WASM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72835008/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!