资讯动态

rustc-dev-guide 总览:读懂 rustc 内部原理并参与 Rust 编译器开发的完整路线图

发布时间:2026/9/11 11:03:41 来源:尧图企业网站定制
rustc-dev-guide 总览读懂 rustc 内部原理并参与 Rust 编译器开发的完整路线图【免费下载链接】rustEmpowering everyone to build reliable and efficient software.项目地址: https://gitcode.com/GitHub_Trending/ru/rustrustcRust 编译器是 Rust 语言生态中最核心也最复杂的工程之一。本文以当前仓库中收录的 rustc-dev-guide 首页即 About this guide 章节为骨架向你系统梳理这份官方编译器开发指南的九大部分从如何获取源码、用x构建编译器到查询系统、类型检查、借用检查再到 MIR 到机器码的后端流水线。读完本文你将获得一张完整的编译器开发地图知道该按什么顺序查阅指南、每个章节解决什么问题以及如何在当前仓库中对照源码进一步深入。这份指南是什么一份面向 rustc 开发者的参考手册根据 about-this-guide.md 的定位说明这份指南有两个核心目的帮助理解 rustc 是如何工作的——从命令行参数解析、语法解析、HIR/MIR 等中间表示到类型检查、借用检查再到代码生成与链接的完整链路帮助新贡献者参与 rustc 开发——包括构建环境搭建、贡献流程、Git 使用规范、feature 稳定化流程等。指南明确说明自身定位是reference参考手册而非教程推荐按需搜索文档而不是从头到尾通读。这与 rustc 作为持续被大量贡献者迭代的生产级产品的属性一致——代码库处于持续变动中指南中的许多设计描述是理想化设计而非全部落地因此保持它完全最新非常困难。这一点在原文的 Constant change 一节中有专门阐述详见下文。指南共分为九个部分原文用编号列表给出了完整脉络对应到仓库中的实际文件如下部分主题仓库内对应章节Part 1构建、调试与贡献流程how-to-build-and-run.md、getting-started.mdPart 2高层编译器架构part-2-intro.mdPart 3源码表示各种 IRpart-3-intro.mdPart 4支撑基础设施CLI、driver、错误与 lintcli.mdPart 5分析类型系统、借用检查等part-4-intro.mdPart 6从 MIR 到二进制代码生成part-5-intro.md附录词汇表等参考资料appendix/background.mdPart 1构建、调试与贡献——对所有人都通用的部分这是指南中无论你以何种方式参与贡献都用得上的部分包含构建、调试、性能剖析等内容。获取源码的三种方式原文给出了三种克隆方式区别在于历史记录的处理策略# 方式一完整克隆推荐用于准备长期贡献 git clone 本仓库地址 cd rust # 方式二partial clone只取当前文件内容历史按需拉取 git clone --filterblob:none 本仓库地址 cd rust # 方式三shallow clone只保留最近 N 次提交适合浏览源码或简单构建 git clone --depth 1 本仓库地址 cd rust原文特别提示git bisect、git blame这类依赖完整提交历史的命令在 shallow clone--depth 1下无法工作如果你打算长期开发并贡献代码建议完整克隆或 partial clone。本仓库即对应rust-lang/rust主仓库仓库根目录下可以看到x、x.py、bootstrap.example.toml、compiler/、library/、tests/等标准布局。什么是 bootstrap如何运行编译器使用名为bootstrap的工具构建构建 rustc 并不直接调用cargo而是通过x包装器。运行它需要本机安装 Python。在绝大多数系统上以如下方式调用./x subcommand [flags]不同环境下的等价调用方式原文完整保留# Windows PowerShell需允许运行脚本 ./x subcommand [flags] # NuShell需将 .py 文件配置为用 Python 运行 ./x.ps1 subcommand [flags] # Windows 命令提示符需配置 .py 文件关联 Python x.py subcommand [flags] # 直接调用 Python python x.py subcommand [flags] # 不支持 sh 的 local 关键字的 Unix shell如 Solaris ./x.py subcommand [flags]如果 PowerShell 报错 running scripts is disabled on this system原文给出的解决方法是允许本地脚本运行Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser此外还可以通过cargo install --locked --path src/tools/x安装一个名为x的系统级包装二进制对应仓库中的 src/tools/x它能在仓库任意子目录下运行并自动选择合适版本的 Python。创建 bootstrap.toml首次使用时运行./x setup选择compiler默认配置即可自动生成一份合理的bootstrap.toml。如果参与的是编译器之外的部分如 rustdoc原文建议了解src/bootstrap/defaults下不同 profile 的差异因为构建流程可能不同。也可以手写配置——bootstrap.example.toml 列出了全部可用配置项及其含义仓库中的 src/bootstrap/defaults 则给出常用设置组合。一个值得注意的细节如果已经构建过 rustc 后又修改了与 LLVM 相关的配置需要执行./x clean --all才能让后续配置生效且./x clean本身不会触发 LLVM 重建。常用 x 命令速查表这是原文给出的最常用命令表格务必熟记命令用途./x check快速检查大部分代码能否编译rust-analyzer 可自动执行./x build构建rustc、std和rustdoc./x test运行全部测试./x fmt格式化全部代码x支持compiler、library、src/tools目录下的任意路径后缀因此可以写x test tidy等价于x test src/tools/tidy、x build std等价于x build library/std大幅减少输入。构建编译器的推荐命令原文推荐的首选构建命令是./x build library该命令实际做了三件事用 stage0 编译器与 stage0std构建rustc用刚构建出的 stage1 编译器构建library标准库组装一个可用的 stage1 sysrootstage1 编译器 stage1 标准库。这个最终产物stage1 编译器 用它构建的库就是你编译其他 Rust 程序所需的东西除非使用#![no_std]或#![no_core]。原文提醒stage1std的构建通常是瓶颈可通过 suggested.md 中--keep-stage-std一节 的技巧跳过重复构建如果只是做基于类型的重构如重命名方法、改函数签名用./x check会快得多。完整的 stage2 构建./x build --stage 2 rustc还包含用 stage1 编译器构建 stage2 编译器、再用 stage2 构建librustdoc等组件——原文明确说你几乎永远不需要这么做。构建指定组件# 只构建标准库library profile 下可省略 --stage 1 ./x build --stage 1 library # 构建工具 ./x build src/tools/cargo创建 rustup toolchain 以运行构建产物构建完成后build目录下会生成一系列文件。原文推荐用 rustup 链接成自定义 toolchain 来运行rustup toolchain link stage1 build/host/stage1 rustup toolchain link stage2 build/host/stage2验证构建产物$ rustc stage1 -vV rustc 1.48.0-dev binary: rustc commit-hash: unknown commit-date: unknown host: x86_64-unknown-linux-gnu release: 1.48.0-dev LLVM version: 11.0版本号以-dev结尾即表示本地构建。注意该 toolchain 不含cargorustup 会自动回退到已安装的 nightly/beta/stable 工具链中的 cargo。如果要在 IDE 中使用自定义 toolchain 处理过程宏可额外构建./x build proc-macro-srv-cli交叉编译配置给x build传--target即可构建可交叉编译的编译器./x build --target x86_64-unknown-linux-gnu,wasm32-wasip1注意若要让结果编译器能构建含过程宏或 build script 的 crate必须显式包含宿主平台目标。若想免去每次传参可在bootstrap.toml中配置[build] build.target [x86_64-unknown-linux-gnu, wasm32-wasip1]某些目标需要外部依赖如 musl 目标需要本地 musl 副本相关路径配置同样写在bootstrap.toml具体可查阅 bootstrap.example.toml。构建完成后即可交叉编译cargo stage1 build --target wasm32-wasip1其他常用命令与磁盘空间./x build用 stage1 编译器构建所有内容./x build --stage 2用 stage2 构建包括rustdoc在内的全部内容运行测试./x test library/stdstd 单元与集成测试、./x test tests/ui整个 UI 测试套件、./x test tests/ui/const-generics子目录、./x test tests/ui/const-generics/const-types.rs单个测试./x clean清理构建目录。rm -rf build虽然也行但会导致 LLVM 需要重新构建即使快速机器上也很耗时。磁盘空间方面原文给出了明确的量级提示构建编译器尤其是超出 stage1 之后可能需要约 100GB的可用空间如果还有独立的 rust-analyzer 构建目录如build-rust-analyzer则更甚。必要时清理build/、build-rust-analyzer/或用rustup toolchain list检查并卸载不用的工具链。快速上手Quickstart流程quickstart.md 把上述过程压缩为最小可执行序列git clone 本仓库地址 cd rust ./x setup # 生成默认构建配置 ./x build # 构建编译器、标准库与少量工具 rustup toolchain link stage1 build/host/stage1 rustc stage1 testfile.rs如果使用./x setup tools默认 stage 是 2链接命令相应改为rustup toolchain link stage2 build/host/stage2。修改编译器后通常用./x test tests/ui运行 UI 测试调用编译器处理指定测试文件并检查输出若想用新输出更新.stderr文件加--bless。若改动不影响标准库的编译方式例如只改错误信息用--keep-stage-std 1避免重编标准库。./x setup还会询问是否为 VSCode/Vim/Emacs/Helix/Zed 配置编辑器支持详见 suggested.md。原文还给出了一个已知问题警告在download-rustc true | if-unchanged或profile library配置下./x test library/std流程当前存在问题仅影响./x test流程./x {check,build} library/std不受影响。短期规避办法./x test library/std --set rust.download-rustcfalse或在bootstrap.toml中设rust.download-rustc false代价是需要构建 stage1 编译器。贡献流程要点getting-startedgetting-started.md 是参与编译器开发的事务性指南原文的关键内容找专家t-compiler成员并非精通所有部分。可查阅仓库根目录 triagebot.toml 中[assign*开头的章节即 triagebot 的分组指派或用git shortlog -n 1.68.2.. compiler/rustc_resolve/找出最近活跃在某模块如名称解析的提交者忽略 Rollup merge 与bors的提交从哪里入手带E-easy、E-medium、E-help-wanted、E-mentor标签的 issue许多A-diagnostics诊断相关 issue 自包含、无需深入编译器背景S-inactive标签的废弃 PR 可以接手重做E-needs-test标签已修复但缺回归测试适合新手熟悉测试基础设施PR 流程采用 fork and pull 模型可用 WIP/Draft PR 提前获得反馈或借用 CI。对大型、跨领域、高度领域特定的改动原文强烈建议先在 Zulip 的 #t-compiler 频道与编译器团队沟通把大 PR 拆成一系列更小、更易审查的 PR——这样能提前找到合适的审查者、让团队跟踪变更、尽早做方向性校验避免投入大量时间后方向不符。Part 2高层编译器架构——贯穿全局的三个设计决策part-2-intro.md 指出理解 rustc 需要抓住三个影响整个编译器的顶层设计选择查询系统query system编译器的记忆化查询基础设施对应仓库中的 compiler/rustc_query_impl 等 crate增量编译incremental compilation让重复编译只重做必要工作的机制对应 compiler/rustc_incremental驻留/内部化interning共享 AST 节点等数据结构、减少内存分配的策略相关支撑可在 compiler/rustc_arenaarena 分配器等 crate 中看到。这三个概念贯穿后续所有章节理解它们有助于把编译器看成一个整体而非孤立的阶段。Part 3源码表示——从用户输入到中间表示IRpart-3-intro.md 描述的是把用户写的原始源码转换成编译器容易处理的各种形态——即中间表示IR。整个过程从解析命令行参数、确定要编译什么开始随后把用户输入逐步转换成一系列越来越不像用户原始代码的 IR。对应仓库中的实现线索包括参数解析与前端入口compiler/rustc_parse、compiler/rustc_astHIR高层中间表示compiler/rustc_hirMIR中层中间表示compiler/rustc_mir_build。Part 4支撑基础设施——CLI 约定、driver 与错误/lint 体系cli.md 覆盖的是编译器的支撑设施命令行参数约定、编译器入口点rustc_driver与rustc_interface以及错误与 lint 的设计和实现。这些是几乎所有编译器功能都会依赖的公共设施对应仓库中的 compiler/rustc_driver、compiler/rustc_interface、compiler/rustc_errors、compiler/rustc_lint 等 crate。Part 5分析——类型系统与借用检查part-4-intro.md 讨论编译器用于检查代码性质、并影响后续阶段的各类分析。通常人们说Rust 的类型系统指的就是这部分包括类型的表示、推断与检查、trait 系统、借用检查器。原文特别强调一个关键事实这些分析不是一次大 pass 或一串连续 pass而是散布在整个编译过程的不同阶段、使用不同的中间表示。例如类型检查发生在 HIR 上对应 compiler/rustc_hir_typeck借用检查发生在 MIR 上对应 compiler/rustc_borrowck。trait 系统的实现可进一步参见 compiler/rustc_trait_selection。Part 6从 MIR 到二进制——代码生成backendpart-5-intro.md 指出此前所有章节都没有生成任何可执行机器码本部分开始真正把 MIR 变成可执行二进制。流程分三步单态化收集monomorphization collection找出要生成代码的具体类型集合——由于需要为每个具体类型生成代码必须确定泛型的实际类型参数对应仓库中的 compiler/rustc_monomorphize把 MIR 降低为代码生成 IR通常是为每个具体类型生成 LLVM IR调用代码生成后端运行优化 pass、生成可执行代码并链接出可执行文件。原文澄清了一个术语陷阱编译器源码中的 backend 通常指codegen backend代码生成后端即 LLVM、Cranelift 或 GCC。代码生成部分之所以复杂是因为支持多个后端LLVM、Cranelift、GCC后端之间尽量共享代码因此大量代码对后端实现是泛化的抽象层次很多代码生成在另一个线程中异步进行以提升性能实际代码生成由第三方库完成。架构上compiler/rustc_codegen_ssa 包含与后端无关的代码而 compiler/rustc_codegen_llvm 包含 LLVM 特有实现本仓库中还一并收录了 compiler/rustc_codegen_cranelift 与 compiler/rustc_codegen_gcc 两个备选后端。从源码结构看高层入口是rustc_codegen_ssa::base::codegen_crate它启动本部分后续章节讨论的完整流程。附录词汇表等参考信息指南末尾附有若干附录包含不同类型的参考信息其中最重要的之一是词汇表glossary见 appendix/background.md。当你在编译器源码或指南正文中遇到不熟悉的术语时这里是第一站。Constant change一份跟不上变化的指南是常态原文 Constant change 一节的态度值得每一位读者知晓rustc 是持续被大量贡献者迭代的生产级产品代码库存在大量变动churn与技术债指南中讨论的许多设计是尚未完全实现的理想化设计。因此指南无法做到事事最新——这既是现状也是邀请指南本身也是开源的发现错误请提交 issue更好的是直接提交 PR 修正。若打算为指南贡献文档请先阅读 contributing-to-guide.md 中关于如何在本指南中写文档的对应小节。原文还附了一段来自《法句经》第 277 颂的引文一切行无常以慧观照时得厌离于苦。——以此呼应指南承认不完美、持续演进的立场。其他信息来源围绕编译器生态的辅助资源原文 Other places to find information 一节汇总了指南之外的辅助资源以下均为文字描述不附外部链接rustc API 文档由 rustdoc 生成的编译器、开发工具与内部工具的文档是查 API 的一手来源ForgeRust 基础设施与团队流程文档rust-lang/rust的 LLM 政策指导 AI 工具在仓库中使用时的规范compiler-team 主页编译器团队的大本营含团队流程、活跃工作组与团队日历std-dev-guide面向标准库开发的同类指南rust-analyzer bookrust-analyzer 的官方文档t-compiler Zulip 频道提问与讨论编译器内部问题的实时社区Rust Internals 论坛讨论 Rust 内部实现的地方Rust Reference虽然不是讲内部实现但作为语言参考价值极高Rust Compiler Testing Docs见 tests/intro.md编译器测试体系文档bors 速查表bors机器人常用命令备忘。原文还给了两个实用的文档检索技巧其一用搜索引擎限定站点搜索所有 Rust 文档标准库、编译器、书籍、参考与指南可快速定位信息其二利用 Rustdoc 内置搜索功能支持按类型签名搜索——例如搜索* - vec能找到所有返回VecT的函数。在任何 Rustdoc 页面上按?可以查看搜索技巧与快捷键。在当前仓库中实践推荐的阅读路径本仓库即rust-lang/rust的完整镜像指南提到的每一个概念都能在仓库中找到对应实体。建议的实践路径从 about-this-guide.md 确定你关心的部分构建流程、某阶段的原理还是贡献流程构建侧按 quickstart.md 或 how-to-build-and-run.md 走通./x setup→./x build library→rustup toolchain link stage1 build/host/stage1对照仓库根目录的 x.py、bootstrap.example.toml 与 src/bootstrap/defaults 理解构建配置原理侧按 Part 2 → Part 3 → Part 4 → Part 5 → Part 6 的顺序阅读并随时跳转到对应 crate 源码如 compiler/rustc_hir_typeck、compiler/rustc_borrowck、compiler/rustc_codegen_ssa交叉印证贡献侧从 getting-started.md 起步用./x test tests/ui跑通最小测试回路再借助 tests/intro.md 理解测试体系。这张地图覆盖了从第一次克隆仓库到深入某个编译阶段原理的完整路径其余细节请按需检索指南各章让这份参考手册在你的开发中持续发挥作用。【免费下载链接】rustEmpowering everyone to build reliable and efficient software.项目地址: https://gitcode.com/GitHub_Trending/ru/rust创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价