📅  最后修改于: 2020-11-02 05:09:10             🧑  作者: Mango
WebAssembly也称为wasm,它是Javascript的改进。它旨在像JavaScript一样在浏览器中运行,也可以与nodejs一起运行。当编译任何高级语言(如C,C++,Rust)时,您都会得到wasm输出。
考虑以下C程序-
int factorial(int n) {
if (n == 0)
return 1;
else
return n * factorial(n-1);
}
利用WasmExplorer(可从https://mbebenita.github.io/WasmExplorer/获得)获取编译后的代码,如下所示-
析因程序的WebAssembly文本格式如下所示-
(module
(table 0 anyfunc)
(memory $0 1)
(export "memory" (memory $0)) (export "factorial" (func $factorial))
(func $factorial (; 0 ;) (param $0 i32) (result i32)
(local $1 i32)
(local $2 i32)
(block $label$0
(br_if $label$0
(i32.eqz
(get_local $0)
)
)
(set_local $2
(i32.const 1)
)
(loop $label$1
(set_local $2
(i32.mul
(get_local $0) (get_local $2)
)
)
(set_local $0
(tee_local $1 (i32.add
(get_local $0) (i32.const -1)
)
)
)
(br_if $label$1 (get_local $1)
)
)
(return
(get_local $2)
)
)
(i32.const 1)
)
)
使用Wat2Wasm工具,您可以查看WASM代码,就像下面提到的那样-
开发人员不应在wasm中编写代码或学习在其中编写代码,因为它主要是在编译高级语言时生成的。
在WASM中,所有指令都被压入堆栈。弹出参数,并将结果推回堆栈。
考虑以下WebAssembly文本格式,该格式添加2个数字-
(module
(func $add (param $a i32) (param $b i32) (result i32)
get_local $a
get_local $b
i32.add
)
(export "add" (func $add))
)
函数的名称为$ add ,它接受两个参数$ a和$ b。结果是一个32位类型的整数。使用get_local访问局部变量,并使用i32.add执行添加操作。
在执行时将2个数字加起来的堆栈表示如下-
在步骤1-执行get_local $ a指令时,将第一个参数$ a压入堆栈。
步骤2-在执行get_local $ b指令期间,第二个参数$ b被压入堆栈。
在步骤3-执行i32.add将弹出堆栈中的元素,并将结果推回堆栈中。堆栈内部最后保留的值是函数$ add的结果。