编译为 wasm 组件时需要如何设置才能使用 math 模块?

我是 moonbit 新手,最近在研究 wasm 组件相关的内容。我一直跟随着官网的博客写,如果不引用 math 中的 sin 那些,都没任何问题,也能通过 wasmtime 运行。
如果引用了 math 里面的内容,在转换为 wasm 组件时会报错。

wasm-tools component new target/wasm/release/build/gen/gen.wasm -o target/wasm/release/build/gen/gen.wasm

error: failed to encode a component from module

Caused by:
    0: failed to decode world from module
    1: module was not valid
    2: failed to resolve import `math::tan`
    3: module requires an import interface named `math`

我的 mbt 文件如下:

// Generated by `wit-bindgen` 0.34.0.

fn sin(x : Double) -> Double = "math" "sin"
fn cos(x : Double) -> Double = "math" "cos"
fn tan(x : Double) -> Double = "math" "tan"

pub fn walk( ast : AstType ) -> AstType {
    let mut sum: Double = 0.0

    for i = 0UL; i < ast.end; i = i + 1 {
        sum += tan(cos(sin(i.to_double())));
    }
    return AstType::{ ..ast, content: (sum.floor().to_int64().reinterpret_as_uint64()) };
}

请问有相关的资料可以查看吗?

能提供下你用于生成的wit文件吗?

Wasmtime本身应该没有提供math相关内容,在我所知范围内也没有WASI提案添加这些操作。

你可能需要通过自定义FFI函数来实现。

wit 很简单,我估计对这个问题没什么帮助。

// moonbit.wit
package component:moonbit;

world moonbit {
    export share:walker/ast-walker;
}
// deps.toml
"share:walker" = "../../share/wit/"
// share/wit/ast-walker.wit
package share:walker;

interface ast-walker {
    record ast-type {
        content: u64,
        start: u64,
        end: u64
    }

    walk: func(ast: ast-type) -> ast-type;
}

world ast-handle {
    export ast-walker;
}

那如果需要在 moonbit 编译成 wasm 组件中使用 sin 函数,有没有别的办法呢?直接把 sin 函数编译到结果中呢,有没有这种设置?

你可以在你的 WIT 中定义对 math 模块的支持,然后使用 wasm-tools component link 或 wac 等工具链接提供 math 模块的模块。话说回来,多亏社区贡献者的贡献,目前 core 中的 math 包已提供sin cos tan支持