WebAssembly 中的斐波那契数不编译
Fibonacci numbers in WebAssembly doesn't compile
我尝试在 WebAssembly 中制作递归和基于数组的 Fibonacci 序列,看看哪个更快,从而确定 WebAssembly 是否支持尾递归优化(因为我找不到任何相关数据)。
(module
(memory 1)
(func $recursive_fib (param $n i32) (result i32)
(if (i32.lt_s (local.get $n) (i32.const 2))
(return (local.get $n))
)
(local.get $n)
(i32.const 1)
(i32.sub)
(call $recursive_fib)
(local.get $n)
(i32.const 2)
(i32.sub)
(call $recursive_fib)
(i32.add)
)
(export "recursive_fib" (func $recursive_fib))
(func $array_fib (param $n i32) (result i32) (local $i i32)
(i32.const 0)
(i32.store (i32.const 0))
(i32.const 1)
(i32.store (i32.const 4))
(i32.const 2)
(local.set $i)
(loop
(br_if 1 (i32.gt_s (local.get $i) (local.get $n)))
(local.get $i)
(i32.const 1)
(i32.sub)
(i32.const 4)
(i32.mul)
(i32.load)
(local.get $i)
(i32.const 2)
(i32.sub)
(i32.const 4)
(i32.mul)
(i32.load)
(i32.add)
(i32.store (i32.mul (i32.const 4) (local.get $i)))
(local.get $i)
(i32.const 1)
(i32.add)
(local.set $i)
(br 0)
)
(local.get $n)
(i32.const 4)
(i32.mul)
(i32.load)
)
(export "array_fib" (func $array_fib))
)
然而,当我尝试编译它时,出现了这个错误:
fibonacci.wat:26:14: error: type mismatch in br_if, expected [i32] but got []
(br_if 1 (i32.gt_s (local.get $i) (local.get $n)))
^^^^^
我做错了什么?
自己解决了,这里是:
(module
(memory 1)
(func $recursive_fib (param $n i32) (result i32)
(if (i32.lt_s (local.get $n) (i32.const 2))
(return (local.get $n))
)
(local.get $n)
(i32.const 1)
(i32.sub)
(call $recursive_fib)
(local.get $n)
(i32.const 2)
(i32.sub)
(call $recursive_fib)
(i32.add)
)
(export "recursive_fib" (func $recursive_fib))
(func $array_fib (param $n i32) (result i32) (local $i i32)
(i32.store (i32.const 0) (i32.const 0))
(i32.store (i32.const 4) (i32.const 1))
(local.set $i (i32.const 2))
(block (loop
(br_if 1 (i32.gt_s (local.get $i) (local.get $n)))
(i32.mul (i32.const 4) (local.get $i))
(local.get $i)
(i32.const 1)
(i32.sub)
(i32.const 4)
(i32.load (i32.mul))
(local.get $i)
(i32.const 2)
(i32.sub)
(i32.const 4)
(i32.load (i32.mul))
(i32.add)
(i32.store)
(local.set $i (i32.add (i32.const 1) (local.get $i)))
(br 0)
))
(local.get $n)
(i32.const 4)
(i32.load (i32.mul))
)
(export "array_fib" (func $array_fib))
)
我尝试在 WebAssembly 中制作递归和基于数组的 Fibonacci 序列,看看哪个更快,从而确定 WebAssembly 是否支持尾递归优化(因为我找不到任何相关数据)。
(module
(memory 1)
(func $recursive_fib (param $n i32) (result i32)
(if (i32.lt_s (local.get $n) (i32.const 2))
(return (local.get $n))
)
(local.get $n)
(i32.const 1)
(i32.sub)
(call $recursive_fib)
(local.get $n)
(i32.const 2)
(i32.sub)
(call $recursive_fib)
(i32.add)
)
(export "recursive_fib" (func $recursive_fib))
(func $array_fib (param $n i32) (result i32) (local $i i32)
(i32.const 0)
(i32.store (i32.const 0))
(i32.const 1)
(i32.store (i32.const 4))
(i32.const 2)
(local.set $i)
(loop
(br_if 1 (i32.gt_s (local.get $i) (local.get $n)))
(local.get $i)
(i32.const 1)
(i32.sub)
(i32.const 4)
(i32.mul)
(i32.load)
(local.get $i)
(i32.const 2)
(i32.sub)
(i32.const 4)
(i32.mul)
(i32.load)
(i32.add)
(i32.store (i32.mul (i32.const 4) (local.get $i)))
(local.get $i)
(i32.const 1)
(i32.add)
(local.set $i)
(br 0)
)
(local.get $n)
(i32.const 4)
(i32.mul)
(i32.load)
)
(export "array_fib" (func $array_fib))
)
然而,当我尝试编译它时,出现了这个错误:
fibonacci.wat:26:14: error: type mismatch in br_if, expected [i32] but got []
(br_if 1 (i32.gt_s (local.get $i) (local.get $n)))
^^^^^
我做错了什么?
自己解决了,这里是:
(module
(memory 1)
(func $recursive_fib (param $n i32) (result i32)
(if (i32.lt_s (local.get $n) (i32.const 2))
(return (local.get $n))
)
(local.get $n)
(i32.const 1)
(i32.sub)
(call $recursive_fib)
(local.get $n)
(i32.const 2)
(i32.sub)
(call $recursive_fib)
(i32.add)
)
(export "recursive_fib" (func $recursive_fib))
(func $array_fib (param $n i32) (result i32) (local $i i32)
(i32.store (i32.const 0) (i32.const 0))
(i32.store (i32.const 4) (i32.const 1))
(local.set $i (i32.const 2))
(block (loop
(br_if 1 (i32.gt_s (local.get $i) (local.get $n)))
(i32.mul (i32.const 4) (local.get $i))
(local.get $i)
(i32.const 1)
(i32.sub)
(i32.const 4)
(i32.load (i32.mul))
(local.get $i)
(i32.const 2)
(i32.sub)
(i32.const 4)
(i32.load (i32.mul))
(i32.add)
(i32.store)
(local.set $i (i32.add (i32.const 1) (local.get $i)))
(br 0)
))
(local.get $n)
(i32.const 4)
(i32.load (i32.mul))
)
(export "array_fib" (func $array_fib))
)