AI 中文社区(简称 AI 中文社),是国内学习交流AI人工智能技术的中文社区网站,这里可获取及贡献任何AI人工智能技术,我们追求自由、简洁、纯粹、分享的多元化人工智能社区。

Mojo v1.0.0 官方发布说明

随笔 · 杰作 10小时前发布 · 浏览22次 · 点赞0次 · 收藏0次

Mojo v1.0.0

2026年8月11日

核心亮点

随着Mojo 1.0版本发布,我们正式启动Mojo语言与标准库的稳定性政策制定工作。我们已开始将标准库API标记为稳定版本——即不会被移除,也不会以破坏源码兼容性的方式进行改动。首批稳定API范围经过审慎控制,后续版本将逐步扩大稳定覆盖范围。详情参见:https://mojolang.org/releases/v1.0.0/#1-0-0-library-stabilizations


为打磨好1.0版本的命名规范、默认行为与安全边界,本次版本包含的破坏性变更多于常规版本。但几乎所有破坏性变更都配套了弃用别名与编译器自动修复提示,迁移可机械化完成。


语言易用性提升:Mojo新增Lambda表达式——一种匿名单表达式闭包,会被解包为嵌套def函数。列表表达式现在默认构造Array而非List;关键字可变参数可通过Python风格的**语法转发给其他函数。参见:https://mojolang.org/releases/v1.0.0/#1-0-0-language-enhancements


内存安全与指针类型统一PointerUnsafePointer已合并为单一的Pointer类型,不安全属性现在标记在具体操作上,而非整个类型。相应地,UnsafeAnyOrigin也更难被意外获取:隐式宽化转换为该类型已被弃用,结构体字段也无法再隐藏该类型。参见:https://mojolang.org/releases/v1.0.0/#1-0-0-pointer-memory


生命周期检查器现已支持识别容器内部引用:一项名为**内部起源(interior origins)**的实验性功能,让ListDictString等类型返回的元素引用绑定到容器内部起源,因此在容器发生变更后仍持有元素引用的代码会被直接拒绝,避免重分配后引用悬空的隐性问题。参见:https://mojolang.org/releases/v1.0.0/#1-0-0-language-enhancements 与 https://mojolang.org/releases/v1.0.0/#1-0-0-collections


显式优先于隐式:多项推导规则与静默默认行为现在需要显式书写。不写var声明变量的写法已被弃用;方法的self参数必须标注为Self类型;裸写的**kwargs必须写为var **kwargs。导入系统已全面重构,名称解析更显式、行为更一致。参见:https://mojolang.org/releases/v1.0.0/#1-0-0-language-changes


一个概念对应一个名称、一种类型:本次版本整合了此前分散的命名规范:全局统一用length替代sizeInlineArray更名为ArrayStringSlice更名为StringSpanImplicitlyDestructible更名为Deinitable,析构方法统一为__deinit__()read参数约定更名为imm。重复类型也做了合并:Int现在是Scalar[DType.int]的别名;基于Int与基于Scalarrange()类型已统一为单一一族、按数据类型参数化的类型。参见:https://mojolang.org/releases/v1.0.0/#1-0-0-library-changes 与 https://mojolang.org/releases/v1.0.0/#1-0-0-simd-numeric


容器支持更多类型:管理唯一资源的类型现在可存入容器。多种容器类型仅在元素类型符合Deinitable时才自身符合Deinitable,因此存放需显式销毁元素的容器现在可以正常编译(此前无法编译);这类容器必须通过新增的deinit_with()方法完成销毁。OptionalVariant也支持不可移动(非Movable)的元素类型。参见:https://mojolang.org/releases/v1.0.0/#1-0-0-linear-types


约束承担更多能力where子句支持传入字符串字面量,作为约束失败时编译器输出的提示信息;TypeList.all_conforms_to()可对参数包的每个元素做类型细化;类型相等判断现在使用==!=书写。结构体类型默认符合Movable,可通过Movable where <cond>收窄符合条件。参见:https://mojolang.org/releases/v1.0.0/#1-0-0-language-enhancements 与 https://mojolang.org/releases/v1.0.0/#1-0-0-type-system


