📅  最后修改于: 2020-11-02 05:13:13             🧑  作者: Mango
WebAssembly的代码为二进制格式,称为WASM。您还可以在WebAssembly中获取文本格式,该格式称为WAT(WebAssembly文本格式)。作为开发人员,您不应该在WebAssembly中编写代码,相反,您必须将C,C++和Rust等高级语言编译为WebAssembly。
让我们逐步编写WAT代码。
步骤1 -WAT的起点是声明模块。
(module)
步骤2-现在让我们以function的形式向其中添加一些函数。
该函数的声明如下所示-
(func )
该函数以func关键字开头,后跟参数或结果。
参数和返回值的结果。
参数可以具有wasm支持的以下类型-
这些函数的参数编写如下:
结果将写入如下-
具有参数和返回值的函数将定义如下-
(func (param i32) (param i32) (result i64) )
局部变量是您在函数所需的变量。该函数的局部值将定义如下-
(func (param i32) (param i32) (local i32) (result i64) )
功能主体是要执行的逻辑。最终程序将如下所示:
(module (func (param i32) (param i32) (local i32) (result i64) ) )
步骤3-读取和设置参数和局部变量。
要读取参数和局部变量,请使用get_local和set_local命令。
例
(module
(func (param i32) (param i32) (local i32) (result i64) get_local 0
get_local 1
get_local 2
)
)
根据函数签名,
get_local 0将给参数i32
get_local 1将给出下一个参数i32
get_local 2将给出本地值i32
除了使用数字值(0,1,2)来引用参数和本地变量外,还可以在参数之前使用名称,并在名称前加上美元符号。
以下示例显示了如何将名称与参数和本地变量一起使用。
例
(module
(func
(param $a i32)
(param $b i32)
(local $c i32)
(result i64) get_local $a get_local $b get_local $c
)
)
步骤4-功能体中的指令和执行。
wasm中的执行遵循堆栈策略。执行的指令在堆栈中一一发送。例如,指令get_local $ a将压入该值,并在堆栈上读取。
像i32.add这样的指令将添加将弹出堆栈中的元素。
(func (param $a i32) (param $b i32)
get_local $a
get_local $b
i32.add
)
i32.add的指令是($ a + $ b) 。 i32.add的最终值将被压入堆栈,并将其分配给结果。
如果函数签名的结果已声明,则执行结束时堆栈中应有一个值。如果没有结果参数,则堆栈末尾必须为空。
因此,最终的代码以及函数体将如下所示:
(module
(func (param $a i32) (param $b i32) (result i32)
get_local $a
get_local $b
i32.add
)
)
步骤5-调用函数。
函数主体的最终代码如步骤4所示。现在,要调用该函数,我们需要将其导出。
要导出该函数,可以使用索引值(例如0,1)来完成,但是我们也可以给出名称。该名称将以$开头,并将其添加在func关键字之后。
例
(module
(func $add (param $a i32) (param $b i32) (result i32)
get_local $a
get_local $b i32.add
)
)
必须使用导出关键字导出函数$ add,如下所示:
(module
(func $add
(param $a i32)
(param $b i32)
(result i32)
get_local $a get_local $b i32.add
)
(export "add" (func $add))
)
要在浏览器中测试以上代码,您必须将其转换为二进制形式(.wasm)。请参阅下一章,该章显示了如何将.WAT转换为.WASM。