Mojo 语言 `@stable` 装饰器:标准库 API 稳定性标记的设计与实现
2026/9/12 6:26:03 网站建设 项目流程

Mojo 语言@stable装饰器:标准库 API 稳定性标记的设计与实现

【免费下载链接】mojoThe Modular Platform (includes MAX & Mojo)项目地址: https://gitcode.com/GitHub_Trending/mo/mojo

导读

本文以 Mojo 编译器仓库(Modular 平台)中已受理的技术提案 stable_decorator.md 为主体,结合 StabilityMarkers.cpp 等源码实现与测试用例,系统讲解 Mojo 如何通过@stable装饰器标记标准库 API 的稳定性、如何用--warn-on-unstable-apis编译选项在构建期拦截不稳定 API,以及@stable(since=...)@stable(recursive=True)的语法语义与实现现状。读完本文,你将掌握稳定 API 的标注规范、警告触发规则、作者侧常开检查,以及通过 comptime 别名与 import 覆盖机制控制告警的完整实战方案。


一、提案背景与设计动机

1.1 为什么需要显式的稳定性标记

随着 Mojo 语言演进,标准库中不同 API 的成熟度参差不齐。面向生产环境的用户需要回答三个问题:

  1. 哪些 API 不会在未来版本中无预警地变更;
  2. 选择实验性特性时是否有清晰的可见性;
  3. 不稳定 API 悄悄混入代码时,能否在构建期收到警告(或错误)。

如果没有显式标记,用户只能依赖文档中的只言片语,或通过"踩坑"来发现不稳定 API。提案(stable_decorator.md)因此引入@stable装饰器:默认情况下,Mojo 标准库中的所有 API 都被视为不稳定,稳定承诺必须显式声明。

1.2 范围:先聚焦标准库

该功能最初仅限定于 Mojo 标准库std包)。第三方包支持将作为未来的 opt-in 机制加入,但设计尚未定义。这一点在提案的 Scope 章节有明确说明(stable_decorator.md),并在源码中得到印证:

bool M::KGEN::LIT::isPackageOptedIntoStabilityMarkers(StringRef packageName) { // Currently only the standard library is opted into stability markers. return packageName == "std" || packageName == "test_std_mock"; }

这段代码位于 StabilityMarkers.cpp,test_std_mock是仅供测试使用的模拟包,使稳定性测试不依赖真实标准库。

1.3 稳定性与语义化版本的关系

仓库文档 stability.mdx 进一步明确了配套的版本语义:Mojo 语言与标准库对标记为稳定的 API 遵循语义化版本管理——

  • 主版本(1.0、2.0)可包含不向后兼容的破坏性变更;
  • 次版本(1.1、1.2)以向后兼容方式新增功能;
  • 补丁版本(1.0.1、1.2.1)仅包含向后兼容的缺陷修复。

稳定性保证仅针对源代码,Mojo 的 ABI 目前不稳定;不稳定特性可以在任何时间点变更。


二、稳定性的粒度:@stable 的作用单元

2.1 可标注的对象

@stable装饰器可以应用于(stable_decorator.md):

  • 顶层符号:trait、struct、comptime 值、函数;
  • struct 与 trait 的成员:方法、comptime 值、字段;
  • import 语句

@stable不适用于:函数/方法内部的局部变量或 comptime 值、函数或 struct/trait 签名中的参数/实参,以及上述清单之外的任何名称。

2.2 提案中的标准库示例

## Stdlib example # Design of List is mostly stabilized @stable(since="1.0") struct ListT: Copyable & Movable: # unstable by default var _data: UnsafePointer[Self.T, MutOrigin.external] @stable var capacity: Int @stable def __init__(out self): # unstable by default def steal_data(mut self) -> UnsafePointer[Self.T, MutOrigin.external]: ## User code example: # Even if FileDescriptor is not marked as stable, this annotation # prevents stability warnings when FileDescriptor or its members are # used in this file. @stable(recursive=True) from std.io import FileDescriptor .. use(FileDescriptor.create()) # no warning

注意示例揭示的关键设计:struct 级别的@stable只保证结构体签名本身稳定,并不自动使其成员稳定_data字段与steal_data()方法没有标注,因此默认不稳定;capacity字段与__init__方法单独标注后才算稳定。这一"按成员逐个稳定化"的粒度,正是后面作者侧常开检查(stable member in unstable parent)得以存在的前提。

2.3 真实标准库中的落地形态

该设计已在实际标准库中落地。例如 list.mojo 中List结构体:

@explicit_destroy( "Use `deinit_with()` to explicitly destroy a `List` of" " non-`Deinitable` elements" ) @stable(since="1.0") struct ListT: AnyType, /:

在 list.mojo 全文中,@stable(since="1.0")被多次用于成员函数(如__init__append等,见第 433、440、455、551、572、603、648、730、991、1176、1191、1496、1538 行),并有少量@stable(since="1.1")(第 926 行),说明since版本会随 API 扩展而更新。这直接呼应提案中"签名扩展时应更新 since 值"的约定。


三、设计意图与稳定性承诺

3.1 "稳定"意味着什么

将某 API 标记为@stable,意味着 API 作者承诺除非在该包的主版本发布中,否则避免引入不向后兼容的变更(stable_decorator.md)。提案刻意将"不向后兼容"定义得比较宽松,包括:

  • 重命名、删除、移动符号;
  • 改变输入类型;
  • 更微妙的破坏方式——例如保持接口不变但改变行为。

作者有责任避免这类变更。文档页应描述常见的破坏方式,例如新增函数重载可能改变重载解析结果,从而破坏现有代码。

3.2 包级 opt-in:std 默认全员不稳定

标准库(std包)选择整体 opt-in,其中所有类型默认不稳定;部分语言关键字与魔法函数也被视为标准库的一部分参与该机制。其他包(第三方包与 kernels)在 Mojo 1.0 阶段不 opt-in,其符号被视为稳定、不产生警告(stable_decorator.md)。

推迟第三方 opt-in 的原因是:Mojo 目前还没有"包定义文件"这样的位置或语法,让包作者声明其包"已 opt-in",这有待后续设计。

3.3 为什么默认不稳定(而非默认稳定)

提案明确反对"默认稳定 +@unstable标记"的替代方案,理由有三(stable_decorator.md):

  1. 显式保证:稳定承诺应当是深思熟虑的,而不是偶然的;
  2. 自然演化:API 从不稳定起步,随时间"毕业"为稳定;
  3. 避免意外:如果稳定是 opt-out,漏写一个注解就可能制造一个难以收回的隐性承诺。

四、编译器开关:--warn-on-unstable-apis

4.1 命令行用法与告警示例

提案给出的编译方式:

mojo build --warn-on-unstable-apis myprogram.mojo

启用后,编译器在用户代码直接使用不稳定 API 时发出类似警告:

myprogram.mojo:42:5: warning: using unstable API 'std.ExperimentalBuffer' var buf = ExperimentalBuffer(1024) ^~~~~~~~~~~~~~~~~~

4.2 源码中的选项定义

该选项在编译器中注册为布尔 CLI 选项。位于 CLOptions.h:

M::cl::MOpt<bool, true> warnOnUnstableAPIs{ "warn-on-unstable-apis", ... llvm::cl::location(options.warnOnUnstableAPIs),

并在 CLOptions.h 中默认值为falsebool warnOnUnstableAPIs{false};)。选项在 CLOptions.h 处被赋入options结构。同时,mojo-run(mojo-run.cpp)与mojo-build(mojo-build.cpp)等工具也接入该选项。

4.3 核心判定逻辑

警告判定的入口是checkStabilityAndWarn(StabilityMarkers.h),其完整触发条件在头文件注释中明确列出(StabilityMarkers.h):

  • --warn-on-unstable-apis标志已启用;
  • 被引用的声明来自 opt-in 包(如std);
  • 该声明@stable标记;
  • 使用点不在同一 opt-in 包内(包内使用不告警)。

对应实现(StabilityMarkers.cpp)还展示了"包内使用不告警"的判定方式:通过findOptedInPackage向上查找最近的已 opt-inPackageOp,比较声明所在包与使用点所在包的符号名;子包(如std::builtinstd::collections)会归并到同一个std包处理(StabilityMarkers.cpp)。判定辅助函数包括:

  • isDeclFromOptedInPackage:声明是否位于 opt-in 包内;
  • isOptedInStable:是否"opt-in 包内且标注了 @stable";
  • isUnstable:是否"opt-in 包内且未标注 @stable"(StabilityMarkers.cpp)。

4.4 何时触发警告

提案对触发场景的归纳非常明确(stable_decorator.md):

  • 调用或引用一个函数/方法;
  • 创建 struct 实例,或用 struct/trait 名引用其成员;
  • 将值强制转换为不稳定 trait;
  • 使用不稳定的 struct/trait 成员;
  • 实现一个不稳定的 trait。

提案特别强调:以上所有情况都可以在 Mojo parser 阶段检查,无一需要在泛型实例化/elaboration 阶段或其之后检查——这是刻意为之的设计,保证了检查的高效性与确定性。源码中checkStabilityAndWarn被设计为"在名称解析(name resolution)引用符号时调用"(StabilityMarkers.h),正是这一意图的实现。

4.5 何时不触发警告

以下情况告警(stable_decorator.md):

  • 通过稳定 API 的传递性使用:例如稳定函数内部使用不稳定辅助函数——这是实现细节;
  • 定义该不稳定 API 的同一包内的使用
  • 导入不稳定 API 但从未使用

第一条在测试包 test_std_mock/init.mojo 中有直接验证:stable_fn_using_unstable()内部调用unstable_fn()、构造UnstableStruct(),但由于同属一个 opt-in 包,均不告警;外部用户调用这个稳定函数时也看不到内部的不稳定使用。

4.6 告警示例的测试验证

仓库中的 parser 测试用 FileCheck 精确验证了各类场景,例如 warn_struct.mojo:

# RUN: %parse-mojo-isolated -mojo-search-paths=%S -warn-on-unstable-apis %s 2>&1 | FileCheck %s from test_std_mock import StableStruct, UnstableStruct, stable_fn, unstable_fn def test_unstable_struct(): # Using an unstable struct should trigger a warning. # CHECK: warning: use of unstable API 'UnstableStruct' var y: UnstableStruct pass def test_unstable_fn(): # Calling an unstable function should trigger a warning. # CHECK: warning: use of unstable API 'unstable_fn' unstable_fn()

测试同时验证了StableStructstable_fn告警行为,构成正反双向覆盖。


五、作者侧常开检查:独立于编译开关的稳定性一致性校验

除了用户侧的--warn-on-unstable-apis,编译器在 opt-in 包内还提供始终开启的"作者警告"(stable_decorator.md),用于帮助 API 作者避免"承诺稳定却依赖不稳定部件"的矛盾。这些检查与编译开关无关:

  1. 稳定函数不应在签名(参数或返回类型)中暴露不稳定类型
  2. 稳定 struct 实现稳定 trait 时,必须用稳定方法满足其要求
  3. 稳定 trait 不得继承不稳定 trait

5.1 实现层面对应关系

这些规则在 StabilityMarkers.cpp 中均有对应实现函数:

  • checkStableTraitMemberImplementation(StabilityMarkers.cpp):当 struct、trait、trait 成员三者均 opt-in 且稳定,而 struct 的实现成员未标@stable时,发出警告stable struct 'X' implements stable trait method 'y' with unstable implementation。它还会跳过合成(synthetic)方法,并自动区分"alias"与"method"两种成员类型。
  • checkStableFunctionReturnType(StabilityMarkers.cpp):稳定函数返回不稳定类型时告警stable function 'X' returns unstable type 'Y',并通过 note 附上类型声明位置。
  • checkStableTraitInheritance(StabilityMarkers.cpp):稳定 trait 继承不稳定 trait 时告警。实现中特别说明,由于签名解析期间 trait 自身的父链可能尚未完整建立,包归属检查使用declScope而非 trait 自身。
  • checkStableMemberInUnstableParent(StabilityMarkers.cpp):在不稳定 struct/trait 中声明@stable成员会告警(@stable member cannot be declared in an unstable struct),因为这属于作者失误——用户引用该成员前必然先因创建实例或引用该 struct 而收到警告。

5.2 测试佐证

测试包 test_std_mock/init.mojo 提供了完整的正反样例:

  • StableStructWithStableImpl(稳定实现,不告警)vsStableStructWithUnstableImpl(不稳定实现,应告警,第 L166-L180 行);
  • stable_fn_returning_unstable(返回不稳定类型,应告警)vsstable_fn_returning_stable(返回稳定类型,不告警,第 L187-L198 行);
  • StableTraitWithUnstableParent(继承不稳定 trait,应告警)vsStableTraitWithStableParent(继承稳定 trait,不告警,第 L201-L212 行);
  • UnstableStructWithStableMember(不稳定 struct 内声明稳定成员,应告警,第 L258-L267 行)。

这些 case 由 warn_api_author.mojo 通过 FileCheck 断言。


六、装饰器语法:since 与 recursive 参数

6.1 语法总览

@stable接受两个可选参数(stable_decorator.md):

@stable def foo(): ... @stable(since="1.2") def bar(): ... @stable(recursive=True) from std import FileDescriptor
  • since="version_string"语法已解析并存储,但尚未在使用点强制执行。待 Mojo 与包的版本方案确定后才会完整实现。
  • recursive=True仅允许用于comptimeimport。其中import上的实现已完成;comptime上的实现尚未完成(原因见下文第七节)。

6.2since的语义:最早可用版本

since表示该 API(以文档所示形态)可用的最早包版本(stable_decorator.md)。如果稳定 API 的签名被扩展(例如新增带默认值的参数),since应更新为引入扩展签名的版本:

@stable(since="1.0") def foo(): ... # later extended @stable(since="1.3") def foo(b: Int = 7): ...

提案目前不规定选择版本字符串的具体流程;未来当稳定性标记扩展到标准库之外时,since将指向"包版本",需要更完整的版本设计。实际标准库中的版本演进(since="1.0"since="1.1"并存于 list.mojo)正是这一约定的佐证。

6.3recursive=True的语义:符号及其全部成员

recursive标志将该符号及其所有成员标记为稳定(stable_decorator.md):

  • 对 comptime 值,用户可以选择只标符号,或"符号+成员";
  • 对 import,为避免"成员是否受影响"的歧义,提案要求必须使用递归覆盖

七、通过 comptime 别名改变稳定性状态

7.1 两种模式

创建 comptime 别名(无论是否带参数,comptime NewName = OldName)会生成一个可以拥有不同稳定性状态的新符号(stable_decorator.md):

  • @stable(非递归):只让别名名称稳定,不递归影响成员访问;
  • @stable(recursive=True):别名名称稳定,同时通过该别名的成员访问也免于告警。
# Unstable struct UnstableStruct[T: AnyType]: pass # Non-recursive alias: only the name is treated as stable @stable comptime StableName = UnstableStruct[Int] # Recursive alias: name + member accesses through StableStruct are warning-free @stable(recursive=True) comptime StableStruct = UnstableStruct[Int]

7.2 设计动机

这既是终端用户的逃生舱/覆盖机制,也是标准库作者的兼容工具:标准库团队可以在底层实现形状改变时,用稳定别名保持稳定的表面 API(stable_decorator.md):

# had @stable StableStruct[T, P] ... # now underlying implementation changes UnstableStruct[P, Q, T] ... # preserve stability via a stable alias @stable comptime StableStruct[T, P] = UnstableStruct[P, Int, T]

7.3 实现状态:comptime 递归尚未实现及其原因

提案的"Implementation notes"明确标注(stable_decorator.md):comptime 上不带recursive@stable已实现,但@stable(recursive=True)尚未实现。原因极具技术深度:

@stable作用于 comptime 不会创建新类型——别名与原类型共享同一个ASTDecl。当前抑制机制按名称工作:使用点检查被引用的名称是否以@stable(recursive=True)导入。comptime 别名是不同的名称绑定,但由于它解析到同一个底层类型,通过它的成员访问(如StableStruct.some_method())会把接收者类型解析回原始类型的 decl而非别名。因此,在当前模型中别名名称无法用作抑制键。支持该场景需要类型包装器(type wrapper)或更具表现力的抑制模型。

7.4 测试覆盖

测试包 test_std_mock/init.mojo 提供了别名场景的正反样例:

# Stable alias re-exporting an unstable struct - users should not get warning. @stable comptime StableAliasToUnstable = UnstableStruct # Unstable alias - users should get warning when using this. comptime UnstableAlias = StableStruct # Stable constant alias. @stable comptime STABLE_CONSTANT: Int = 42 # Unstable constant alias. comptime UNSTABLE_CONSTANT: Int = 100

对应断言见 warn_alias.mojo。


八、通过 import 改变稳定性状态

8.1 用法与语义

import 语句可用@stable(recursive=True)标注(stable_decorator.md),这是已实现的特性:

  • 对导入的绑定及其所有成员访问,构成警告抑制覆盖(warning suppression override);
  • 对 import 而言,recursive=True必需的(避免成员是否受影响的歧义)。
@stable(recursive=True) from std import Dict # No warning on the use of Dict, no warning on the use of members through Dict _ = Dict[String, Int].REMOVED

动机与递归 comptime 别名相同:当用户显式 opt-in 时,给予其对告警面的完全控制权。

8.2 实现机制

checkDeclUsageWarnings(StabilityMarkers.cpp)中可以看到统一检查入口:先执行不可抑制的@unavailable错误检查与@deprecated警告检查,再通过getCanonicalOwnerTypeDecl找出"应匹配使用点递归稳定名称集合的声明"——直接引用 struct/trait 时取自身;struct/trait 内的方法/别名取父 struct/trait;extension 内的方法取被扩展的 struct(StabilityMarkers.cpp)。最后,仅当使用点声明没有将该所有者类型标记为"递归稳定"时,才调用checkStabilityAndWarn

8.3 测试验证

warn_import.mojo 完整验证了该机制:对UnstableStructunstable_fnUnstableTraitWithMembers三个不稳定符号的 import 加@stable(recursive=True)后,类型构造、方法调用、comptime 成员访问、trait 默认方法调用、关联类型使用全部免于告警,并以一个全局CHECK-NOT断言确认没有任何use of unstable API警告输出。

8.4 已知限制:覆盖不跟随别名类型

覆盖只作用于导入名及其成员访问,不传递覆盖该成员暴露的其他不稳定类型(stable_decorator.md):

@stable(recursive=True) from std import UnstableA # UnstableA has: comptime B = UnstableB var B = UnstableA.B # no warning — B is a member of UnstableA ✓ B.static_method() # warning — UnstableB is not in the stable override set ✗

要抑制第二条警告,需单独导入UnstableB

@stable(recursive=True) from std import UnstableA @stable(recursive=True) from std import UnstableB

再导出(re-export)同样不受支持:当前模型中稳定 import 覆盖集是文件作用域的,不会通过再导出传播。因此@stable别名能抑制名称级告警,但下游消费者通过再导出进行的成员访问仍会告警。


九、关键字与魔法函数

部分 Mojo 内置关键字与魔法函数被判定为不稳定(如__get_mvalue_as_litref()),该特性也应对用户引用这些符号发出警告(stable_decorator.md)。对终端用户而言,符号定义在标准库还是编译器内部并不重要,告警行为应当一致。

实现函数为checkMagicFunctionAndWarn(StabilityMarkers.cpp):启用开关后,若使用点不在 opt-in 包内,则对不稳定魔法函数发警告use of unstable function 'X'。测试 warn_magic_fn.mojo 验证了正反两例:type_oforigin_ofconforms_to__functions_in_module是稳定魔法函数(不告警),而__get_current_function_name触发use of unstable function '__get_current_function_name'警告。


十、与其他机制的交互

10.1 与-Werror结合

与其他警告一样,--warn-on-unstable-apis可与-Werror组合,将稳定性警告升级为错误,实现 CI 流水线中的严格稳定性强制(stable_decorator.md)。

10.2 与@deprecated互斥

@stable@deprecated两个装饰器互斥(stable_decorator.md)。在实现上,两者共同通过StabilityDecoratorInterface处理——hasStableDecorator检查isStable()(StabilityMarkers.cpp),checkDeprecationAndWarn检查isDeprecated()(StabilityMarkers.cpp);checkDeclUsageWarnings统一执行不可用错误、弃用警告与稳定性警告三层检查(StabilityMarkers.cpp)。值得注意,@stable(recursive=True)的覆盖不会抑制@deprecated警告——弃用警告的唯一抑制机制是--ignore-deprecated白名单。

10.3 与文档生成

文档生成器应显著展示稳定性状态(stable_decorator.md):稳定 API 的徽章、稳定/不稳定分区,或仅显示稳定 API 的过滤选项。仓库文档 stability.mdx 印证了这一落地:稳定 struct/trait 在名称下方显示 "Stable since version" 标签,其他稳定成员在右侧显示版本徽章(如 "1.0.0")。


十一、被否定的替代方案

11.1 默认稳定(opt-out)

曾考虑让所有 API 默认稳定,作者用@unstable标记实验性 API(stable_decorator.md):

@unstable def experimental(): pass

这对终端用户非常友好(最小惊讶原则),但被否决,原因有三:

  1. 作者必须记得标记每个实验性 API,忘记标记会制造隐性稳定承诺;
  2. 收回稳定承诺远比做出承诺困难——用户一旦依赖,就无法反悔;
  3. 标准库 API 的自然演化方向是"从不稳定到稳定",且初期大部分 stdlib 都不稳定,引入该特性不应要求海量@unstable装饰器。

11.2 层级式稳定(hierarchical stability)

曾考虑让@stable/@unstable通过嵌套类型与成员传播(struct 稳定则字段也稳定),但被否决(stable_decorator.md):

  • 与版本标记冲突——新成员不会携带 "stable since" 信息;
  • 容易出错——作者可能意外向稳定 struct 添加新 API 却忘记标记为不稳定。

有趣的是,层级式稳定最终以"逃生舱"形式用在了 comptime 与 import 覆盖机制中。

11.3 双装饰器方案

提案 v0.2 曾同时包含@stable@unstable两个装饰器,@unstable因简化需要被移除;未来若有明确用例可能重新引入(stable_decorator.md)。


十二、FAQ 要点速览

Q: 传递性依赖不稳定 API 会告警吗?(stable_decorator.md) A: 不会。警告只在用户代码直接使用不稳定 API 时触发。稳定 API 内部使用不稳定辅助函数是实现细节,不告警。

Q: 测试能否无警告地使用不稳定 API?A: 可以。测试代码经常需要覆盖不稳定 API,构建测试时不应启用该开关。更细粒度的测试 opt-out 机制留待未来讨论。

Q: 想用不稳定 API 但抑制警告怎么办?(stable_decorator.md) A: 两种方式:

# 方式一:通过稳定别名再导出,擦除不稳定注解 @stable comptime StableStruct = UnstableStruct
# 方式二:在 import 语句上使用 @stable 装饰器 @stable(recursive=True) from std import UnstableStruct

Q: 未 opt-in 的第三方包能用@stable吗?(stable_decorator.md) A: 不能。在未 opt-in 的包中使用该装饰器会触发编译器警告——这被认为是编程错误。

Q:@stable与 struct extension 如何交互?(stable_decorator.md) A: 稳定性不会在 struct 与 extension 之间传播。为简化起见,不稳定 struct 不能拥有稳定 extension。

Q: 是否存在其他错误情形?(stable_decorator.md) A: 编译器会警告"不稳定 struct 中出现稳定成员"。因为用户引用该成员时,必然先因创建实例或引用 struct 而收到警告,故这属于作者失误,应尽早提示。

Q: 所有不稳定 API 的使用都保证告警吗?(stable_decorator.md) A: 不保证。编译器可能修剪警告以避免刷屏。程序使用不稳定 API 时至少会有一条警告,但不保证全部显示:不稳定符号首次使用应告警,后续使用可能静默;不稳定类型的后续不稳定成员使用可能静默。正确工作流是:无警告则未使用不稳定 API;有警告则修复后重新编译,观察是否还有更多警告。


十三、总结:从提案到源码的实现全景

将提案与仓库源码对照,可以勾勒出该特性的完整实现地图:

提案要点源码实现测试验证
std等 opt-in 包参与StabilityMarkers.cppisPackageOptedIntoStabilityMarkerstest_std_mock/init.mojo
用户侧不稳定告警checkStabilityAndWarn(StabilityMarkers.cpp)warn_struct.mojo、warn_fn_ref.mojo、warn_trait.mojo、warn_member.mojo
--warn-on-unstable-apis开关CLOptions.h各测试 RUN 行
作者侧常开检查checkStableTraitMemberImplementation等(StabilityMarkers.cpp)warn_api_author.mojo
import 递归覆盖(已实现)getCanonicalOwnerTypeDecl+hasRecursivelyStableType(StabilityMarkers.cpp)warn_import.mojo、warn_import_hole.mojo、warn_import_no_bleed.mojo
comptime 别名(递归未实现)见提案 stable_decorator.md 的原因说明warn_alias.mojo
魔法函数告警checkMagicFunctionAndWarn(StabilityMarkers.cpp)warn_magic_fn.mojo
since版本标记标准库落地实例:list.mojo
文档徽章展示stability.mdx

总体而言,@stable稳定性标记机制是 Mojo 走向"可明确依赖的稳定 API 层"的关键基础设施:它以 parser 阶段的纯语法检查保证低开销与确定性,以"默认不稳定"守护承诺的严肃性,以 import/comptime 覆盖机制为用户提供可控的逃生舱,并以常开作者检查保障标准库内部的稳定性一致性。对于希望在 Mojo 上构建长期稳定代码库的开发者而言,理解并善用这套机制,是规避升级风险的第一步。

【免费下载链接】mojoThe Modular Platform (includes MAX & Mojo)项目地址: https://gitcode.com/GitHub_Trending/mo/mojo

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询