默认正确优先,即便牺牲便利性:此前静默执行“看似合理但实际错误”行为的API,现在要么直接拒绝非法输入,要么执行正确逻辑。使用非法连续切片做索引会直接终止程序,而非静默截断或回绕;字符串迭代默认输出字素簇,for c in my_string会产出用户在屏幕上感知到的单个“字符”;range()拒绝非数值元素类型与此前会造成死循环的浮点形式;size_of()返回分配大小,修复了List中过对齐类型导致的内存损坏问题。参见:https://mojolang.org/releases/v1.0.0/#1-0-0-collections、https://mojolang.org/releases/v1.0.0/#1-0-0-string 与 https://mojolang.org/releases/v1.0.0/#1-0-0-simd-numeric


更快的Python互操作PythonObject的算术、比较与成员运算符现在通过CPython抽象协议分发,而非先做Python层属性查找再调用绑定方法。这让互操作热点路径性能提升约12倍,同时更贴合标准Python运算符语义。参见:https://mojolang.org/releases/v1.0.0/#1-0-0-python


Mojo与MAX边界更清晰:部分与加速器编程相关的标准库API已迁移至新的max Mojo包;layout包现在随MAX打包发布,而非随Mojo发布。相应地,IntUInt不再符合DevicePassable,无法传入GPU内核——它们是平台相关大小的索引类型,当主机与设备位宽不一致时,将其传入加速器会导致编译错误,请使用Int32等固定宽度类型替代。参见:https://mojolang.org/releases/v1.0.0/#1-0-0-gpu-package-moves 与 https://docs.modular.com/releases/v26.5/

文档更新

  • Lambda表达式已收录于《Mojo手册》https://mojolang.org/docs/manual/functions/lambda/ 与参考文档https://mojolang.org/docs/reference/lambda-expressions/

  • 新增单页速查表:https://mojolang.org/docs/reference/cheat-sheets/

  • 针对全新的统一Pointer类型与基于布局的内存分配,重写了指针使用指南:https://mojolang.org/docs/manual/pointers/using-pointers/

  • 从零重写了Trait(特征)文档:https://mojolang.org/docs/manual/traits/

  • GPU编程及相关主题已迁移至:https://docs.modular.com/gpu/intro-tutorial/

语言增强

Lambda表达式支持

匿名单表达式闭包,会被语法糖解包为嵌套def函数。与Python类似,函数体为单个表达式,无需return;与Python不同的是,参数需带括号并标注类型,与def函数签名一致,例如:

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

捕获列表{…}与返回类型均可省略:省略捕获列表时,会以不可变方式捕获函数体中的自由变量(无自由变量时为瘦函数);省略返回类型时默认为None——因此当表达式返回None类型时,裸写lambda: expr是合法的。这些是固定默认值,而非类型推导(非None返回体仍需显式标注-> T)。


无捕获的瘦Lambda是函数值,与按名称引用的def函数完全等价;其他Lambda是闭包实例,属于运行时值,不具备函数类型。完整规则参见参考文档:https://mojolang.org/docs/reference/lambda-expressions/

内部起源(interior origins)

Mojo新增这项实验性功能,可帮助容器规避一类常见的内存安全问题。例如List现在返回的元素引用绑定到列表的内部起源,而非整个列表的起源,因此对列表执行append()pop()等变更操作会使元素引用失效。生命周期检查器现在能正确拒绝在容器变更后仍持有元素引用的代码,避免重分配后引用悬空的隐性问题:

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

列表表达式默认构造Array

列表表达式现在默认构造Array(而非List),消除了隐式堆分配。例如:

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]

结构体默认符合Movable

结构体类型现在默认符合Movable。若要关闭默认可移动性,可通过Movable where <cond>显式指定条件性符合,或用Movable where False完全取消Movable符合。

关键字可变参数转发

现在可通过Python风格的**语法,将关键字可变参数转发给另一个接收关键字可变参数的函数:

def takes_them(var **kwargs: Int): ...
def pass_them(var **kwargs: Int):
  takes_them(**kwargs^)

动态函数指针类型推导

现在可直接调用携带未绑定类型参数的动态函数指针;编译器会从调用参数推导参数类型,并在间接调用前对被调用方做特化。该能力仅支持特化为单一值的参数,尤其适用于运行时函数调用的起源参数:

