编译原理CH1
编译原理CH1
1. 编译器基本概念 • 定义:编译器是将程序从一种语言(源语言)翻译为另一种语言(目标语言)的程序。
• 与解释器的区别:
• 共同点:均为语言实现系统。
• 差异:
1 | ◦ 解释器:在翻译过程中直接执行源程序(如Python)。 |
2. 编译阶段划分 (1) 前端(Frontend) 与源语言相关,包括:
词法分析(Lexical Analysis/Scanning) • 功能:将源代码分解为词法单元(tokens),如标识符、关键字、运算符等。
• 示例:
b=a+i*2
→[id:b, =, id:a, +, id:i, *, num:2]
• 输出:符号表条目(如标识符名称、类型等)。
语法分析(Syntax Analysis/Parsing) • 功能:根据语法规则构建语法树(如抽象语法树AST),检查结构合法性。
• 示例:
i*2
→ 乘法表达式节点,a+i*2
→ 加法表达式节点。• 关键点:语法分析器通常负责创建符号表条目(因知晓程序结构)。
语义分析(Semantic Analysis) • 功能:检查类型一致性、作用域规则等语义错误。
• 示例:验证
a
和i
是否已声明、*
操作是否适用于i
和2
。中间代码生成(IR Generation) • 功能:生成与机器无关的中间表示(如三地址码、四元式)。
• 示例:
t1 = i * 2; t2 = a + t1; b = t2
。
(2) 后端(Backend) 与目标语言相关,包括:
中间代码优化(IR Optimization) • 功能:简化或优化中间代码(如常量折叠、死代码删除)。
• 示例:若
i
为常量,直接计算i*2
。目标代码生成(Code Generation) • 功能:将中间代码转换为目标机器代码(如x86汇编)。
• 示例:生成
MOV R1, i; MUL R1, 2; ADD R1, a; MOV b, R1
。目标代码优化(Optimization) • 功能:提高目标代码效率(如寄存器分配、指令调度)。
3. 符号表(Symbol Table) • 作用:存储标识符信息(名称、类型、存储位置等),贯穿编译全过程。
• 创建时机:
• 词法分析器:可能初步创建条目(如记录标识符字符串)。
• 语法分析器:更常见,因能区分不同声明(如变量 vs 函数)。
• 内容示例:
标识符 | 类型 | 地址 | 作用域 |
---|---|---|---|
a |
int | 0x1000 | global |
4. 问题解析:b=a+i\*2
的编译阶段
假设题目中的A, B, C, D, E
对应以下阶段:
- A(词法分析):生成词法单元序列(如
id:b, =, id:a, +, id:i, *, num:2
)。 - B(语法分析):构建语法树,如赋值语句左
b
、右表达式a+i*2
。 - C(语义分析):检查类型匹配(如
a
和i
是否为数值类型)。 - D(中间代码生成):生成三地址码(如
t1=i*2; t2=a+t1; b=t2
)。 - E(目标代码生成):输出汇编指令(如
MOV, MUL, ADD
等)。
5. 关键总结 • 前后端分离:提升开发效率,支持多源语言+多目标语言的灵活组合。
• 分析 vs 综合:
• 分析:分解源程序,生成中间表示 + 符号表(前端)。
• 综合:利用中间表示生成目标代码(后端)。
• 符号表核心角色:桥梁作用,连接分析阶段的语义信息与后端的代码生成。