Mojo 编译器开源了:开发者实际可以改变什么

Mojo 编译器现在可以从源代码构建和修改。AI News 复现了构建过程,但许可和贡献治理仍是分开的限制。

分享这篇文章

Modular 于 8 月 18 日发布了开源 Mojo 编译器,时间在 Mojo 1.0 发布一周之后。重要的变化不只是可以在 GitHub 上阅读代码:开发者现在可以修改编译器、从源代码构建它,并使用这个构建来编译和运行 Mojo 程序,而不需要专有的 Mojo 编译器二进制文件。

这个结论需要两个限定。源代码构建的编译器目前无法构建 MAX 目标,Modular 也尚未接受编译器或工具链贡献。仓库则让其代码和贡献遵循带 LLVM 例外的 Apache 2.0,同时另行将 Modular MAX Community License 应用于 MAX 的使用和分发。因此,“Mojo 是开源的”是准确的;“仓库中的每个产品现在都有相同的、不受限制的使用条款”则不准确。

我可以在没有专有编译器的情况下构建和修改 Mojo 吗?

可以——对于 Mojo 编译器和标准库。 使用仓库的 build-mojo Bazel 配置。它会明确禁用预构建的 Mojo 工具链,从检出的源代码构建编译器目标,并可以用生成的编译器运行 .mojo 文件。

不可以——对于 Modular Platform 的所有工作流。 项目自己的开放仓库指南表示,本地构建的编译器无法构建任何 MAX 目标。MAX 内核或模型的工作仍使用 prebuilt-mojo 配置,该配置会下载 Modular 当前的 nightly Mojo 软件包。

这一区分拆出了“开放”的四种有用含义:

  • 可见: 可以检查编译器的实现和历史。
  • 可构建: 可以从发布的源代码生成一个能工作的编译器。
  • 可分叉: 带 LLVM 例外的 Apache 2.0 许可允许在其条款约束下修改和再分发。
  • 对上游贡献开放: 编译器和工具链目前还没有开放,尽管标准库和部分 MAX 贡献已被接受。

对于这门语言,发布已经达到前三个里程碑。它还没有达到第四个。

到底什么开源了?

modular 仓库是一个单仓库,而不是只有编译器的项目。其顶层 README 将编译器、标准库、加速器代码、模型流水线和推理服务器标识为独立组件。在决定你可以改变什么、以及哪些条款管辖结果时,这些边界很重要。

Mojo 和 MAX 仓库组件、实际修改路径以及许可或贡献限制
组件 仓库路径 开发者现在可以做什么 重要边界
Mojo 编译器 KGEN/ 阅读、构建、修改、测试并维护一个分叉。 带 LLVM 例外的 Apache 2.0;上游编译器贡献尚未接受。
Mojo 标准库 mojo/stdlib/ 用本地编译器构建,并提交范围明确的修复、测试、文档或获批准的提案。 带 LLVM 例外的 Apache 2.0;拉取请求前还应使用打包的编译器测试变更。
编译器工具 KGEN/tools/ 检查并运行诸如 kgen-translate 这样的底层 IR 工具。 源代码已开放,但编译器和工具链的贡献流程仍在准备中。
MAX 加速器库 max/kernels/ 检查代码,并在项目接受的范围内贡献。 MAX 工作使用预构建 Mojo 编译器;MAX 的使用和分发有单独的 Community License 条款。
MAX 流水线和推理服务器 max/python/max/pipelines/max/python/max/serve/ 检查实现,并处理已接受的模型架构。 不要根据仓库许可推断只有 Apache 条款的产品权利;应审查 MAX 条款和第三方模型许可。

许可措辞需要谨慎处理。仓库 README 表示,仓库和其中的贡献遵循带 LLVM 例外的 Apache 2.0。随后它表示,MAX 的使用和分发受 Modular MAX Community License管辖。第二份许可包含衍生作品和应用分发要求,分别指出有单独许可的组件,并要求用户检查第三方许可。

实际而言,审计或分叉 Mojo 语言,与发布嵌入 MAX 的产品,是不同的法律决策。README 是入门说明,不是法律建议;分发软件的团队应将产品中的实际文件和二进制文件映射到适用的声明和条款。