var fp: def[a: ImmOrigin](ref [a] x: Int) thin -> None
fp(42)

类型相等判断

Mojo现在支持用==!=进行类型相等判断。

where子句自定义错误信息

where子句现在支持可选的字符串字面量提示信息,写法为where (condition, "message")。约束失败时,编译器会在诊断信息中包含该提示,且所有支持where子句的场景均可使用:函数与结构体尾部约束、结构体条件符合子句、别名/编译期常量声明。

def foo[sc: Int]() where (sc > 1, "scaling factor must be greater than 1"):
...

TypeList约束能力增强

TypeList.all_conforms_to()约束现在保留与直接conforms_to()约束相同的证明结构,因此编译器可将其作为条件符合检查与类型细化的证据。条件符合因此可依托整个类型参数包的特征层级关系;同时还可在wherecomptime assertcomptime if上下文中,对可变类型参数包的每个元素做细化:

def write_all[*Ts: Movable](mut writer: Some[Writer], *args: *Ts):
comptime if Ts.all_conforms_to[Writable]():
comptime for i in range(args.__len__()):
    args[i].write_to(writer)

其他语言增强

  • TypeList.ofTrait参数现在可自动推导,无需显式传入。

  • 冗余的特征组合现在会触发警告,例如AnyType & Copyable

  • 优化了导入位置追踪,诊断信息会显示包含问题代码的包首次被引入程序的完整路径。

语言变更

  1. 变量声明必须加var:隐式变量声明已被弃用,现在会发出警告并提供自动插入var的修复提示。海象运算符:=、裸类型注解x: T等首次赋值场景都会触发警告。

  2. 析构方法统一为__deinit__():与__init__()命名保持一致,旧写法__del__()仍可用,但会发出弃用警告并提供修复提示。

  3. 导入系统全面重构

    • 目录内导入遵循明确优先级:源码包 > 预编译.mojoc文件 > 源码模块 > 旧版.mojopkg文件。

    • 相对导入必须使用from . import foo形式,import .foo不再生效。

    • 绝对导入import a.b.c现在会将aa.ba.b.c全部绑定到作用域,修复了重复导入报错、函数内点分导入失效等问题。

    • 包的子模块仅在__init__.mojo重新导出时才可通过包访问,绝对导入子模块始终有效。

    • 包内隐式访问符号的行为已弃用,必须显式from . import xxx

    • 支持通过普通目录导入模块,支持名称含点的转义标识符包/模块导入。

    • 同名函数重载合并导入已弃用,未来版本将直接拒绝;通配符导入遵循“后导入覆盖先导入”规则。

  4. imm成为首选约定read参数与闭包捕获约定统一改用immread仍可用但很快将被弃用。

  5. size_of返回分配大小:返回值为存储大小向上取整到类型对齐值,修复了过对齐类型在容器中引发的内存损坏问题。

  6. 显式销毁规则更新@explicit_destroy不再用于退出Deinitable符合,请改用Deinitable where False;不带错误字符串的@explicit_destroy现在是错误。

  7. 旧式闭包弃用@parameter@__copy_constructor装饰器与旧式闭包语法已弃用,请改用带捕获列表的新式闭包。

  8. 闭包特征需显式声明:结构体必须在继承列表中显式声明闭包特征,才能满足闭包类型要求,不再支持隐式鸭子类型。

  9. 可变参数必须加var**kwargs必须写为var **kwargs,语义无变化,仅强制显式书写。

  10. 移除参数列表内where子句:必须改用签名尾部的where子句。

  11. 禁止隐藏UnsafeAnyOrigin:结构体字段不能声明为UnsafeAnyOrigin类型,避免生命周期检查失效。

  12. self参数必须为Self类型:自定义类型约束请通过尾部where子句实现。

  13. 禁止仅参数约定不同的重载imm/mut差异不能作为函数重载的区分依据。

  14. 保留字不能作函数名classdelmatchyield等保留字禁止作为自由函数名称。

  15. 限制语句内换行:关键字与标识符之间、导入语句中间(括号内除外)禁止换行。

标准库稳定化

我们已启动Mojo标准库的稳定化进程,标记为稳定的API不会被移除,也不会以破坏源码兼容性的方式改动。首批稳定API范围较小,后续版本将逐步扩充。


