编译器的核心功能:就是把源代码翻译成目标代码
实现这个功能要经历什么步骤呢?
理解源代码:词法分析,语法分析,语义分析
转化为等价的目标代码:中间代码生成,目标代码生成
优化:优化方法
编译器的结构:
每个阶段源程序从一种表示转换成另一种表示。
- 词法分析器:字符流->单词流
- 语法分析器:单词流->语法树
- 语义分析器:
- 收集标识符的属性信息:
- 类型
- 种属
- 存储位置、占用内存
- 值
- 作用域
- 参数和返回值
- 语义检查:
- 变量或者过程未经声明就使用
- 变量或过程名重复声明
- 运算分量类型不匹配
- 操作符与操作数的类型不匹配
- 收集标识符的属性信息:
- 中间代码生成器:抽象语法树->中间表示(与平台无关的抽象程序)
- 代码优化器:改进中间代码,产生执行速度较快的机器码,如:xx=r+q;yy=w+xx;zz=yy;----->xx=r+q;zz=w+xx;
- 代码生成器:生成可重定位(编译的时候不是变成物理地址而是用标识符表示的逻辑地址)的机器代码或汇编代码
- 符号管理器:
- 基本功能是记录源程序中使用的标识符
- 收集与每个标识符相关的各种属性信息
- 将收集到的信息记录到符号表中
- 错误处理器:
- 处理方式:报告错误,应继续编译
- 大部分错误在语法分析和语义分析阶段检测出来
- 词法分析:字符无法构成合法单词
- 语法分析:单词流违反语法结构规则
- 语义分析:语法结构正确但无实际意义