前端编译(编译原理知识点整理)

前端编译(编译原理知识点整理)
编译原理知识点整理


一、编译概述

· 知识点:编译器的结构(前端 vs 后端)、编译的各个阶段(词法分析、语法分析、语义分析、中间代码生成、优化、目标代码生成)、遍(Pass)的概念、编译与解释的区别。

· 重点:清晰理解各阶段的任务及其输入/输出(如符号表和错误处理是所有阶段共享的核心数据结构与功能)。

二、词法分析

· 知识点:词法规则的形式化描述(正则表达式、正则定义)、有限自动机(不确定的有限自动机NFA和确定的有限自动机DFA)、词法分析器自动生成工具(如Lex/Flex)的原理。

· 重点:

· 正则表达式:描述单词符号(关键字、标识符、常数等)。

· NFA到DFA的转化(子集构造法)。

· 难点:

· DFA的最小化(Hopcroft算法):这是考试和设计的高频考点。

三、语法分析

这是编译原理课程的核心难点,主要研究如何根据文法规则识别程序的语法结构(如表达式、语句)。

· 知识点:上下文无关文法(CFG)、推导(最左推导/最右推导)、语法分析树、二义性、左递归、左公因子。

· 重点与难点:

1. 自顶向下分析

· LL(1)文法:计算First集、Follow集,构建预测分析表。

· 难点:判断一个文法是否为LL(1)文法,并利用预测分析表进行句子分析。

2. 自底向上分析

· LR分析法:包括LR(0)、SLR(1)、LR(1)和LALR。

· 核心概念:句柄、活前缀、项目、移进-归约冲突、展望符。

· 难点:

· LR(0)项目集规范族的构造。

· SLR(1)分析表的构造(利用Follow集解决冲突)。

· LR(1)项目集的构造(比SLR更精确,能解决更多冲突)。

· 二义性文法的处理(如悬空else问题,通过优先级和结合性规则解决)。

四、语法指导的翻译与中间代码生成

· 知识点:语法制导定义(SDD)、语法制导翻译方案(SDT)、中间表示形式(抽象语法树AST、三地址码、四元式、三元式)。

· 重点:

前端编译(编译原理知识点整理)

· S属性定义(适合自底向上计算)与L属性定义(适合自顶向下计算)。

· 常见语句的翻译:声明语句(符号表填加)、赋值语句、布尔表达式(短路代码)、控制流语句(if-then-else、while-do的拉链-回填技术)。

· 难点:回填技术,在处理循环和条件分支时,如何管理真/假链,在目标地址确定后回填。

五、符号表与运行时环境

· 知识点:符号表的作用与组织(哈希表、栈结构)、存储布局(代码区、静态区、堆、栈)、活动记录(AR)的结构(局部变量、形参、返回地址、动态链、静态链)、参数传递方式(传值、传引用、传名)。

· 重点:

· 嵌套作用域:如何处理嵌套过程(如Pascal),通过静态链或显示表(Display表)访问外层作用域的变量。

· 难点:Display表的维护:在过程调用/返回时如何正确更新。

六、代码优化

· 知识点:优化的分类(机器无关优化 vs 机器相关优化、局部优化 vs 全局优化)、基本块划分、流图、数据流分析(到达定值、活跃变量分析)。

· 重点:

· 局部优化:常量折叠、公共子表达式删除、复制传播、死代码删除。

· 循环优化:代码外提、强度消弱、归纳变量删除。

· 难点:数据流分析:理解数据流方程(如到达定值的GEN和KILL集),并能在流图上迭代求解。

七、目标代码生成

· 知识点:指令选择、寄存器分配(图着色算法)、指令调度(考虑流水线延迟)。

· 重点:寄存器分配。

· 难点:图着色寄存器分配:构建寄存器冲突图(干涉图),通过图着色算法分配寄存器,当颜色(寄存器)不够时,需要将某些变量溢出(Spill)到内存。


复习建议

1. 抓住主线:从源代码 → 词法单词 → 语法树 → 中间代码 → 目标代码的流程,理解每个阶段的输入输出。

2. 动手实践:尝试为一个简单的表达式或控制流语句(如if或while)手动构造词法分析、语法分析树,并生成相应的中间代码。纸上推演是掌握LL/LR分析表构造最有效的方法。

3. 工具辅助:如果有条件,可以尝试学习Lex/Yacc(或Flex/Bison)这类工具,通过实际编写小型语言的编译器,能帮助你直观地理解前端各个阶段的衔接和实现原理。

文章版权声明:除非注明,否则均为边学边练网络文章,版权归原作者所有

相关阅读

最新文章

热门文章

本栏目文章