2025-北航编译技术优化文章
对于优化,主要分为两个阶段的优化:中端和后端。中端对中间代码先进行优化,随后由后端生成目标代码,再由后端优化代码进行进一步的优化。 核心的优化工作主要集中在以下三个方面: mem2reg:将内存变量提升为 SSA 寄存器形式,减少 load/store 指令。 removePhi:将 Phi 指令转化为 Move 指令,以便后端 MIPS 翻译。 regAlloc:使用图着色算法进行寄存器分配。 此外,为了支撑这些核心优化,还实现了一些基础的 Pass,如死代码删除、CFG 构建、支配关系分析等。 中端优化中端优化即机器无关优化,主要针对 LLVM IR 进行处理。 死代码删除死代码删除分为两层:删除不可达基本块和删除无用指令。 删不可达基本块SurplusBlock 的实现基于图的可达性分析:从入口块出发进行 DFS,标记所有可达的块,最后将未被标记的块从函数中移除。同时,还需要清理跳转指令之后的无用指令。 1234567891011121314// 从入口块开始DFSvisited = new...
2025-北航编译技术实验文法定义及相关说明
知识产权声明:以下内容由北航编译技术课程组提供,并非本人创作,本人只负责搬运,有任何问题请以课程组为准!!! 2025编译技术实验文法定义及相关说明一、概要SysY 语言是编译技术实验所完成的编译器的源语言,是 C 语言的一个子集。一个 SysY 语言源程序文件中有且仅有一个名为 main 的主函数定义,除此之外包含若干全局变量声明、常量声明和其他函数定义。SysY 语言支持 32 位有符号数 int 类型及其的一维数组类型;const 修饰符用于声明常量。 SysY 语言本身没有提供输入/输出(I/O)的语言构造,I/O 是以运行时库方式提供,库函数可以在 SysY 程序中的函数内调用。部分 SysY 运行时库函数的参数类型会超出 SysY 支持的数据类型,如可以为字符串。SysY 编译器需要能处理这种情况,将 SysY 程序中这样的参数正确地传递给 SysY 运行时库。 函数:函数可以带参数也可以不带参数,参数的类型可以是 int 或其一维数组类型;函数可以返回 int 类型的值,或者不返回值(即声明为 void 类型)。当参数为 int...
2025 北航编译原理期中期末题目回顾
本文章主要记录了2025秋季学期北航编译原理课程实验上机期中期末的回忆题目~ 题目均由本人回忆记录,可能与原题稍有偏差,但大体思路一致 期中题目1. 新增 elif 文法:具体新增文法如下: 123Stmt -> 'if' '(' Cond ')'Stmt { 'elif' '(' Cond ')' Stmt } 1.有elif 2.无elif 3.有多个elif [ 'else' Stmt ] // 1.有else 2.无else 解题思路: 词法分析阶段识别 elif 为一个保留关键字,建立 ELIFTK。 语法分析阶段,对于 IfStmt 语法结构,新增一个 list 用来装 elif,里面每一个单元涵盖 Cond 和 Stmt。在 toString 的时候,先对 if 语句进行 toString,然后看有没有 elif,如果有的话就仿照 if 的 toString 操作去写就可以。最后对...


![北航2026软件工程作业 [I.1] 个人作业:阅读和提问](https://cdn.jsdelivr.net/gh/Justlovesmile/CDN2/post/cover4.jpg)