我们复现了源代码构建

本文克隆了提交于 8 月 20 日的 33cd4694 修订版,并在 64 位 Linux 上运行了有文档记录的编译器目标。机器使用 AMD Ryzen 7 8700G,拥有 8 个核心、16 个硬件线程和 46 GiB 内存。这次测试没有使用独立 GPU。

命令是:

./bazelw run --config=build-mojo //KGEN:mojo -- --version

源代码构建在完成 11,173 个 Bazel 操作后成功结束。从头到尾,该命令耗时 41 分 57 秒,并以状态码 0 退出。生成的二进制报告为 Mojo 1.1.0.dev0 (deadbeef)deadbeef 文本是构建的版本元数据,而上面的 Git 修订版是我们固定的源代码身份。

然后我们创建了一个最小文件:

def main():
    print("source-built Mojo works")

并按照有文档记录的工作流运行它:

./bazelw run --config=build-mojo //KGEN:mojo -- run repro.mojo

编译器已经缓存后,这条后续命令在 1.8 秒内完成,打印 source-built Mojo works,并以状态码 0 退出。这也捕捉到了一项实际的版本变化:早期草稿使用了 fn main(),当前编译器拒绝了它,并指示改用 def

第一条命令是一次规模可观的编译器构建,而不是轻量级的语言安装。Bazel 包装器下载了其支持的 Bazel 二进制文件;依赖解析获取了包括 LLVM 在内的源代码归档,以及预构建的主机和交叉编译工具链;Bazel 在为请求的目标规划约 11,000 个构建操作前,分析了超过 42,000 个已配置目标。这并不让 Mojo 成为自托管或从源代码引导的项目:“没有预构建 Mojo 编译器”不同于“没有二进制构建工具或系统工具链”。

它证明了开发者需要的较窄主张:发布的编译器源代码可以生成 mojo 可执行文件,解析、编译并运行 Mojo 程序。仓库的 .bazelrc--config=build-mojo 连接到 use_prebuilt_mojo_toolchain=false,而独立的 prebuilt-mojo 模式会下载 nightly Mojo 软件包。

把我们的耗时当作可复现性观察,而不是基准测试。Bazel 使用了其配置的缓存,网络速度没有受控,不同的 CPU、缓存状态或仓库修订版都会改变结果。持久的事实是经过测试的修订版、目标、配置、硬件类别、输出和退出状态。

编译器开发者可以改变什么?

KGEN/ 树暴露的远不只是一个前端包装器。它包含 Mojo 解析器和语义层、基于 MLIR 的中间表示和通道、LLVM 降级、运行时集成、命令行工具,以及用于处理这条流水线的测试和文档。项目的编译器导览是有用的起始地图。

编译器工程师现在可以跟踪一项语言功能经过解析、类型检查、Mojo 专属方言、降级和生成代码的过程;在分叉中改变该实现;重新构建 //KGEN:mojo;并运行针对性测试。源代码发布还使安全审查、回归二分、实验性诊断、新研究通道和长期分叉维护在技术上成为可能,而封闭的可执行文件做不到这些。

开放仓库存在工作流缺口。其指南表示,单仓库的 //:install 目标不受支持,因此开发者必须调用 Bazel 目标或手动复制构建产物。一些内部文档使用外部贡献者必须自行定义的别名。检测到的平台不匹配时,硬件专属测试会被跳过。最重要的是,本地编译器无法构建 MAX 目标。

对于一个刚开放的复杂编译器树,这些是正常问题,但它们会影响使用成本。源代码发布降低了供应商不透明度;它不会自动提供完善的打包、广泛的平台覆盖、稳定的下游 API 或小型构建图。

代码可见性领先于治理

Modular 的公告表示,其目标是在 2026 年底前接受编译器和工具链贡献。当前的 Mojo 贡献者指南则更直接:编译器是开源的,但贡献流程尚未定义。

