# TigerCompiler **Repository Path**: mafujing/tiger-compiler ## Basic Information - **Project Name**: TigerCompiler - **Description**: java版虎书编译器完整实现。AI生成补齐代码,供学习使用 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-02-06 - **Last Updated**: 2026-02-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Tiger Compiler (Java Educational Implementation) 这是一个基于 Andrew Appel 的经典教材 **《Modern Compiler Implementation in Java》**(虎书)的 Tiger 语言编译器全功能实现。 本项目不仅是一个可运行的编译器,更是一份**交互式学习文档**。核心代码中包含了密集的中文注释,将代码逻辑与书中的章节、算法和概念一一对应,旨在帮助初学者深入理解编译器后端的复杂细节。 --- ## 📚 对应教材章节 (Textbook Mapping) 本项目结构清晰地划分为前端、中端和后端,完美契合书中章节: ### 前端 (Frontend) | 模块 | 路径 | 对应章节 | 核心概念 | | :--- | :--- | :--- | :--- | | **Lexer** | `src/Frontend/Parse/Lexer.java` | **Ch 2** | 词法分析 (Lexical Analysis) | | **Parser** | `src/Frontend/Parse/Parser.java` | **Ch 3-4** | 语法分析 (Parsing), 抽象语法树 (AST) | | **Semant** | `src/Frontend/Semant/Semant.java` | **Ch 5** | 语义分析 (Type Checking), 环境 (Env) | ### 中端 (Middle End) | 模块 | 路径 | 对应章节 | 核心概念 | | :--- | :--- | :--- | :--- | | **Translate** | `src/MiddleEnd/Translate` | **Ch 7** | IR 翻译 (Translation to Intermediate Code) | | **Canon** | `src/MiddleEnd/Canon` | **Ch 8** | 规范化 (Canonicalization), 基本块 (Basic Blocks) | ### 后端 (Backend) - *重点注释区域* | 模块 | 路径 | 对应章节 | 核心概念 | | :--- | :--- | :--- | :--- | | **Frame** | `src/Backend/Mips/MipsFrame.java` | **Ch 6** | 栈帧布局 (Activation Records), 静态链 (Static Links) | | **Codegen** | `src/Backend/Mips/Codegen.java` | **Ch 9** | 指令选择 (Instruction Selection), 最大匹配 (Maximal Munch) | | **Liveness** | `src/Backend/RegAlloc/Liveness.java` | **Ch 10** | 活跃分析 (Liveness Analysis), 冲突图 (Interference Graph) | | **RegAlloc** | `src/Backend/RegAlloc/RegAlloc.java` | **Ch 11** | 寄存器分配 (Register Allocation), 图着色 (Graph Coloring) | --- ## 🚀 快速开始 (Quick Start) ### 1. 编译项目 本项目使用 Maven 进行构建: ```bash mvn clean compile ``` ### 2. 运行编译器 运行主驱动程序 `Driver.Main`,传入 Tiger 源代码文件: ```bash java -cp target/classes Driver.Main test_args.tig ``` 编译器将输出: 1. **AST**: 抽象语法树结构。 2. **Linearized IR**: 线性化的中间代码。 3. **MIPS Instructions**: 寄存器分配前的汇编指令。 4. **Final Assembly**: 最终的 MIPS 汇编代码(可直接运行)。 --- ## 🌟 核心特性与实现细节 ### 1. MIPS O32 调用约定 (Calling Convention) - **参数传递**: 前4个参数通过 `$a0-$a3` 传递,超过4个的参数压入栈中。 - **栈帧管理**: 严格遵循 MIPS O32 ABI,包含 Caller's Frame, Shadow Space (16 bytes), Saved Registers 等区域。 - **实现位置**: 参见 `src/Backend/Mips/MipsFrame.java` 中的图解注释。 ### 2. 视图转换 (View Shift) - 实现了从“抽象参数”到“物理位置”的转换。 - 函数入口处将 `$a0-$a3` 及栈上参数移动到编译器的临时变量 (Temporaries) 中,使得函数体代码与具体调用约定解耦。 ### 3. 图着色寄存器分配 (Graph Coloring Register Allocator) - 实现了完整的 Ch 11 算法:**Build -> Simplify -> Coalesce -> Freeze -> Spill -> Select**。 - 处理了 **预着色寄存器 (Precolored Registers)** 和 **调用破坏寄存器 (Caller-save Registers)** 的约束。 - 实现了 **溢出 (Spilling)** 机制:当颜色不足时,自动将变量溢出到栈上并重写程序。 ### 4. 教学级注释 - 关键算法(如 `Maximal Munch` 指令选择、`Liveness` 数据流分析)均配有详细的中文解释。 - 解释了“为什么这样做”以及“对应书上哪一部分”。 --- ## 📂 示例文件 - `test_args.tig`: 测试多参数函数调用(>4个参数),验证栈传递机制。 - `test_codegen.tig`: 综合测试控制流和算术运算。