编译器概述
什么是编译器?
- 编译器是一个程序
- 核心功能是把源代码翻译成目标代码
- 源代码:C/C++、Java、C#、html、SQL…
- 目标代码:x86、IA64、ARM、MIPS…
编译器的核心功能
编译器和解释器
- 解释器也是处理程序的一种程序
- 不会翻译成可执行程序,直接得到结果
- 编译器是离线(offline)的方式,解释器是在线(online)的方式
- 但两者在理论、技术、方法上有很大的相似之处
编译器简史
- 第一个编译器是Fortran语言的编译器
- 1954-1957年,Jonn Backus
编译器结构
编译器的高层结构
- 编译器具有非常模块化的高层结构
- 前端:处理和输入相关,源程序的语法规则,满足的约束条件
- 词法分析
- 语法分析
- 后端:处理和输出相关,目标机器有什么指令集,有什么约束,前端的语法结构如何映射到指令集上
- 指令生成
- 指令优化
- 前端:处理和输入相关,源程序的语法规则,满足的约束条件
- 编译器可看成多个阶段构成的“流水线”结构,使抽象一层一层向下降低,每一个模块相对容易实现和维护
一种没有优化的编译器结构
更复杂的一种编译器结构
- 编译器设计中的重要问题是如何合理的划分组织各个阶段
编译器实例
源语言:加法表达式语言Sum
- 两种语法形式:
- 整形数字n
- 加法e1+e2
目标机器:栈式计算机Stack
- 两条指令:
push n
add
- 相当于
x=pop(); y=pop(); z=x+y; push z
- 相当于
任务:编译程序1+2+3
到栈式计算机
任务:增加一个代码优化的阶段,常量折叠
在扔给后端之前,多一个优化阶段
来源:
1. 华保健网易云课堂授课,如有侵权请联系本人删除
2. 虎书