MoonBit 再获美国知名科技媒体关注:The New Stack 推出 MoonBit Wasm 组件教程

三次登上美国知名技术媒体!MoonBit 又因 WebAssembly 组件模型引发关注!

在海外技术社区的持续关注下,MoonBit 又一次登上了美国知名开发者媒体 The New Stack。这是 TNS 第三次报道 MoonBit。本篇文章以 "如何用 MoonBit 构建 WebAssembly Components" 为主题,从工具链、接口定义到 Wasm 文件生成,对 MoonBit 的技术能力做了详细的解读:thenewstack.io/how-to-buil... )

以下为原文翻译

MoonBit 是一门现代化语言,也是一套工作流,旨在构建高效的 WebAssembly 项目;它同样可以编译到 JavaScript。我上一次关注 MoonBit 是在 2024 年 6 月,因此这次我想看看它在 Wasm 使用方面是否有所进展。(顺带一提:如果您仍然对WebAssembly的意义感到陌生,你不是一个人。)

现在,MoonBit 也可以在 WebAssembly 的组件模型运行(Web Component Model),我们稍后将对此进行探讨。我们将实现这一点,然后检查它是否有效。本文中只打算实现一个简单的加法方法。

MoonBit 语言快速回顾

在开始之前,先快速回顾一下 MoonBit 语言。

当然,从 Hello World 开始:

rust 复制代码
fn print_hello() -> Unit { 
 println("Hello, world!") 
}

唯一稍微让人意外的是 Unit ,但它其实只是 MoonBit 中等价于 void 的一类对象。

这是另一个例子:

rust 复制代码
fn add3(x : Int, y : Int, z : Int) -> Int { 
 x + y + z 
}

这是一个"top level";需要注意的是,MoonBit 必须显式声明类型。如果你想更深入了解这门语言,可以查看官方教程。官方教程


WebAssembly 组件模型集成

我们关注的是 WebAssembly 的集成。MoonBit 与 WebAssembly 组件模型 协同工作,这减轻了实现基本功能时的痛苦。组件模型通常是语言项目的下一阶段,因为它们固定了接口、契约以及数据类型。

逻辑上,一个组件是可以包含核心模块和/或其他子组件的结构。组件使用 WebAssembly Interface Types(WIT)来描述其中模块和子组件的接口。如果这听起来过于学术化,不用担心,它在实际生产工具链中完全能正常工作。本文的内容主要基于 MoonBit 的 WebAssembly 组件文档。

安装构建组件需要的工具链

在继续之前,我们需要 wit-bindgen CLI 工具,它用于生成兼容 WIT 的绑定文件;这个工具是基于 Rust 的,所以你需要安装 Cargo。只要安装 Rust 就能获得 Cargo:

Wit-bindgen

Bash 复制代码
curl https://sh.rustup.rs -sSf | sh

(如果你使用 Homebrew 安装过 Rust,你可能需要确认是否让 rustup 来管理对 Rust 的更新。我之前没更新好导致了更多的问题,所以我建议卸载 brew 安装的版本。)

在此之前,你可以先输入 cargo 以确认你是否已经正确安装:

虽然版本有点旧,但还能用。现在安装绑定工具:

Bash 复制代码
cargo install wit-bindgen-cli

你可能会收到提示,要求你把 cargo 的 bin 目录加入 PATH。我是在 MacBook 上安装,因此直接把它加入了 PATH。

然后安装用于组件的 Wasm 工具:

Bash 复制代码
cargo install wasm-tools

接着安装 MoonBit 本体:

Bash 复制代码
curl -fsSL https://cli.moonbitlang.com/install/unix.sh | bash

安装完成后,你需要运行一个新的 shell 或执行:

Bash 复制代码
source ~/.zshrc

现在你就可以运行 Rust 开发的项目组织工具 moon 了。

这下我们就把 Moon 的整套工具都准备齐了。

使用 WIT 文件定义程序

在编写 MoonBit 代码之前,我们需要先创建一个 WIT 文件,用来声明我们将在 WebAssembly 组件世界中使用的接口。

创建 wit/world.wit 文件:

rust 复制代码
package docs:adder@0.1.0; 

interface add { 
  add: func(x: u32, y: u32) -> u32; 
} 
world adder { 
  export add; 
}

