Mojo 采用所有权语义并配合即时析构(ASAP destruction):编译器清楚知道一个值最后一次被使用的时刻,值在此刻即被销毁,无需等待垃圾回收器运行。这既避免了 C 与 C++ 中手工管理内存带来的释放与重复释放风险,也避免了垃圾回收带来回收时机不可控的问题。
Mojo 编译器内置生命周期检查器,这是一个分析程序数据流的编译器过程,用于判断变量何时有效,并在变量生命周期结束时插入析构调用。检查通过一个称为 origin 的特殊值追踪变量的生命周期与引用的有效性,回答两个问题:这个值由哪个变量拥有,以及能否通过这个引用修改该值。origin 的追踪与生命周期检查全部在编译期完成。
Mojo 会利用 origin 延长被引用值的生命周期,确保值不会过早销毁。只要存在活跃引用指向某个值,被引用值就会保持存活。
1.0 版本引入了内部 origin(interior origin)这一实验性能力,生命周期检查器开始能够感知容器内部结构。List、Dict、String 及其他若干容器类型现在返回绑定到内部 origin 的元素引用。一旦容器发生 append、pop 等可能导致重分配的变更,此前取得的元素引用会被检查器判定失效并拒绝编译,而不是像过去那样静默悬空。在官方路线图中,「最终确定内部 origin」仍列为 Phase 2 中尚未开始的工作项。
1.0 版本把此前的 Pointer 与 UnsafePointer 合并为统一的 Pointer 类型,不安全性不再标记在整个类型上,而是标记在单个操作上。相应的不安全操作统一改为 unsafe_ 前缀命名,例如 [i] 改为 [unsafe_offset=i],load() 改为 unsafe_load(),store() 改为 unsafe_store()。这样做的效果是让不安全写法更冗长,从而降低误用概率。
Mojo 仍提供完整的指针与内存分配能力供底层场景使用,包括不被生命周期检查器追踪的非托管内存。使用这类不安全接口时,开发者需自行负责生命周期管理,例如在结构体的析构函数中释放内存。