📜  WebAssembly-文本格式

📅  最后修改于: 2020-11-02 05:13:13             🧑  作者: Mango


WebAssembly的代码为二进制格式,称为WASM。您还可以在WebAssembly中获取文本格式,该格式称为WAT(WebAssembly文本格式)。作为开发人员,您不应该在WebAssembly中编写代码,相反,您必须将C,C++和Rust等高级语言编译为WebAssembly。

WAT代码

让我们逐步编写WAT代码。

步骤1 -WAT的起点是声明模块。

(module)

步骤2-现在让我们以function的形式向其中添加一些函数。

该函数的声明如下所示-

(func   )

该函数以func关键字开头,后跟参数或结果。

参数/结果

参数和返回值的结果。

参数可以具有wasm支持的以下类型-

  • i32:32位整数
  • i64:64位整数
  • f32:32位浮点数
  • f64:64位浮点

这些函数的参数编写如下:

  • (参数i32)
  • (参数i64)
  • (参数f32)
  • (参数f64)

结果将写入如下-

  • (结果为i32)
  • (结果为i64)
  • (结果为f32)
  • (结果为f64)

具有参数和返回值的函数将定义如下-

(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_localset_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。