这段 WIT 声明了一个版本为 0.1.0 的 docs:adder 包,并定义了名为 add 的接口,其中包含一个接收和返回 u32 的函数(在 MoonBit 中对应 UInt)。WIT 中的 world 是一个容器,用来放置所有组件需要的部分,这里只有一个 add 接口。

UInt :docs.moonbitlang.com/en/latest/l...

现在我们为 WIT 生成 MoonBit 结构:

rust 复制代码
wit-bindgen moonbit wit/world.wit --out-dir . \
    --derive-eq \
    --derive-show \
    --derive-error

生成后你应该会看到生成的 .mbt 文件。

您可能已经猜到 .mbt 后缀是 MoonBit 文件。但当然我们还没有真正写 MoonBit 代码。如果现在尝试构建 Wasm 目标,会收到大量警告。

查看生成的 stub,你会发现其中没有实际实现。

简单来说,stub 里并没有真正的实现,只是接口定义。即使使用我们上面最小的 MoonBit 教程,我们仍然可以轻松完成它:

主配置文件 gen/moon.pkg.json 会包含相关路径信息。

构建 WebAssembly 模块与组件

现在我们来构建主 WebAssembly 模块:

rust 复制代码
moon build --target wasm

构建后会生成新的 target 目录,其中包含 Wasm 文件。

检查一下 gen.wasm 是否有效:

很好,它是合法的 WebAssembly。现在我们需要在组件模型中正确地封装它:

rust 复制代码
wasm-tools component embed wit target/wasm/release/build/gen/gen.wasm \
  --encoding utf16 \
  --output adder.wasm

然后执行:

bash 复制代码
wasm-tools component new adder.wasm --output adder.component.wasm

此时生成的文件已不同于普通的 Wasm 模块。

我们可以使用 Wasmtime 来验证是否成功:

如果 Wasmtime 报错,可以从这里安装最新版本:

Bash 复制代码
curl https://wasmtime.dev/install.sh -sSf | bash

你也可以使用更复杂的宿主程序来进一步验证 .wasm 是否正常运行。

docs.moonbitlang.com/zh-cn/lates...

总结

我本来是想看看 MoonBit 的进展,结果却发现了 WebAssembly 组件模型。这就是开发者的旅程------总有一座更高的山。

在未来的某个阶段,MoonBit 需要在对组件模型的直接支持方面投入更多工作;否则,这种偏学术化的复杂度将使 Wasm 始终难以获得更广泛的采用(或使其更趋近于 Rust 的生态)。然而,这种模式与其他基于 stub 的模型颇为相似------尽管以 WSDL 作为类比并非最恰当------但在成熟的工具链中,它们依然能够良好运作,即便是由LLM驱动的工具链亦是如此。

MoonBit 被收录入《Top Programming Languages of Late 2025》!

在 MysticMatrix 发布的 《Top Programming Languages of Late 2025》 一文中,MoonBit 与 Mojo、Rust 一同被列为 2025 年度值得关注的新兴语言之一。

非常感谢社区的支持,我们会继续提升编译器与工具链,为大家带来更好的开发体验!

相关推荐
全栈弄潮儿1 小时前
Python实战第6期:列表与元组
后端·python·编程语言
zzu123zsw2 天前
从 proxy_pass 末尾斜杠到 WebAssembly 预压缩:深挖 Nginx 生产环境四大高频踩坑点
运维·nginx·wasm·webassembly·devops·运维排错
DLite2 天前
NLang 0.9.0发布:成为可嵌入语言
开发语言·编程语言·编译技术·nlang
codigger4 天前
Java 26 深度解析:一次“性能兑现 + 契约收紧”的版本
java·后端·编程·编程语言
CSharp精选营7 天前
Blazor 里 JWT 过期,用户正下单就被踢
认证·jwt·webassembly·blazor·令牌刷新
Helix2508 天前
2026编程入门指南:零基础如何科学选择第一门编程语言?
java·c语言·javascript·零基础·编程语言·python入门·编程就业
Helix2508 天前
Python与其他编程语言优劣势对比:2026初学者选型指南
java·python·教程·编程语言·入门·初学者编程选型
狼爷9 天前
Rust/Go/Java/Python/PHP 大比拼:负载下后端框架到底差多少?
java·后端·编程语言
天若有情6739 天前
开源|Comfort Lang v1.0.1,一款主打清爽交互的新型命令式编程语言
python·开源·交互·编程语言·项目分享·repl·comfort lang
被摘下的星星10 天前
编程de强语言和弱语言
编程语言