首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  前端开发

关于 WebAssembly 的问题: Wasm decoding failed

  •  
  •   zzhbbdbbd · 2018-07-27 23:57:41 +08:00 · 1211 次点击
    这是一个创建于 451 天前的主题,其中的信息可能已经有所发展或是发生改变。

    小生对 WebAssembly 很感兴趣, 但是初学的时候就碰壁 在 google,baidu 后仍没有找到解决的方法, 学识浅薄,也不知道问题出在哪儿。

    在用 assemblyscript 写了一个简单的函数, 是算斐波那契的第 n 项

    export function Fibonacci(x:i32):i32{
        if(x === 1 || x === 2) {
            return 1
        }
        return f(x - 1) + f(x - 2)
    }
    

    然后使用 asc 转到 f.wasm

    asc main.ts -o f.wasm
    

    问题就是在 fetch 这个 f.wasm 的时候,老是报错

    //加载 webassembly 模块
            (async () => {
                let mod = await fetch("./f.wasm")
                .then(res => res.arrayBuffer())
                .then(src => WebAssembly.instantiate(src))
                .catch(err => console.log(err))
            })()
    

    报错信息为:

    CompileError: AsyncCompile: Wasm decoding failed: expected section length @+115
    

    实在不解,难道是跟一些硬件有关系吗? 报这个错是为什么? 要怎么解决?

    3 回复  |  直到 2018-08-20 14:25:40 +08:00
        1
    zzhbbdbbd   2018-07-28 09:37:43 +08:00
    emmmmm,我看还没有 webassembly 的群, 我想建个群, 大家如果有兴趣的话, 可以加 WebAssembly 805366615
        2
    chai2010   2018-08-20 14:16:25 +08:00
    函数名字写错了吧,新的 asc 编译提示错误了。修复后重新生成 f.wasm。

    再创建 main.js:

    ```js
    const fs = require('fs');
    const buf = fs.readFileSync('./f.wasm');

    WebAssembly.instantiate(new Uint8Array(buf),{
    console: {
    log: function(arg) {
    console.log(arg);
    }
    }
    }).then(function(result) {
    console.log(result.instance.exports.Fibonacci(5))
    })
    ```

    node main.js 就可以执行了。

    关于 WebAssembly 的更多资料可以关注:
    https://github.com/chai2010/awesome-go-zh
        3
    3dgen   2018-08-20 14:25:40 +08:00
    看楼主的写法,是希望递归调用来计算斐波拉契序列的 n 项值,但问题是:Fibonacci 这个函数应该调用自身,但是你在 Fibonacci 里面调用的是函数 f,而不是自身,这根本就不是递归调用的写法啊。正确的写法是这样:

    export function f(x:i32):i32{
    if(x === 1 || x === 2) {
    return 1
    }
    return f(x - 1) + f(x - 2)
    }

    当然你把 f 全部换成 Fibonacci 效果一样,JS 部分亲测可用:

    function fetchAndInstantiate(url, importObject) {
    return fetch(url).then(response =>
    response.arrayBuffer()
    ).then(bytes =>
    WebAssembly.instantiate(bytes, importObject)
    ).then(results =>
    results.instance
    );
    }

    fetchAndInstantiate('f.wasm').then(
    function(instance) {
    console.log(instance.exports.f(10));
    }
    );

    控制台输出 55。

    另外,楼上的链接给错了,我帮他改改,应该是这个:
    https://github.com/chai2010/awesome-wasm-zh
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1780 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 23ms · UTC 16:34 · PVG 00:34 · LAX 09:34 · JFK 12:34
    ♥ Do have faith in what you're doing.