Announcement

👇Official Account👇

Welcome to join the group & private message

Article first/tail QR code

Skip to content

Mojo 1.0 正式发布深度解析:LLVM 之父的"AI 时代系统语言"终于迎来稳定地基

导语

2026 年 8 月 11 日,Modular 公司正式发布 Mojo 1.0——这个由 LLVM/Swift 之父 Chris Lattner 主导、定位"AI 时代系统语言"的项目,自 2023 年首次公开以来,终于交出了第一份稳定版本。

Mojo 的野心很大:Python 的语法、Rust 的安全与性能、C 的可控底层,再加上 MLIR 带来的异构加速能力。过去三年它一直在高速演进,代价是 API 频繁变动、社区难以维护长期项目。1.0 的核心使命正是终结这种"每天都在搬家"的状态,为生态提供一个可以放心长期构建的地基。

本文将拆解 Mojo 1.0 到底带来了什么:稳定性政策如何设计、语言做了哪些"收敛"(一个概念只留一个名字)、指针安全边界如何重新划分、interior origins 如何堵住一类悬垂引用漏洞,以及编译器开源承诺与未来路线图。


一、背景:Python 语法 + Rust 性能的"AI 时代系统语言"

1.1 从 LLVM 到 Mojo:Chris Lattner 的下一个战场

要理解 Mojo,先要理解它的出身。2022 年 1 月,Chris LattnerTim Davis 联合创立了 Modular 公司:

  • Chris Lattner:LLVM、Clang、MLIR、Cloud TPU 与 Swift 语言的缔造者,先后在 Apple、Google、SiFive、Tesla 主导核心系统开发
  • Tim Davis:Google Brain 与 Core Systems 的产品负责人,参与构建了 TensorFlow、XLA、MLIR 编译器与运行时,以及 TF Lite、Android ML、NNAPI 等移动端 AI 基础设施

两人联手的目标很直接:AI 基础设施的编译器与运行时栈"碎片化"太严重,他们想用 MLIR(Multi-Level Intermediate Representation) 统一底层,并在其上构建一门全新的系统语言——这就是 Mojo。

1.2 2026 年 7 月:被 Qualcomm 收购

一个重要的背景变化:2026 年 7 月 29 日,Modular 被 Qualcomm 收购。Modular 官网页脚已标注"Copyright © 2026 Modular Inc, A Qualcomm Company"。这笔收购让 Mojo 背靠芯片巨头,与硬件加速、端侧 AI 的绑定更深。

1.3 为什么要 1.0:稳定是生态生长的前提

Mojo 自 2023 年首次发布以来一直在快速演进,Modular 内部大量生产级使用推动了语言飞速成熟。但"快"是有代价的——频繁的破坏性变更让社区难以维护长期项目

正如官方博客所说:1.0 的首要目标不是新功能,而是"提供一个开发者可以放心长期构建的稳定地基"。今天的 Mojo 已经不是"正在开发的语言",而是 Modular 自家商业基础设施(MAX 平台与 Modular Cloud)每天在生产环境依赖的基石。


二、1.0 的承诺:稳定地基 + 加性演进

2.1 稳定性政策:1.x 期间以加性变更为主

Mojo 1.0 开始正式定义语言与标准库的稳定性政策:

  • 1.x 期间,变更应该主要是"加性"(additive)的——新功能、新 API 可以不断加入,但已有代码不应频繁被破坏
  • 破坏性变更仍然可能发生,但会被谨慎管理,遵循成熟语言(如 C++)的演进标准
  • 大多数核心语言特性已标记为稳定——不会被移除或以破坏源码兼容的方式更改
  • 标准库开始逐步标记稳定 API——从刻意选定的"小集合"起步,后续版本再逐步扩大

2.2 社区数据:开放源码标准库的力量

自 Mojo 开放标准库源码以来,社区贡献相当可观:

指标数据
贡献者200
合并的 Pull Request1100+
改动代码行数20 万+
提交 Issue 的开发者千余人

官方在发布博客中特别致谢了这些"语言建筑师"——从提交 issue、打开 PR、写语言提案到构建包,社区与 Modular 共同塑造了这门语言。

2.3 首批稳定的标准库 API

1.0 开始标记稳定的 API 是刻意保守的一小集合:

  • 完整稳定的 traitDeinitableMovableCopyableImplicitlyCopyable
  • 核心容器Array(原 InlineArray)、ListSpan
  • 字符串String
  • 基础类型BoolOptional

稳定状态会在 API 参考文档中逐 API 标注。这也意味着:只要避开未稳定 API,你的 Mojo 代码在未来 1.x 版本里会一直能编译


