0 绪论
编译器:将高级语言程序翻译成可以在机器上运行的目标语言
编译器是一个程序:核心功能是把源代码翻译成目标代码
编译器设计的原则
- 语义相同
- 以某种可察觉的方式改进输入程序
编译器结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ypl9LW0S-1641899844247)(…/picture/63.png)]
前端:词法分析,语法分析,将输入的代码映射到IR
后端:指令生成,指令优化,将IR映射到目标机的指令集和有限的资源上
IR:中间表示,编译器使用一些数据结构来表示它处理的代码,这种形式称为IR
两阶段结构:简化编译器重定目标的过程(改变编译器是只针对新处理器生成代码的任务,通常称为该编译器重定目标)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s4C5vAcM-1641899844248)(…/picture/64.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-taobUZcJ-1641899844250)(…/picture/65.png)]
编译器构造和具体的编译器目标相关,目前结构之上需要再增加一个
代码优化阶段
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3gVdAbMA-1641899844250)(…/picture/66.png)]
另一个实例
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sd6d3MLV-1641899844251)(…/picture/67.png)]
词法分析器:将字符构成的串转换为单词构成的流
通常基于词类来引用单词,标识输入程序中的各个单词,并将每个单词归入对应的词类。
**语法分析器:**判断输入流是否是源语言的一个句子
**类型检查:**检查输入程序中对名字的使用在类型方面是否一致
**中间表示:**前端处理的最后一个问题是生成代码的IR形式
**优化器:**分析+转换
指令选择:将每个IR操作在各自的上下文中映射为一个或多个目标机操作
寄存器分配:将虚拟寄存器映射到实际的目标机寄存器
**指令调度:**为产生执行快速的代码,代码生成器可能需要重排操作
编译器的性质
-
编译的效率,即编译一个程序的速度和代价
-
编译生成代码的效率,即编译器生成可执行程序的运行效率
-
编译生成代码的质量,即和源代码语义等价性
-
编译的效率,即编译一个程序的速度和代价
-
编译生成代码的效率,即编译器生成可执行程序的运行效率
-
编译生成代码的质量,即和源代码语义等价性