本次纳入稳定范围的核心类型包括:

  • DeinitableMovableCopyableImplicitlyCopyable 特征(全部稳定)

  • ArrayListSpan

  • String

  • BoolOptional

稳定状态在API参考中按API标注,详情参见:https://mojolang.org/docs/api-docs/stability/

标准库变更

类型系统与特征

  • ImplicitlyDestructible 重命名为 Deinitable,旧名称作为弃用别名保留。

  • 反射成员Reflected重命名为Reflected.field[name],新增按索引访问的field_at[idx],旧名称不准确已废弃。

  • ConditionalType类型函数已弃用,请改用三元表达式comptime T = A if cond else B

  • Error现在符合ImplicitlyCopyable,重新抛出无需转移标记^;栈轨迹改为引用计数,复制成本更低。

  • Equatable特征现在支持仅位置参数的实现,参数签名无需与特征完全匹配。

指针与内存

  • Pointer与UnsafePointer统一:合并为单一Pointer类型,不安全操作统一加unsafe_前缀,旧名称与无前缀操作已弃用。两类型布局兼容,可隐式转换,绝大多数代码不受影响。

  • 取消隐式UnsafeAnyOrigin转换:避免意外扩大生命周期、禁用排他性检查,必须显式调用as_unsafe_any_origin()

  • 命名统一:as_immutable()as_imm()OwnedPointer.take()into_inner()StaticConstantOriginImmStaticOrigin

  • AddressSpace迁移至std.memory.address_space包。

  • steal_data()系列方法重命名为unsafe_take_allocation(),返回Allocation类型而非裸指针。

  • 新增指针减法与offset_from()方法,安全指针也可使用,返回元素级有符号距离。

容器与迭代器

  • InlineArray重命名为Array,参数sizelength,旧名称作为弃用别名保留;Array不再默认符合ImplicitlyCopyableDefaultable

  • 连续切片索引越界现在直接终止程序,不再静默截断或回绕;负索引已完全移除。

  • ListDictStringDeque等主流容器全面接入内部起源机制,杜绝重分配后的悬空引用。

  • List.capacity从公共字段改为capacity()方法;新增try_index()方法。

  • Span迁移至std.collections.span;构造参数ptrunsafe_ptr以显式标注风险;新增地址空间参数支持。

  • Dict/Set新增insert()clear_with(),支持非Deinitable元素类型的容器操作。

  • Variant.take()unwrap()unsafe_take()unsafe_unwrap(),旧方法弃用。

  • OptionalIterator改为Iterable,直接调用next()不再合法,遍历语法不受影响。

  • BitSet新增范围检查与调整大小的构造函数。

  • Tuple新增consume_elements(),支持转移所有权拆解线性类型元组。

显式销毁与线性类型

  • 主流容器现在条件性符合Deinitable:仅元素符合时容器自身才符合。非Deinitable元素的容器必须通过deinit_with()显式销毁。

  • Array元素约束从Movable放宽到AnyType,支持存放非可移动类型。

  • OptionalVariant支持非Movable元素,新增就地构造接口;新增deinit_assert_empty()等线性类型适配方法。

  • 关键字参数字典从OwnedKwargsDict重命名为StringDict,支持线性值类型与配套操作。

  • 容器所有权迭代放宽约束:从要求Copyable改为仅要求Movable & Deinitable

  • is_trivially_destructible()重命名为is_trivially_deletable(),接受任意类型。

字符串与文本

  • StringSlice重命名为StringSpan,旧名称作为编译期别名保留;新增MutStringSpan/ImmStringSpan别名。

  • 字符串迭代默认输出字素簇,符合用户对“单个字符”的直观认知;仍提供字节、码位层级的底层视图。

SIMD与数值类型

  • Int现在是Scalar[DType.int]的别名,整数字面量统一实例化为该类型。

  • 新增SIMDLength类型用于向量长度参数;SIMDsize参数重命名为length

  • 全局统一length术语,替换所有size命名,旧名称作为弃用别名保留。

  • range()全面重构:统一Int/Scalar实现;浮点迭代无漂移且可逆;支持带类型范围的反向迭代;拒绝非数值类型与会死循环的单/双参数浮点形式。

  • 整数标量支持直接从任意Intable值构造,无需中转Int

  • 标量SIMD值的repr输出现在使用对应类型别名,更符合直观。

