最近MoonBit在日本火了起来,用它开发的Markdown编辑器,同样条件下竟快Rust编写的MarkDown解析器300多倍,
MoonBit编写的Luna UI框架。开发者用它做了一个射击游戏,帧率稳定保持在60 FPS(帧每秒),而用大家熟知的React框架实现类似功能时,帧率只有12 FPS左右
MoonBit 是由中国工程院院士、北京大学教授梅宏团队领衔研发的我国首个自主研发的通用编程语言,也是全球首个AI原生云原生开发平台。
MoonBit 由粤港澳大湾区数字经济研究院(福田)(IDEA研究院)主导开发,于2024年9月正式对外发布,标志着中国在基础软件领域取得重要突破。
三大核心定位:
项目名称:MoonBit(中文名:月兔)
发布时间:2023.8.18
研发机构:粤港澳大湾区数字经济研究院(IDEA研究院)
技术 leader:梅宏院士(中国工程院院士、北京大学教授)
语言类型:静态类型、编译型、通用编程语言
开源协议:Apache 2.0
官方网站:https://www.moonbitlang.cn
GitHub:https://github.com/moonbitlang
MoonBit 的设计遵循以下核心理念:
// MoonBit 使用静态类型检查
fnadd(x: Int, y: Int) -> Int {
x + y
}
// 类型推断
let result = add(10, 20) // 自动推断为 Int 类型
优势:
// 定义枚举类型
enumOption[T] {
Some(value: T)
None
}
// 使用模式匹配
fndescribe_option(opt: Option[String]) -> String {
match opt {
Some(v) => "有值: " + v
None => "无值"
}
}
// 使用
let val1 = Some("Hello")
let val2: Option[String] = None
优势:
// 不可变数据结构
structPoint {
x: Int
y: Int
}
// 纯函数
fndistance(p1: Point, p2: Point) -> Double {
let dx = (p1.x - p2.x).to_double()
let dy = (p1.y - p2.y).to_double()
sqrt(dx * dx + dy * dy)
}
// 函数是一等公民
fnapply[T, U](f: (T) -> U, value: T) -> U {
f(value)
}
let numbers = [1, 2, 3, 4, 5]
let doubled = numbers.map(fn(x) { x * 2 })
优势:
MoonBit 拥有远超许多传统语言的模式匹配能力,可以直接对结构体、数组乃至字符串进行深度解构:
// 直接匹配数组结构
fnparse_main(toks: Array[Token]) -> CFunction? {
match toks[:] {
// 直接匹配token数组结构
[KeyWord("int"), Identifier("main"), LParen, RParen, LBrace, ..body_toks] => {
// 解析函数体逻辑...
}
_ => None// 不匹配
}
}
// 字符串模式匹配
loop code[:] {
[' ' | '\n' | '\r' | '\t', ..rest] => continue rest // 跳过空白
[.. "->", ..rest] => { tokens.push(Arrow); continue rest }
['+', ..rest] => { tokens.push(Plus); continue rest }
['a'..'z' | 'A'..'Z' | '_', ..] as id_part => {
let rest = tokenize_identifier(id_part, tokens)
continue rest
}
[] => { tokens.push(EOF); break }
[other, ..rest] => { raise LexError("Invalid character") }
}
**对比C++**:MoonBit的模式匹配将开发者从繁琐的过程式逻辑中解放出来,更专注于语法的核心结构。
MoonBit独特的"函数式循环"(loop表达式)非常适合状态机实现,如词法分析器:
pubfntokenize(code: String) -> Array[Token] {
let tokens: Array[Token] = []
// 状态作为参数传递给下一次迭代
loop code[:] {
['' | '\n' | '\r' | '\t' , ..rest] => continue rest // 跳过空白
[.. "->", ..rest] => { tokens.push(Arrow); continue rest }
['+', ..rest] => { tokens.push(Plus); continue rest }
['a'..'z' | 'A'..'Z' | '_', ..] as id_part => {
let rest = tokenize_identifier(id_part, tokens)
continue rest
}
[] => { tokens.push(EOF); break } // 结束
[other, ..rest] => { raise LexError("Invalid character") }
}
tokens
}
优势:整个过程没有可变的索引变量,状态传递清晰可见,逻辑自然展开。
MoonBit官方提供了与LLVM C++ API风格一致的绑定库,更安全易用:
test "Simple LLVM Add" {
let ctx = Context::new()
letmod = ctx.addModule("demo")
let builder = ctx.createBuilder()
let i32ty = ctx.getInt32Ty()
let fty = ctx.getFunctionType(i32ty, [i32ty, i32ty])
let func = mod.addFunction(fty, "add")
let bb = func.addBasicBlock(name="entry")
builder.setInsertPoint(bb)
let arg0 = func.getArg(0).unwrap()
let arg1 = func.getArg(1).unwrap()
let add_res = builder.createAdd(arg0, arg1, "add_res")
let _ = builder.createRet(add_res)
inspect(func, content=...)
}
优势:没有裸指针,对象生命周期由MoonBit管理,开发者专注于IR逻辑构建。
项目地址:https://github.com/moonbitlang/mbtcc
mbtcc是一个完全用MoonBit实现的C11编译器,展示了MoonBit在编译器开发领域的强大能力。该项目能够编译大型C项目,包括链表、哈希表、堆等数据结构,以及快速排序、Dijkstra、Kruskal等算法。
pubenumToken {
// 关键字
Int; Return; If; Else; ...
// 符号
Plus; Minus; LBrace; RBrace; Semi; ...
// 字面量、标识符
Identifier(String)
IntLit(String)
StringLiteral(String)
// 特殊token(宏)
Hash; Hash2
// 文件结束
EOF,
}
pubfnParserContext::tokenize(self: Self) -> Unit {
loopself.code[:] {
[] => { self.alltoks.push(...); break }
[' ' | '\n' | '\r' | '\t', ..rest] => { continue rest }
[.. "//", ..] => { continueself.skip_line_comment() }
[.. "/*", ..] => { continueself.skip_block_comment() }
[.. "->", ..rest] => { self.add_tok(Arrow); continue rest }
['-', ..rest] => { self.add_tok(Minus); continue rest }
['a'..'z' | 'A'..'Z' | '_', ..] as chunk => {
continueself.tokenize_identifier_or_keyword(chunk)
}
}
}
pubfnParserContext::preprocess(self: Self) -> Unit {
let new_toks: Array[Token] = []
let def_toks: Map[String, Array[Token]] = Map::new()
loopself.toks[:] {
// 处理 #include "file.h"
[Hash, Identifier("include"), StringLiteral(f), ..rest] => {
let included_tokens = lex_and_preprocess(f)
new_toks.push_all(included_tokens)
continue rest
}
// 处理 #define PI 3.14
[Hash, Identifier("define"), Identifier(def_name), ..def_body] => {
def_toks[def_name] = def_body
continue rest
}
// 宏展开
[Identifier(name), ..rest] if def_toks.contains_key(name) => {
new_toks.push_all(def_toks[name])
continue rest
}
[tok, ..rest] => { new_toks.push(tok); continue rest }
[] => break,
}
self.toks = new_toks
}
fnParserContext::parse_prim_expr(
self: Self, toks: ArrayView[Token]
) -> (PrimExpr, ArrayView[Token]) raise {
match toks {
// 标识符(但不能是类型名)
[Identifier(name), ..rest] if !ctx.typedefs.contains(name) =>
(PrimExpr::Identifier(name), rest)
// 常量值
[Constant(c), ..rest] => (Constant(c), rest)
// 字符串字面量可连接:"hello" " world"
[StringLiteral(lit), ..rest] => {
letmut s = lit
let rest = loop rest {
[StringLiteral(next_lit), ..next_rest] => {
s += next_lit
continue next_rest
}
r => break r
}
(PrimExpr::StringLiteral(s), rest)
}
// 括号表达式:( expr )
[LParen, ..rest] => {
let (expr, rest_after_expr) = Expr::parse(rest, ctx)?
guard rest_after_expr is [RParen, ..rest_after_paren] else {
raise ParseError("Expected ')'")
}
(ParenExpr(expr), rest_after_paren)
}
_ => raise ParseError("Unrecognized primary expression")
}
}
structCodeGenContext {
sym_table: Map[String, &LLVMValue]
// ... LLVM context, builder, module等
}
fnIfStmt::codegen(self: IfStmt, ctx: CodeGenContext) -> Unit {
let builder = ctx.builder
let func = builder.getInsertBlock().getParent()
// 创建基本块
let then_bb = func.addBasicBlock(name="then")
let else_bb = func.addBasicBlock(name="else")
let merge_bb = func.addBasicBlock(name="ifcont")
// 条件代码生成
let cond_val = self.cond.codegen(ctx)
// 创建条件跳转
builder.createCondBr(cond_bool, then_bb, else_bb)
// 填充then块
builder.setInsertPoint(then_bb)
self.then_branch.codegen(ctx)
builder.createBr(merge_bb)
// 填充else块
builder.setInsertPoint(else_bb)
ifself.else_branch is Some(e) { e.codegen(ctx) }
builder.createBr(merge_bb)
// 继续代码生成
builder.setInsertPoint(merge_bb)
}
使用mbtcc编译斐波那契函数:
intfib(int n){
if (n <= 2) { return1; }
return fib(n-1) + fib(n-2);
}
生成的LLVM IR:
define i32 @fib(i32 %n) {
entry:
%cmp = icmp sle i32 %n, 2
br i1 %cmp, label %if.then, label %if.else
if.then:
ret i32 1
if.else:
%sub1 = sub nsw i32 %n, 1
%call1 = call i32 @fib(i32 %sub1)
%sub2 = sub nsw i32 %n, 2
%call2 = call i32 @fib(i32 %sub2)
%add = add nsw i32 %call1, %call2
ret i32 %add
}
测试方案:mbtcc采用与GCC对拍的严格测试流程,确保编译结果正确性。
相比传统语言,MoonBit在构建编译器时具有独特优势:
关键优势:
MoonBit AI助手:
AI优势:
// 扁平化语言设计,适合Transformer架构
// 传统语言的多层嵌套:
fnexample() {
if condition {
for item in items {
match item {
Some(value) => { ... }
None => { ... }
}
}
}
}
// MoonBit的扁平化设计更适合AI理解
fnexample() {
if condition { process_items(items) }
}
在线体验:https://try.moonbitlang.cn
特点:
# 支持的目标平台
moon build --target wasm32 # WebAssembly(原生支持)
moon build --target js # JavaScript
moon build --target x86_64-linux # Linux
moon build --target x86_64-windows # Windows
moon build --target x86_64-macos # macOS
moon build --target aarch64-linux # ARM Linux
moon build --target riscv64-linux # RISC-V(新兴架构)
# 包管理
moon add # 添加依赖
moon update # 更新依赖
# 代码检查
moon check # 类型检查
moon fmt # 代码格式化
moon test# 运行测试
# 构建系统
moon build # 编译项目
moon run # 运行项目
moon bench # 性能测试
// main.mb
fnmain() {
println("Hello, MoonBit!")
}
# 编译运行
$ moon run
Hello, MoonBit!
// 定义学生结构体
structStudent {
name: String
age: Int
scores: Array[Int]
}
// 方法定义
fnStudent::average(self: Student) -> Double {
let sum = self.scores.reduce(fn(acc, x) { acc + x }, 0)
sum.to_double() / self.scores.length().to_double()
}
// 使用
let student = Student {
name: "张三"
age: 18
scores: [90, 85, 95, 88, 92]
}
println(student.name + "的平均分: " + student.average().to_string())
// 泛型函数
fnfind_max[T: Comparable](arr: Array[T]) -> T {
letmut max = arr[0]
for i in1..arr.length() {
if arr[i] > max {
max = arr[i]
}
}
max
}
// 使用
let numbers = [3, 1, 4, 1, 5, 9, 2, 6]
let max_num = find_max(numbers)
let words = ["apple", "banana", "cherry"]
let max_word = find_max(words)
// 异步任务
asyncfnfetch_data(url: String) -> String {
// 模拟网络请求
await sleep(1000)
"数据内容"
}
// 并发执行
asyncfnmain() {
let task1 = fetch_data("https://api.example.com/data1")
let task2 = fetch_data("https://api.example.com/data2")
let task3 = fetch_data("https://api.example.com/data3")
// 等待所有任务完成
let results = await_all([task1, task2, task3])
for result in results {
println(result)
}
}
// 简单的 Web 服务器
import http
fnhandle_request(req: Request) -> Response {
match req.path {
"/" => Response::ok("欢迎使用 MoonBit Web 服务")
"/api/users" => Response::json(get_users())
"/api/time" => Response::json(get_current_time())
_ => Response::not_found("页面不存在")
}
}
fnmain() {
let server = HttpServer::new(8080)
server.route("/", handle_request)
server.start()
println("服务器运行在 http://localhost:8080")
}
// 编译到 WebAssembly
export fnadd(a: Int, b: Int) -> Int {
a + b
}
export fnfibonacci(n: Int) -> Int {
if n <= 1 {
n
} else {
fibonacci(n - 1) + fibonacci(n - 2)
}
}
// 在 JavaScript 中调用
// import { add, fibonacci } from './moonbit_module.mjs'
console.log(add(10, 20)) // 30
console.log(fibonacci(10)) // 55
| 类型系统 | ||||
| 内存管理 | ||||
| 编译速度 | ||||
| 运行性能 | ||||
| 学习曲线 | ||||
| 并发模型 | ||||
| 错误处理 | ||||
| WebAssembly | ||||
| 国产自主 |
MoonBit 最适合:
✓ 云原生应用开发
✓ WebAssembly 应用
✓ 边缘计算
✓ 系统编程
✓ 跨平台工具
Rust 最适合:
✓ 系统级编程
✓ 嵌入式开发
✓ 游戏引擎
✓ 操作系统
Go 最适合:
✓ 微服务架构
✓ 云基础设施
✓ DevOps 工具
✓ 网络服务
Java 最适合:
✓ 企业级应用
✓ 大数据平台
✓ Android 开发
✓ 传统后端服务
// 核心库
import core/array // 数组操作
import core/string // 字符串处理
import core/io // 输入输出
import core/fs // 文件系统
import core/net // 网络通信
// 并发库
import core/async// 异步编程
import core/channel // 通道通信
// 数据结构
import core/vec // 动态数组
import core/hashmap // 哈希表
import core/queue // 队列
# moon.pkg
[package]
name = "my_project"
version = "0.1.0"
[dependencies]
moonbitlang/core = "0.1.0"
moonbitlang/http = "0.2.0"
第1周:基础语法
├── 变量与常量
├── 基本数据类型
├── 函数定义
└── 控制流程
第2周:类型系统
├── 结构体
├── 枚举类型
├── 模式匹配
└── 泛型编程
第3周:高级特性
├── 错误处理
├── 异步编程
├── 模块系统
└── 包管理
第4周:实战项目
├── mbtcc(C编译器)学习
├── WebAssembly 应用
├── 云端开发
└── 性能优化
// 云函数示例
export asyncfnhandler(event: Event) -> Response {
let data = parse_json(event.body)
let result = process_data(data)
Response::json(result)
}
// 边缘设备数据处理
fnprocess_sensor_data(data: SensorData) -> Decision {
if data.temperature > 50 {
Decision::Alert("温度过高")
} elseif data.humidity > 80 {
Decision::Warning("湿度过高")
} else {
Decision::Normal
}
}
// 一次编译,多平台运行
fnmain() {
let args = Args::parse()
match args.command {
Command::Build => build_project()
Command::Test => run_tests()
Command::Deploy => deploy_app()
}
}
✅ 推荐学习:
❌ 暂不推荐:
MoonBit 发展路线图:
2024 Q3:✅ 正式发布
2024 Q4:IDE 插件完善
2025 Q1:标准库扩充
2025 Q2:WebAssembly 优化
2025 Q3:企业级案例
2025 Q4:社区生态建设
2026年 :大规模应用推广
官方资源:
学习资源:
相关技术:
MoonBit 作为中国首个自主研发的通用编程语言,不仅是技术突破,更是中国在基础软件领域的重要里程碑。其AI原生和云原生的独特定位,使其在人工智能时代具有独特优势。
无论你是系统编程爱好者、WebAssembly开发者,还是关注国产基础软件的技术人员,MoonBit 都值得你关注和尝试。
立即体验:访问 https://try.moonbitlang.cn 在线体验 MoonBit 云IDE
感谢阅读,欢迎大家点赞转发!