三、语言收敛:一个概念只留一个名字

1.0 做了大量"收敛"工作——过去 Mojo 对同一概念常提供多种表达方式,现在统一成一个。官方称之为"完成语言简化与清理的最后一轮"。

3.1 变量声明:统一用 var

隐式变量声明已被弃用,编译器会给出带修复建议(fix-it)的警告:

mojo
x = 0        # 警告:'x' 的隐式声明已弃用;请在名字前加上 'var'
var x = 0    # 正确写法,无警告

每条首次赋值语句都会触发警告(包括 walrus 操作符 := 目标和裸 x: T 注解)。for 目标、with ... asexcept ... as、推导式目标等本来就把绑定方式写明的形式不受影响。

3.2 lambda 表达式:Python 风格的内联闭包

Mojo 1.0 引入了 Python 风格的 lambda 表达式——匿名单表达式闭包,脱糖(desugar)为嵌套 def。与 Python 不同的是,参数带括号且带类型标注:

mojo
lambda (x: Int) {} -> Int: x + 1

规则要点:

  • 与 Python 一致:函数体是单个表达式,无 return
  • 可省略捕获列表 {…} 与返回类型:省略捕获列表时对函数体自由变量做 imm 捕获(无自由变量则为 thin);省略返回类型默认为 None
  • 薄 lambda(无捕获)就是函数值,等价于按名引用的 def;任何其他 lambda 是闭包实例,是运行时值而非函数类型

3.3 大规模重命名:让词汇更精确一致

这一轮把漂移的词汇统一了:

旧拼写新拼写说明
sizelength全库统一
InlineArrayArray首个参数 ElementTypeT,第二参数 sizelength
StringSliceStringSpanSpan 家族对齐
ImplicitlyDestructibleDeinitable析构函数 __del__()__deinit__(),与 __init__() 对齐
readimm参数与闭包捕获约定

旧名字大多保留为弃用别名,并带编译器 fix-it,迁移是机械化的。

3.4 类型合并:Int 变成 Scalar 别名

重复的类型也被合并了:

  • Int 现在是 Scalar[DType.int] 的别名
  • 基于 Int 和基于 Scalar 的两套 range() 类型统一为单个 dtype 参数化家族

四、指针统一:安全边界重新划分

4.1 一个 Pointer,两种语义

过去 Mojo 有 PointerUnsafePointer 两个指针类型。1.0 将两者统一为单一 Pointer 类型:不安全不再标记在类型上,而是标记在单个操作上。

类型别名也相应收敛:

旧拼写新拼写
UnsafePointerPointer
MutUnsafePointerMutPointer
ImmUnsafePointer / ImmutUnsafePointerImmPointer
OptionalUnsafePointerOptionalPointer

4.2 危险操作必须显式写 unsafe_ 前缀

所有个体上不安全的指针操作统一改名,调用时必须显式写出危险意图:

