第一次听说MoonBit,是在2026年初的一个技术分享会上。演讲者放了一张对比图:同样的斐波那契数列计算,编译成WebAssembly后,Rust生成2.3MB,Go生成4.1MB,MoonBit只有412KB。

我当时的第一反应是:又一个蹭WASM热度的语言?这些年见过太多"下一代编程语言"了,大部分最后都不了了之。但当我看到作者是张宏波的时候,态度变了。张宏波是ReScript的前核心开发者,ReScript在前端圈的口碑一直不错,能把一个语言做出来并且让一群人愿意用,说明这个人对语言设计是有真东西的。

为什么需要一门新语言

WebAssembly从2017年正式发布到现在,快十年了。生态发展很快,但真正用起来的时候,痛点一直很明显。

用Rust写WASM,学习曲线太陡。所有权、生命周期、借用检查,这些概念对于没有系统编程经验的人来说,门槛很高。而且编译速度慢,一个稍微大一点的项目,改一行代码等半分钟是常事。生成的文件体积也不小,因为带了std的运行时。

用Go写WASM,问题更明显。Go的运行时太大了,一个hello world都要好几MB。而且GC的存在让WASM的内存管理变得复杂,性能也不如预期。

用AssemblyScript,语法接近TypeScript,上手容易。但类型系统太弱,没有泛型,没有模式匹配,复杂项目维护起来很痛苦。

MoonBit瞄准的就是这个空白。它从第一天起就是为WASM设计的,不是把一个已有语言移植到WASM,而是从头开始考虑WASM的特性。这一点很关键,就像Swift是为iOS设计的,而不是把Objective-C换个语法。

实际写代码是什么体验

我花了一个周末,用MoonBit写了一个简易的JSON解析器。最直观的感受是:写起来像TypeScript,跑起来像Rust。

先看一段代码:

fn parse_number(s: String) -> Result[Int, String] {
  let trimmed = s.trim()
  if trimmed.is_empty() {
    return Err("empty string")
  }
  match int_of_string(trimmed) {
    Some(n) => Ok(n)
    None => Err("not a number")
  }
}

这段代码里有几个值得注意的地方。首先是类型推导,返回值类型写了,但函数内部的变量基本不用写类型。其次是模式匹配,match表达式处理Option类型,比if let简洁很多。最后是错误处理,用Result类型,没有异常,没有空指针。

再看一个结构体的例子:

struct User {
  name: String
  age: Int
  email: Option[String]
}

fn User.display(self) -> String {
  let email = match self.email {
    Some(e) => e
    None => "not set"
  }
  "\{self.name} (\{self.age}) - \{email}"
}

语法吸收了很多现代语言的优点。不可变默认,想要可变需要显式用mut。trait系统类似Rust,但更简洁。没有空指针,用Option处理缺失值。这些设计加在一起,写出来的代码默认就是安全的。

编译速度和文件体积

编译速度是MoonBit给我最大惊喜的地方。那个JSON解析器,大概500行代码,编译时间不到1秒。对比Rust,同样规模的项目,第一次编译可能要几分钟,增量编译也要十几秒。

生成的WASM文件体积确实小。JSON解析器编译后只有38KB,不需要额外的运行时,不需要wasm-opt进一步优化。这在边缘计算、插件系统这些场景下,优势非常大。冷启动的时候,38KB和2.3MB的差距是数量级的。

我做了一个简单的性能测试,解析一个1MB的JSON文件。MoonBit版本用时12ms,Rust版本用时10ms,Go版本用时18ms。MoonBit的性能和Rust接近,比Go快不少。考虑到文件体积只有Rust的六十分之一,这个结果很让人意外。

工具链完善程度

到2026年8月,MoonBit已经更新到v0.10.9版本。默认后端改成了wasm,工具链越来越完善。

moon命令行工具提供了完整的开发体验:moon new创建项目,moon build编译,moon test运行测试,moon fmt格式化代码,moon doc生成文档。这些工具的设计参考了Rust的cargo,但更简洁。

包管理也有了,moonbitlang的官方仓库上有几百个第三方包。虽然数量还不能和crates.io比,但常用的库基本都有了。JSON处理、HTTP客户端、正则表达式,这些都能找到。

IDE支持方面,VS Code有官方插件,提供语法高亮、自动补全、跳转定义、类型悬停。虽然还不如Rust-Analyzer那么强大,但日常开发够用了。

社区和生态

2026年5月,MoonBit亮相了巴塞罗那的WASM I/O大会,这是中国开发者平台第一次登上这个国际技术峰会。张宏波做了主题演讲《MoonBit & WebAssembly》,现场反响不错。Kotlin/Wasm的作者Zalim在社交媒体上评价说:"MoonBit在WASM领域的创新让人印象深刻。"

更值得一提的是,MoonBit已经正式被收录进WebAssembly Component Model的官方文档,和Rust、Go、C#这些语言并列。这说明它的工具链已经得到了Wasm社区的认可,不是一个玩具项目。

国内社区也在慢慢起来。MoonBit的中文文档很完善,官方论坛和微信群都比较活跃。我遇到问题的时候,在群里提问,通常几个小时内就能得到回复,有时候核心开发者会亲自回答。

目前的不足

当然,MoonBit现在还不是一个完美的语言。

生态还在建设中。第三方库的数量和质量都不如Rust,一些冷门领域可能找不到现成的库。如果你需要做很复杂的事情,可能需要自己造轮子。

调试体验还不够好。WASM的调试本身就比较麻烦,MoonBit的source map支持还在完善中。目前主要还是靠printf调试,对于习惯了IDE断点调试的人来说,需要适应一下。

异步编程还在实验阶段。async/await语法已经有了,但运行时还不够稳定,官方建议生产环境暂时不要用。对于需要大量IO的场景,目前可能不是最佳选择。

适合什么场景

如果你在做以下这些事情,MoonBit值得一试:

  • 浏览器端的高性能计算,比如图片处理、音视频编解码、数据可视化
  • 边缘计算函数,冷启动速度要求高,文件体积要小
  • 插件系统,需要安全沙箱,插件之间要隔离
  • 跨语言组件,用WASM Component Model做互操作
  • 对性能和体积都有要求的嵌入式场景

如果你需要的是一个成熟的生态、丰富的第三方库,或者需要大量异步IO,那Rust或Go可能还是更好的选择。

写在最后

这些年国产编程语言不少,但真正能走到国际舞台上的不多。MoonBit是我最近看到的最有希望的一个。它不是在重复造轮子,而是真的找到了一个Rust和Go都没有覆盖好的细分场景,并且把这个场景做透了。

编程语言的竞争,最终还是生态的竞争。MoonBit现在还在早期,但方向是对的,团队也靠谱。如果你对WASM感兴趣,或者对编程语言设计有好奇心,建议花一个下午试试。安装很简单,官方文档也有中文版本。试过之后,你可能会和我一样,对这门国产语言多一份期待。

毕竟,能把WASM文件做到几十KB,还能保持接近Rust的性能,这件事本身就挺酷的。