5月7日,由 Chris Lattner 创立的 Modular 公司正式发布了 Mojo 编程语言的 v1.0.0b1 稳定版本。相比此前偏向概念介绍的发布,这一版本带来了大量触及语言核心与系统编程层面的实质性变更——从关键字统一到指针非空设计,再到全平台 GPU 硬件支持的扩展,标志着 Mojo 正在从「实验性语言」向「生产可用」快速演进。

语言统一:fn 被废弃,def 成为唯一函数关键字
最引人注目的语法变化是 fn 关键字正式被标记为 deprecated,并将在下一版本变为编译错误。自 v0.26.2 启动的 def/fn 统一工作至此完成:def 成为 Mojo 唯一的标准函数声明关键字,且继承了原本 fn 的非抛异常语义。现有代码中的 fn 会在编译时收到警告,开发者需要尽早迁移。
与此同时,闭包机制也完成了统一。无状态闭包会自动提升为顶层函数,可作为 FFI 回调传递;新的 thin 函数效应声明了不携带捕获状态的纯函数指针类型;而 abi("C") 效应则允许函数使用平台 C ABI,实现与 C 库的安全互操作。捕获列表语法 {mut a, b, c^, read} 也正式定型,支持按可变引用、不可变引用和移动语义显式捕获变量。
内存安全:UnsafePointer 非空化,集合默认开启边界检查
Mojo 在内存安全方面迈出了重要一步。UnsafePointer 现在被设计为非空指针:默认的空构造函数和 __bool__() 方法已被废弃,且不再遵循 Defaultable 和 Boolable trait。开发者需要用 Optional[UnsafePointer[...]] 来表达可空性。由于 null 地址被用作 Optional 的 None niche,这种表达仍然是零开销且 FFI 安全的。
标准库集合也默认开启了边界检查。所有 CPU 上的集合(List、Span、InlineArray、String 等)在越界访问时会直接报告用户调用点,而非静默崩溃。负索引也被彻底移除——x[-1] 现在会触发编译期错误,必须改用 x[len(x) - 1]。GPU 上的边界检查默认关闭以保证性能,但可通过 -D ASSERT=all 显式开启。
GPU 编程:苹果/AMD/英伟达全平台覆盖
本次更新在 GPU 支持上的投入尤为突出。Apple Metal 方面,print() 首次在 Apple GPU 上可用,动态线程组内存 external_memory[]() 获得支持,Apple M5 的 MMA 硬件矩阵乘加指令也通过 apple_mma_load() 等 intrinsic 暴露出来。AMD 阵营新增了对 MI250X 加速卡的支持。英伟达方面则加入了对 B300(sm_103a) 的识别与调度支持。
此外,GPU 原语访问器(thread_idx、block_idx、grid_dim 等)的返回类型从 UInt 统一迁移为 Int,这是 Mojo 向「所有尺寸和偏移量使用 Int」方向迈出的关键一步。CPU 端的 DeviceContext(api="cpu") 现在也变成了流有序执行上下文,支持 enqueue_cpu_function() 和 enqueue_cpu_range(),为未来的 NUMA 感知 CPU 调度铺平了道路。
字符串与反射:Unicode 字形簇与编译期类型细化
String 和 StringSlice 新增了对 UAX #29 字形簇(grapheme cluster) 的分段支持,能正确处理组合修饰符、emoji ZWJ 序列、国旗 emoji、韩语音节等多码点簇。新增的 graphemes()、count_graphemes() 和 [grapheme=...] 切片语法让文本处理更加精确。纯 ASCII 文本的 count_graphemes() 有大约 10 倍的加速。
类型系统方面,编译器现在能基于 where 子句、comptime if 和 comptime assert 进行类型细化。只要编译期能证明某类型满足某 trait,就可以直接调用其 trait 方法,无需再使用 trait_downcast。反射 API 也整合为统一的 reflect[T]() 入口,取代了原先分散的 struct_field_* 和 get_type_name 等自由函数。
工具链与生态
调试器体验大幅改善:Variant 和 Optional 在 LLDB 中现在直接显示为 Int(42) 或 Some(value),而非原始内部结构;标量类型直接显示数值;UnsafePointer 支持所有类型的正确显示。LSP 响应速度通过缓存和延迟解析得到了优化,长会话中的代码补全从 O(N²) 降至摊还 O(1)。Mojo 包文件(.mojopkg)升级到格式 v2,采用 zstd 压缩的 MLIR 字节码,显著减小包体积。
总结
v1.0.0b1 的发布说明 Mojo 的语言核心正在快速收敛。从 fn 的退场到 UnsafePointer 的非空设计,从默认边界检查到全平台 GPU 支持的铺开,这些变化都在传递一个明确信号:Mojo 不再只是「更快的 Python」Demo,而是一门正在建立自己工程纪律的系统级编程语言。
参考来源:Mojo v1.0.0b1 发布说明、Mojo 官网