Python互操作

  • Python绑定API全面改用安全指针类型,ABI兼容,仅写法更新。

  • PythonObject运算符改用CPython抽象协议分发,热点路径性能提升约12倍,语义更贴合Python原生行为。

  • 新增std.python.numpy模块,支持Mojo与NumPy数组间零拷贝/拷贝数据传输。

  • 新增raise_python_exception()工具函数,用于Mojo错误转Python异常。

系统、FFI与运行时

  • OwnedDLHandle全面升级:get_function()返回带生命周期保活的可调用对象,符号缺失抛异常而非崩溃;支持结构体按值传递;get_symbol()返回借用指针;支持C字符串切片参数。

  • external_call支持调用C可变参数函数,通过num_fixed_args指定固定参数数量。

  • 文件创建权限修正:不再强制改写为0o666,遵循系统umask规则,与Python行为一致。

  • 新增initialize_runtime(),供共享库形式的Mojo代码初始化运行时,解决并行API崩溃问题。

  • 新增os.chdir()FileDescriptor.fchdir()POSIX封装。

其他库变更

  • Bencher.iter支持可抛出的闭包参数,不再依赖旧式@parameter写法。

  • 未捕获错误新增栈轨迹开启提示,引导用户开启调试信息。

包迁移

大部分加速器编程相关标准库API已迁移至新的max Mojo包,layout包现在随MAX打包发布。部分底层GPU API仍保留在标准库中,最新GPU更新参见:https://docs.modular.com/releases/v26.5/

工具链变更

  • LSP默认关闭文档字符串内代码检查,减少假阳性诊断,可通过参数重新开启。

  • 崩溃上报与遥测开关统一,行为更一致。

  • 新增--fp-mode参数,控制浮点融合乘加行为。

  • 新增--lld-path参数,支持自定义LLD路径。

移除内容

  • 移除DType.invalid哨兵,请改用Optional[DType]

  • 移除StringLiteral位置索引,请改用关键字索引方式。

  • 移除静态String.write()方法,请改用String()构造函数。

  • 移除trait_downcast_var(),类型细化能力已足够替代。

修复内容

  • 修复Optional/Variant对含Bool字段类型的数据损坏问题(#6485)

  • 修复三元表达式在编译期上下文中的类型细化失效问题

  • 修复条件性特征符合、编译期成员约束的多处误判

  • 修复单元素RegisterPassable结构体的默认Equatable实现编译失败问题(#6740)

  • 修复闭包混合*args、关键字参数、**kwargs的多处编译失败

  • 修复未使用的volatile读取被错误优化掉的问题(#6755)

  • 修复0长度SIMD导致编译器崩溃的问题(#6724)

  • 修复导入失败污染名称解析、导致后续正常导入失效的问题

  • 修复通配符导入导致结构体扩展误应用到无关同名类型的问题

  • 修复含点名称的包/模块导入、文档生成异常

  • 修复FileHandle.seek偏移量类型与文档不符、负偏移无法通过变量传入的问题(#4473)

  • 修复b16decode对非法输入静默生成错误结果的问题

  • 修复PyCapsule_New名称参数悬空指针问题

  • 修复mojo build未链接libm导致数学函数构建失败的问题(#6727)

  • 优化debug_assert代码体积,减少无消息断言的内存占用

  • 修复LSP代码补全、代码折叠的多处体验问题

特别鸣谢

感谢社区贡献者:Adam Kruger、Bernhard Merkle、Christoph Schlumpf、Danilo Salve、Gabriel de Marmiesse、Giorgos Smyridis、Manuel Saelices、Rylan Malarchick、Sherlock Xu、SultanovAR

Mojo v1.0.0 官方发布说明 - 随笔 - 话题 - AI 中文社区
点赞(0) 收藏(0)
0条评论
现在评论,你将成小区里最靓的仔^_^
评论
游客
游客
登录后再评论
  • 一字一句需斟酌,一言一语显风范。
  • 评论消耗5积分,点赞、收藏消耗3积分。