因此,你今天可以发布编译器分叉、提交错误报告、讨论架构,或为自己使用准备补丁。但不应假设 Modular 今天会审查并合并编译器拉取请求。相比之下,标准库有记录在案的可接受变更类别、测试预期,以及针对大型设计的提案流程。

这不是许可上的矛盾。开源许可授予使用、研究、修改和分发代码的权利;它并不要求原始维护者接受外部补丁。但治理会影响项目表现得像共享上游还是供应商发布的源代码树。对于试图避免永久分叉的团队,承诺中的贡献工作流是一个值得跟踪的里程碑。

开放编译器会让 Mojo 达到生产就绪吗?

没有单一的仓库事件可以回答这个问题。这次发布实质性改善了可审计性、连续性以及诊断编译器行为的能力。生产就绪度仍取决于工作负载、受支持的硬件、生态系统、升级策略、调试体验,以及团队是否愿意承担目前还不能上游的修复。

独立证据令人鼓舞,但有边界。一项经过同行评审的 SC 2025 Workshops 研究在 NVIDIA H100 和 AMD MI300A GPU 上测试了四个科学内核。作者发现,对于其受内存带宽限制的内核,Mojo 与 CUDA 或 HIP 具有竞争力,同时报告了 AMD 原子操作以及两家供应商上受计算限制的 fast-math 工作负载中的差距。他们还将编程模型描述为相当底层。这些实验早于 Mojo 1.0 和源代码发布,因此它们证明了真实的跨供应商内核评估是可能的,而不是证明当前编译器在每种工作负载上都胜出。

Hacker Newsr/ProgrammingLanguagesr/Compilers上的发布讨论提出了合理问题,涉及 MAX 依赖、专有 GPU 驱动、Mojo 专属 MLIR 方言、Python 迁移以及另一种加速器语言的实际受众。这些是研究线索,不是验证。评论可以指出团队应运行的测试,但不能替代测试本身。

Mojo 编译器源代码发布后采用或贡献 Mojo 的决策指南
目标 当前状态 建议的下一步
审计或试验语言编译器 可执行 固定一个修订版,用 build-mojo 构建,并围绕修改的代码运行编译器和标准库测试。
维护内部编译器分叉 在法律和技术上可行 为大型 Bazel/LLVM 构建、上游变基、发布打包和安全更新编制预算。
贡献标准库修复 已支持 遵循有文档记录的问题、测试、基准和提案规则;同时用本地和预构建编译器测试。
向上游贡献编译器功能 尚未开放 与项目讨论,并等待正式的编译器贡献工作流,再期待代码审查。
定制 MAX 内核或模型 需要打包的编译器 使用 prebuilt-mojo,审查 MAX 和模型许可,并测试确切的加速器目标。
迁移生产 Python 或 CUDA 系统 需要工作负载证据 为一条有界的热点路径制作原型,并比较正确性、端到端延迟、可移植性、调试和升级成本。

实际结论

开放 Mojo 编译器以真实方式改变了风险状况。开发者不再需要信任一个不透明的语言二进制文件来理解 Mojo 源代码如何变成机器代码;如果 Modular 的路线图与自身需求分歧,他们也可以保留或修改编译器。这让 Mojo 成为更可信的语言实验,也成为更可检查的依赖。

它并没有把 Mojo、MAX、GPU 驱动、模型代码和部署权利合并成一个开源承诺。它也没有一夜之间建立上游编译器社区。诚实的 2026 年结论是:语言现在可审计、可从源代码构建、可分叉;MAX 集成和编译器治理仍是接下来需要评估的两道边界。

8 月 19 日每日摘要有简短的发布快照。我们关于 Qwen3.8-27B 本地部署的分析应用了同一区分:可见的构建产物,与使用它所需的完整系统并不是一回事。

资料来源

  1. Modular’s Mojo open-source announcement
  2. Modular repository at the revision tested for this article
  3. Working with Mojo in the open-source repository
  4. Mojo contributor guide
  5. Modular repository license
  6. Modular MAX Community License in the repository
  7. Independent SC 2025 study of Mojo GPU science kernels
  8. Hacker News discussion of open-source Mojo
  9. Programming Languages discussion of open-source Mojo