💡
原文中文,约10600字,阅读约需26分钟。
📝
内容提要
Rust 程序编译过程包括 Lexing、Parsing、HIR lowering、MIR lowering、Code generation、Ast validation 和 Type Inference 等几个阶段,其中 HIR 和 MIR 是比较低层次的中间表示,Codegen 是最后的代码生成阶段。
🎯
关键要点
- Rust 程序编译过程包括多个阶段:Lexing、Parsing、HIR lowering、MIR lowering、Code generation、Ast validation 和 Type Inference。
- 编译器是输入输出系统,每个阶段都有对应的输入和输出,lowering 是将程序中的抽象由高变低的过程。
- Lexing 阶段将源程序解析为 token 流。
- Parsing 阶段将 token 流转换为 AST,并进行宏扩展、AST 验证和名称解析。
- HIR lowering 将 AST 转换为高级中间表示 HIR,涉及类型推断和类型检查。
- MIR lowering 将 HIR 转换为中间表示 MIR,用于借用检查和数据流检查。
- Code generation 阶段主要基于 LLVM 进行代码生成。
- 编译入口在 rustc_driver::main,编译流程包括 Parsing、Analyzing 和 Linking。
- Rust 编译器采用按需编译的方式,通过缓存减少重复计算,提高增量编译速度。
- Lexing 过程输出为 TokenStream,处理宏时使用树形结构。
- Parsing 使用手写的递归下降方法,能够提供更好的错误诊断信息。
- 宏展开在 AST 构建后进行,处理 AST 中的占位符。
- 名称解析解析 AST 中的所有名字,涉及复杂的命名空间管理。
- Ast validation 进行简单的检查,确保 AST 的有效性。
- HIR 是主要的中间表示,生成后与 Rust 表面语法相似,便于分析。
- 类型推断使用改进的 Hindley-Milner 算法,自动检测表达式类型。
- MIR 是更低层次的中间表示,便于控制流分析和代码优化。
- Codegen 阶段将 MIR 转换为 LLVM IR,并生成最终的二进制文件。
➡️