编译原理CH1


1. 编译器基本概念 • 定义:编译器是将程序从一种语言(源语言)翻译为另一种语言(目标语言)的程序。

• 与解释器的区别:

• 共同点:均为语言实现系统。

• 差异:

1
2
3
◦ 解释器:在翻译过程中直接执行源程序(如Python)。

◦ 编译器:生成目标代码(如机器码),翻译完成后执行(如C语言)。

2. 编译阶段划分​(1) 前端(Frontend)​​ 与源语言相关,包括:

  1. 词法分析(Lexical Analysis/Scanning) • 功能:将源代码分解为词法单元(tokens),如标识符、关键字、运算符等。

    • 示例:b=a+i*2[id:b, =, id:a, +, id:i, *, num:2]

    • 输出:符号表条目(如标识符名称、类型等)。

  2. 语法分析(Syntax Analysis/Parsing) • 功能:根据语法规则构建语法树(如抽象语法树AST),检查结构合法性。

    • 示例:i*2 → 乘法表达式节点,a+i*2 → 加法表达式节点。

    • 关键点:语法分析器通常负责创建符号表条目(因知晓程序结构)。

  3. 语义分析(Semantic Analysis) • 功能:检查类型一致性、作用域规则等语义错误。

    • 示例:验证ai是否已声明、*操作是否适用于i2

  4. 中间代码生成(IR Generation) • 功能:生成与机器无关的中间表示(如三地址码、四元式)。

    • 示例:t1 = i * 2; t2 = a + t1; b = t2

(2) 后端(Backend) 与目标语言相关,包括:

  1. 中间代码优化(IR Optimization) • 功能:简化或优化中间代码(如常量折叠、死代码删除)。

    • 示例:若i为常量,直接计算i*2

  2. 目标代码生成(Code Generation) • 功能:将中间代码转换为目标机器代码(如x86汇编)。

    • 示例:生成MOV R1, i; MUL R1, 2; ADD R1, a; MOV b, R1

  3. 目标代码优化(Optimization) • 功能:提高目标代码效率(如寄存器分配、指令调度)。


3. 符号表(Symbol Table) • 作用:存储标识符信息(名称、类型、存储位置等),贯穿编译全过程。

• 创建时机:

• 词法分析器:可能初步创建条目(如记录标识符字符串)。

• 语法分析器:更常见,因能区分不同声明(如变量 vs 函数)。

• 内容示例:

标识符 类型 地址 作用域
a int 0x1000 global

4. 问题解析:b=a+i\*2的编译阶段 假设题目中的A, B, C, D, E对应以下阶段:

  1. A(词法分析):生成词法单元序列(如id:b, =, id:a, +, id:i, *, num:2)。
  2. B(语法分析):构建语法树,如赋值语句左b、右表达式a+i*2
  3. C(语义分析):检查类型匹配(如ai是否为数值类型)。
  4. D(中间代码生成):生成三地址码(如t1=i*2; t2=a+t1; b=t2)。
  5. E(目标代码生成):输出汇编指令(如MOV, MUL, ADD等)。

5. 关键总结 • 前后端分离:提升开发效率,支持多源语言+多目标语言的灵活组合。

• 分析 vs 综合:

• 分析:分解源程序,生成中间表示 + 符号表(前端)。

• 综合:利用中间表示生成目标代码(后端)。

• 符号表核心角色:桥梁作用,连接分析阶段的语义信息与后端的代码生成。