【问题标题】:Fibonacci numbers in WebAssembly doesn't compileWebAssembly 中的斐波那契数无法编译
【发布时间】:2020-07-16 14:38:18
【问题描述】:

我尝试在 WebAssembly 中创建递归和基于数组的斐波那契序列,看看哪个更快,从而确定 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)))
             ^^^^^

我做错了什么?

【问题讨论】:

    标签: fibonacci webassembly


    【解决方案1】:

    自己解决了,就这样吧:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-22
      • 2020-01-18
      • 1970-01-01
      • 2014-05-19
      • 2015-10-08
      • 2014-11-28
      • 1970-01-01
      • 2015-06-05
      相关资源
      最近更新 更多