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))
)