旧操作新操作
ptr[i]ptr[unsafe_offset=i]
ptr + iptr.unsafe_offset(i)
load()unsafe_load()
store()unsafe_store()
strided_load() / strided_store()unsafe_strided_load() / unsafe_strided_store()
gather() / scatter()unsafe_gather() / unsafe_scatter()
as_noalias()unsafe_as_noalias()
mut_cast()unsafe_mut_cast()
take_pointee()unsafe_take_pointee()
init_pointee_move()unsafe_write(value^)
init_pointee_copy()unsafe_write(copy=value)
destroy_pointee()unsafe_deinit_pointee()
free()unsafe_free()(分配应迁移到 layout-aware 的 memory.alloc

memset 等裸内存函数同样加上了 unsafe_ 前缀。旧的无前缀名字仍可用,但会发出弃用警告,并从生成的文档中隐藏。每个方法的 docstring 都写明了调用者必须满足的确切 Safety: 要求。

4.3 UnsafeAnyOrigin 不再容易"误得"

UnsafeAnyOrigin 是一个危险逃生舱——它会静默延长无关生命周期、关闭独占性检查,因此绝不能被隐式施加。1.0 中:

  • 隐式将 UnsafePointer 的 origin 扩宽为 UnsafeAnyOrigin 的转换已弃用
  • struct 字段不能再藏匿 UnsafeAnyOrigin(如 var ptr: Pointer[Int, MutUnsafeAnyOrigin] 现在直接报错)
  • 若确需丢弃具体 origin,必须显式调用 as_unsafe_any_origin()

五、内存安全新防线:interior origins

5.1 一类经典悬垂引用漏洞

容器在扩容(如 List.append 触发重新分配)后,之前取得的元素引用会指向已释放的内存。过去 Mojo 的 lifetime checker 看不到这一层,持有引用的代码会在重新分配后静默悬垂

5.2 1.0 的答案:容器内部起源

1.0 引入实验特性 interior origins:容器现在返回绑定到"容器内部起源"的元素引用,而不是整个容器的起源。跨修改持有引用会被 lifetime checker 直接拒绝

mojo
var list = [1, 2, 3]
ref elem = list[0]
list.append(4)   # 可能触发重新分配,elem 随之失效
print(elem)      # 错误:使用了已失效的内部引用

5.3 覆盖范围

采用 interior origins 的类型包括:ListDequeVariantStringDictLinkedListOwnedPointerHostBuffer。对这些容器的引用或视图现在携带 interior origin——跨修改持有它们将被拒绝,而不是在重新分配后静默悬垂。

这填补了 Mojo 内存安全模型里一块重要的空白:类型安全 + lifetime 检查现在延伸到容器内部


六、显式优于隐式:宁可多敲几个字

1.0 的另一个主旋律是"把推断规则和静默默认值写下来"。

6.1 语法强制

  • **kwargs 现在直接报错,必须写 var **kwargs(编译器自动插入修复)
  • 方法的 self 必须声明为 Self 类型;自定义 self 类型请改用 where 子句
  • 闭包 trait 一致性必须显式声明:此前兼容 __call__() 的鸭子类型不再被接受,必须在继承列表中写出 trait
mojo
struct Double(def(Int) -> Int):      # 1.0 起必须显式声明
    def __call__(self, x: Int) capturing -> Int:
        return x * 2
  • 关键字变参可以转发:支持 Python 风格的 ** 语法
mojo
def takes_them(var **kwargs: Int): ...
def pass_them(var **kwargs: Int):
    takes_them(**kwargs^)

6.2 import 系统重构:名字解析显式化

导入系统被整体重构,规则更一致:

  • 目录内解析优先级固定:源码包 → 预编译 .mojoc → 源码模块 → 旧式 .mojopkg
  • 相对导入必须用 fromfrom . import foo),import .foo 不再可用
  • 绝对导入 import a.b.c 现在会把 aa.ba.b.c 全部绑定进作用域
  • 包内跨模块访问必须显式 import,隐式访问已弃用
  • 同名函数跨模块合并成重载集已弃用并警告
  • 通配符导入按文本顺序"后者优先"解析

6.3 正确优先:宁可拒绝,不可静默出错

一批"以前默默做了防御性但错误行为"的 API 现在要么拒绝、要么做正确的事:

场景1.0 之前1.0 之后
无效连续切片索引静默 clamp 或 wrap直接中止程序
for c in my_string按码点迭代默认按字素簇(屏幕上感知的一个字符)
range() 非数值/无限循环 float接受拒绝
size_of() 超对齐类型返回存储大小,List 中可致内存破坏返回分配大小(stride),修复损坏

其中 size_of() 的修复很关键:对存储大小不是对齐倍数(如 @align(N) 超过自然对齐的 struct)的类型,旧行为会让 List 扩容时按 count * size_of 拷贝出问题——现在返回元素间 stride,从根上修掉了这处内存破坏。


七、性能与互操作

7.1 Python 互操作提速约 12x

PythonObject 的算术、比较、成员操作符不再走"Python 属性查找 + 绑定方法调用",而是直接通过 CPython 的抽象协议分发。官方数据:互操作热路径大约 12x 更快,且更贴近标准 Python 操作符语义。

7.2 列表表达式默认构造 Array

[1, 2, 3] 这样的列表表达式,默认类型从 List 改为 Array——静态大小的栈上/内联存储,消除隐式堆分配

mojo
var x = [1, 2, 3]
# type_of(x) = Array[Int, 3]

同时支持从字面量推断容器类型:

mojo
var x: List[_] = [1, 2, 3]
var y: List = [1.0, 2.0, 3.0]

7.3 其他性能与类型改进

  • Struct 默认 Movable:不再需要显式声明可移动;用 Movable where <cond> 收窄,或用 Movable where False 完全退出
  • == / != 支持类型相等判断
  • where 子句可带字符串消息:约束失败时编译器输出可操作提示
mojo
def foo[sc: Int]() where (sc > 1, "scaling factor must be greater than 1"):
    ...
  • TypeList.all_conforms_to() 现在能细化参数包中的每个元素,条件一致性推理更强

八、Mojo 与 MAX 的边界:各归其位

1.0 明确划清了 Mojo 语言与 MAX 平台的边界。

