小生对 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
实在不解,难道是跟一些硬件有关系吗? 报这个错是为什么? 要怎么解决?
1
zzhbbdbbd OP 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 |