
书: https://pan.baidu.com/s/1A6ZLSPMbCiZ-L4eRucUvXQ?pwd=kt7i
一、编译流程概述
- “编译器分为前端(词法/语法/语义分析)和后端(代码生成/优化),中间表示(IR)是前后端的分界线。”
- “编译器的核心任务是将高级语言程序转换为语义等价的低级语言程序,同时保证正确性和效率。”
二、词法分析(Lexical Analysis)
- “词法分析器(Lexer)通过正则表达式定义词素(Token),有限自动机(DFA/NFA)实现模式匹配。”
- “Lex工具(如Flex)自动生成词法分析器,开发者只需编写规则(
.l
文件)。”
三、语法分析(Syntax Analysis)
- “上下文无关文法(CFG)用产生式描述语言结构,如
E → E + T | T
表示算术表达式。” - “自顶向下分析(如递归下降、LL(1))和自底向上分析(如LR(1))是两类主要语法分析方法。”
- “Yacc/Bison工具将LALR文法转换为语法分析器,解决移进-归约冲突和归约-归约冲突。”
四、语义分析(Semantic Analysis)
- “语义分析检查类型兼容性、作用域规则等,符号表(Symbol Table)存储标识符属性(类型/作用域)。”
- “语法制导翻译(Syntax-Directed Translation)将语义动作嵌入文法,生成中间代码或执行检查。”
五、中间代码生成
- “三地址码(如
t1 = a + b
)是常见的IR形式,介于高级语言和汇编之间,便于优化。” - “控制流图(CFG)表示程序基本块(Basic Block)间的跳转关系,是优化的基础结构。”
六、代码优化
- “局部优化:常量传播、公共子表达式消除;全局优化:循环不变量外提、死代码删除。”
- “数据流分析通过迭代算法计算到达-定值(Reaching Definitions)、活跃变量(Live Variables)等信息。”
七、目标代码生成
- “寄存器分配是代码生成的关键问题,图着色算法(Graph Coloring)解决冲突。”
- “窥孔优化(Peephole Optimization)扫描短指令序列,替换为更高效的等效指令。”
八、高级主题
- “静态单赋值形式(SSA)使变量仅赋值一次,简化数据流分析和优化。”
- “垃圾回收的标记-清除(Mark-Sweep)、复制(Copying)等算法依赖编译器插入的元数据。”
- “即时编译(JIT)在运行时生成机器码,结合解释器的灵活性和编译器的性能优势。”
九、设计哲学
- “编译器设计需权衡编译时间、目标代码效率和调试支持,不同场景选择不同策略。”
- “现代编译器(如LLVM)采用模块化设计,前后端解耦,支持多源语言和多目标架构。”