You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
HN 01e05a0a8e
完成 Lab2 相关代码实现
17 hours ago
doc Merge remote-tracking branch 'educoder/master' 3 weeks ago
include 完成 Lab2 相关代码实现 17 hours ago
result 完成 Lab2 相关代码实现 17 hours ago
scripts 完成 Lab2 相关代码实现 17 hours ago
src 完成 Lab2 相关代码实现 17 hours ago
sylib chore(misc): 按目录结构设计初始化工程骨架 3 months ago
test/test_case 完成 Lab2 相关代码实现 17 hours ago
third_party build(antlr): 引入第三方 ANTLR4 runtime/tool 并接入构建 3 months ago
.gitignore chore(dev): 调整test用例结构 4 weeks ago
CMakeLists.txt refactor(frontend): 添加对只编译前端的支持 4 weeks ago
README.md 完成 Lab2 相关代码实现 17 hours ago
实验说明.txt 完成 Lab2 相关代码实现 17 hours ago

README.md

SysY 编译器课程实验C++

本仓库为“并行编译课程实验”提供一个 SysY 编译器的最小可运行示例,实验按 Lab1Lab6 逐步完成: 从前端(词法/语法分析与语法树处理到中端IR 生成、基本标量优化再到后端ARM64/AArch64 汇编生成、寄存器分配与后端优化),最后进行循环/并行相关优化。

1. 实验介绍

实验 名称 任务/目标
Lab1 语法树构建 基于 SysY 源程序完成语法分析与语法树构建
Lab2 中间表示生成 将语法树翻译为 LLVM 风格的中间表示IR并输出 IR
Lab3 指令选择与汇编生成 将 IR 翻译为目标平台汇编代码(本项目以 ARM64/AArch64 为主)
Lab4 基本标量优化 实现常见的标量优化(如常量传播、死代码删除、简化 CFG 等)
Lab5 寄存器分配与后端优化 为后端生成的虚拟寄存器分配物理寄存器,并完成 spill/reload、冗余指令消除与局部后端优化
Lab6 并行与循环优化 面向循环的优化(循环变换/并行化等),进一步提升程序性能

2. 参考资料

本仓库提供的示例代码和实验文档只是参考。我们非常鼓励大家在阅读当前仓库实现的同时,也结合自己的理解重新设计框架并完成实现,而不是机械照搬。

如果希望进一步参考编译相关项目和往届优秀实现,可以查看编译比赛官网的技术支持栏目:https://compiler.educg.net/#/index?TYPE=26COM。其中的“备赛推荐”整理了一些编译相关项目,也能看到往届优秀作品的开源实现,这些内容都很值得参考。

4. 实验环境配置

4.1 系统建议

建议使用 Ubuntu 22.04 或 WSLUbuntu 22.04 环境)。

4.2 安装基础依赖

本项目使用 CMake + C++17 构建;前端基于 ANTLR运行 ANTLR 的 antlr-*.jar 需要 Java。

sudo apt update
sudo apt install -y build-essential cmake git openjdk-11-jre

4.3 安装 LLVM 工具链

scripts/verify_ir.sh--run 模式下会调用 LLVM 工具链(llcclang)将生成的 IR 编译、运行,并在存在同名 .out 时自动比对输出结果。

sudo apt update
sudo apt install -y llvm clang

4.4 安装 ARM64 交叉编译工具链与 QEMU

后续实验会生成 ARM64/AArch64 汇编代码,并使用 ARM64 交叉编译工具链完成汇编、链接;再用 QEMU 用户态模拟器运行生成的 ARM 可执行文件。

# 安装 ARM64 交叉编译工具链
sudo apt update
sudo apt install gcc-aarch64-linux-gnu

# 安装 QEMU 用户模式模拟器
sudo apt install qemu-user

5. 编译与运行

5.1 生成 Lexer/Parser

本仓库已内置 ANTLR jarthird_party/antlr-4.13.2-complete.jar。 当前 CMake 只会收集构建目录中的 Lexer/Parser 生成文件,不会自动调用 ANTLR因此首次构建前需要先生成 Lexer/Parser 及相关生成文件。

生成文件不提交到仓库,统一输出到 build/generated/antlr4/

mkdir -p build/generated/antlr4

java -jar third_party/antlr-4.13.2-complete.jar \
  -Dlanguage=Cpp \
  -visitor -no-listener \
  -Xexact-output-dir \
  -o build/generated/antlr4 \
  src/antlr4/SysY.g4

5.2 Lab1 语法树构建

cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DCOMPILER_PARSE_ONLY=ON
cmake --build build -j "$(nproc)"

该模式只构建前端解析与语法树打印,不编译 sem / irgen / mir,适合 Lab1。

构建成功后,可执行文件位于:./build/bin/compiler

运行语法树打印:

./build/bin/compiler --emit-parse-tree test/test_case/functional/simple_add.sy

5.3 全量构建

cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DCOMPILER_PARSE_ONLY=OFF
cmake --build build -j "$(nproc)"

该模式会继续编译 sem / irgen / mir,用于后续实验。

5.4 运行自检

运行帮助信息能正常输出,说明基本环境与可执行文件均正常:

./build/bin/compiler --help

若当前处于 Lab1只需检查语法树输出是否符合预期。

若需要跑完整编译流程自检,则先使用全量构建模式,再执行下面的命令:从 SysY 源码生成 AArch64 汇编,完成汇编、链接,在 QEMU 下运行结果程序,并与 test/test_case 下同名 .out 自动比对:

./scripts/verify_asm.sh test/test_case/functional/simple_add.sy test/test_result/function/asm --run

如果最终看到 输出匹配: test/test_case/simple_add.out,说明当前示例用例 return a + b 的完整链路已经跑通。 但这条命令只适合做单个用例检查。完成对应实验后,不能只停留在 simple_add,还应覆盖 test/test_case 下全部测试用例;如有需要,也可以自行编写批量测试脚本统一执行。