编译器概述、编译器结构、编译器实例
编译器概述
1.编译器是一个程序
核心功能是把源代码翻译成目标代码
比如源代码:C/C++,Java,C#,html
目标代码:X86,IA64,ARM,…
把一种源程序翻译成另外一种源程序,例如:将C++ 利用Cfront翻译成C语言(广义上)
把源程序翻译成目标代码,比如:C语言翻译成X86
源代码经过编译器的翻译生成目标代码(静态计算,不执行这个代码,要保证语义相同,语义保持)
真实的计算机 或 JVM虚拟机 通过对目标代码进行动态计算得到结果
解释器:解释器也是处理程序的一种程序
编译器:gcc g++ 得到可执行程序 离线的方式 offline
解释器 处理过程 得到结果 在线 online
编译器的高层结构
编译器具有非常模块化的高层结构
输入→前端()→后端()→输出
前端:做词法分析、语法分析的部分
后端:做指令生成、指令优化的部分
抽象的多个阶段(phase)
编译器可以看成多个阶段构成的“流水线”结构
典型编译器高层结构
一种没有优化的编译器结构
1.词法分析(第一个阶段 字符序列处理后得到 记号序列 )
2.语法分析(记号序列 处理后 建立 抽象语法树)
3.语义分析(对语法树的合法性进行处理,程序没有语义语法的错误后 得到中间代码,如果这个语义没错,后面步骤就不会再报错了,这里已经将代码的语法语义检测完毕)
4.代码生成(由中间代码 生成目标代码)
符号表:存取了编译过程中的相关信息,和上述阶段都有联系
更复杂的一种编译器结构
**小结:**编译器由多个阶段组成,每个阶段都要处理不同的问题(使用不同的理论、数据结构和算法)
编译器设计中的重要问题是如何 合理的划分组织各个阶段
接口清晰
编译器容易实现、维护
编译器示例
规则
编译器实现:
任务:编译程序1+2+3到栈式计算机
(左结合)
“1+2+3” 用树来存储(中序遍历)AST
前端语法分析 代码生成(使用树的后序遍历 post-order) stack
- 遇到的节点是n的话就push n
- 遇到的节点是加号的话就生成代码“add”
阶段一:词法分析
阶段二:语法树生成
阶段三:代码生成
小结
- 编译器的构造和具体的编译器目标相关,
前端负责将输入的 变成语法树(中间表示)
后端做代码生成(生成stack)也就是目标代码。 - 任务:增加一个代码优化的阶段