8.1 包移动

  • 加速器编程相关的一些标准库 API 移到了新的 max Mojo 包
  • layout 包改为随 MAX 分发,不再随 Mojo
  • GPU 编程文档整体迁移到 MAX 文档站

8.2 Int/UInt 不再能传给 GPU kernel

一个值得注意的破坏性变更:IntUInt 不再符合 DevicePassable,不能再直接传给 GPU kernel。原因是它们是"平台宽度"的索引类型——当宿主机与设备对宽度认知不一致时,传递会错误编译。请改用固定宽度类型(如 Int32)。

这本质上是在说:把"索引"和"数据"区分开,跨设备边界必须用宽度确定的数据类型

8.3 MAX 26.5 的配套更新

  • 安装更简单:max["serve"]max["benchmark"]max["all"] 按需装依赖(conda 对应 max-servemax-benchmark);modular 包将在 26.6 退役
  • 新增两个模型家族支持:GLM-5.2Nemotron-H(均为混合 Mamba-2 模型)
  • Kimi 2.5 支持新的 Module V3 模型创作路径
  • 开源 Agent Skills 累计 7.2K+ 下载(skills.sh)

九、路线图:1.0 不是终点

9.1 下一步:让 Mojo 成为真正的通用系统语言

官方明确表示,Mojo 已在高性能计算(CPU/GPU/加速器)领域站稳,下一阶段是拓宽地基,成为真正出色的通用系统编程语言

  • 健壮的异步编程模型
  • 模式匹配(pattern matching)与 unions
  • 以及路线图上的更多能力

9.2 开源承诺不变:2026 年开源编译器

这是 Mojo 社区最关注的一条:"我们的承诺不变——将在 2026 年开源 Mojo 编译器与工具链。" Mojo 将逐步开源更多语言组件,以及用 Mojo 构建的 MAX 组件。一旦编译器开源,这门语言的发展轨迹将与今天完全不同。

9.3 ModCon '26:就在今天

2026 年 8 月 18 日(今天),旧金山,Modular 将举办 ModCon '26 大会,官方会在会上分享 Mojo、MAX 与开源的最新计划。Mojo 官网当前挂着醒目的横幅:"Mojo will be open source soon! Join us at ModCon '26 for an update."——也就是说,开源时间表的具体信息极有可能在这场大会上揭晓。支持线上直播观看。


十、如何开始

1.0 的安装/升级非常简单——Mojo 通过 Python 生态分发:

bash
# 安装或升级 Mojo
uv pip install --upgrade mojo

# 需要 MAX 平台时
uv pip install max[all]

也可以使用 pixi、conda、pip 等任一 Python/Conda 包管理器。文档方面,1.0 新增了 lambda 手册页、C FFI 指南(调用 C 库)、一页速查表(cheat sheets),并重写了 traits 与指针文档。

配套的 Mojo AI Skills 已"1.0 ready",覆盖新项目创建、GPU 编程、从其他语言移植等场景,AI 编程代理可以直接调用。


十一、总结

Mojo 1.0 是一场目标清晰的"收束":

  • 稳定承诺:1.x 以加性变更为主,核心语言特性稳定,标准库从一小集合开始标记稳定 API——开发者终于可以放心构建长期项目
  • 语言收敛var 统一声明、lambda 标准化、sizelength 等大规模重命名、IntScalar 类型合并——一个概念一个名字
  • 安全边界Pointer/UnsafePointer 统一 + 每个危险操作显式 unsafe_ 前缀;UnsafeAnyOrigin 逃生舱收紧
  • 内存安全补课:interior origins 让容器元素引用跨修改失效可被编译期拒绝,堵住一类静默悬垂漏洞
  • 显式优于隐式self 必须是 Self、裸 **kwargs 报错、import 系统重构、错误切片直接中止——正确优先于便利
  • 性能与互操作:Python 互操作热路径 12x、列表表达式默认 Array 消除隐式堆分配
  • 边界清晰:加速器 API 归入 max 包,Int/UInt 不再跨设备传递
  • 前方:异步模型、模式匹配与 unions 在路上;2026 年开源编译器与工具链的承诺不变;ModCon '26 就在今天

对开发者而言,1.0 是重新评估 Mojo 的时机。 如果你想要"Python 的开发体验 + 系统级性能",且能接受一门仍在快速生长的年轻语言,现在的地基已经足够你开始认真构建了。而如果编译器如约在今年开源,Mojo 很可能会成为 2026 年系统编程领域最大的变量之一——LLVM 之父的又一次豪赌,值得持续关注。


参考来源

上次更新于: