什么是编译程序
定义:
简单地,一个编译程序就是一个语言翻译程序,它把一种语言(称作源语言)书写的程序翻译成另一种语言(称作目标语言)书写的等价程序
为什么学习编译原理
计算机领域:程序设计语言、软件技术、思维方法
应用领域:
- 信息检索:文本描述;
- 人工智能:句法分析、自然语言理解;
- 网络语言:XML, SGML;
- 网络通信:通信协议描述与解释;
编译过程概述
词法分析
词法分析或扫描) ---构成源程序的字符流从左到右读取并分组为标记,标记是具有集体含义的字符序列。
语法分析
层次分析,依据源程序的语法规则把源程序的单词序列组成语法短语(表示成语法树)
规则:
- <赋值语句>::=<标识符>“:=”<表达式>
- <表达式>::=<表达式>“+”<表达式>
- <表达式>::=<表达式>“*”<表达式>
- <表达式>::=“(”<表达式>“)”
- <表达式>::=<标识符>
- <表达式>::=<整数>
- <表达式>::=<实数>
语义分析
审查源程序有无语义错误,为代码生成阶段收集类型信息。进一步分析解析后的程序,以确定它是否符合源语言的上下文约束、范围规则、类型规则
- 上下文相关性
- 类型匹配
- 类型转换
中间代码生成
这是创建源程序的中间表示形式的地方。我们希望这种表示易于生成,并且易于转换为目标程序。表示形式可以有多种形式,但常见的形式称为三地址代码或四元组代码。
设计原则:
- 容易生成
- 容易翻译成目标代码
代码优化
中间代码优化:优化器接受中间表示中的输入,并输出仍处于中间表示中的版本。在此阶段,编译器尝试通过应用各种技术来生成最小、最快和最有效的运行结果。
目标代码优化
符号表
记录源程序中使用的名字,收集每个名字的各种属性信息,如:类型、作用域、分配存储信息
出错处理
检查错误、报告出错信息、排错、恢复编译工作
编译程序结构
编译程序中的主要数据结构
- 记号表 token(单词的内部表示)
- 语法树 syntax tree
- 符号表 symbol table
- 常数表 literal table
- 中间代码 intermediate code
- 临时文件 temporary file
几个重要概论
趟 (pass, 遍):对源程序(包括源程序中间形式)从头到尾扫描一次,并做有关的加工处理,生成新的源程序中间形式或目标程序,通常称之为一遍
单趟扫描
多趟扫描
编译的前端 (front end):通常将与源程序有关的编译部分称为前端。词法分析、语法分析、语义分析、中间代码生成、代码优化(与源语言有关)
编译的后端 (back end):与目标机有关的部分称为后端。目标程序生成(以及与目标机有关的优化)(与目标机有关)
编译程序生成
交叉编译:由于目标机指令系统与宿主机的指令系统不同,编译时将应用程序的源程序在宿主机上生成目标机代码,称为交叉编译
自展(自编译)
移植
自动生成程序