关于 WebAssembly 的问题: Wasm decoding failed

2018-07-27 23:57:41 +08:00
 zzhbbdbbd

小生对 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

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

2822 次点击
所在节点    前端开发
3 条回复
zzhbbdbbd
2018-07-28 09:37:43 +08:00
emmmmm,我看还没有 webassembly 的群, 我想建个群, 大家如果有兴趣的话, 可以加 WebAssembly 805366615
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
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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/474814

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX