【计算机基础/笔记】编译原理简要知识
编译原理
编译
简单说,编译器是一个程序,它读入用某种语言(源语言)编写的程序并将其翻译成一个与之等价的以另一种语言(目标语言)编写的程序,且在翻译过程中,编译器能够向用户报告被编译的源程序中出现的错误。编译的分析-综合模型
编译由两部分组成:分析与综合。
分析:将源程序形成基本块并形成中间表示。
综合:把中间表示转换为所需的目标程序。
分析
- 线性分析(词法分析)
从左到右地读构成源程序的字符流,而且把字符流分组为多个记号(token),而记号是有整体含义的字符序列。 - 层次分析(语法分析)
在层次分析中,字符串或记号在层次上划分为具有一定层次的多个嵌套组,每个嵌套组具有整体的含义。
它把源程序的记号进一步分组,产生被编译器用于生成代码的语法短语。通常源程序的语法短语用分析树来表示。 - 语义分析
在语义分析中,要进行某些检查,以确保程序各个组成部分确实是有意义地组合在一起。
语义分析阶段检测源程序的语义错误,并收集代码生成阶段要用到的类型信息。语义分析利用语法分析阶段确定的层次结构来识别表达式和语句中的操作符和操作数。
综合
- 中间代码生成
完成语法分析语义分析后,产生源程序的一个显式中间表示,这种中间表示可以看成是某种抽象机的程序。
中间表示应具有两个重要性质:- 易于产生
- 易于翻译成目标程序。
- 代码优化
这个阶段会试图改进中间代码(如做一些算法优化等),以产生执行速度较快的机器代码。 - 代码生成
编译的最后一个阶段是目标代码生成,生成可重定位的机器代码或汇编代码。
这一阶段编译器为源程序定义和使用的变量选择存储单元,并把中间指令翻译成完全相同人物的机器代码指令序列。
这一阶段的一个关键问题是变量的寄存器分配。
符号表管理和错误处理是编译器的六个阶段都要涉及的两项活动。
-
符号表管理
- 属性信息
标识符的属性信息表明了该标识符的存储位置、类型、作用域(在哪段程序中有效)等
当标识符是过程名时,它的属性信息还包括参数个数与类型、每个参数的传递方式以及返回值类型等 - 符号表
符号表是一种数据结构。每个标识符在符号表中都有一条记录,记录的每个域对应于该标识符的一个属性。
编译器的一个基本功能是记录源程序中使用的标识符并收集与每个标识符相关的各种属性信息。
标识符的属性信息将由词法分析以后的各阶段陆续写入符号表,并以各种方式使用。 - 属性信息
错误处理
每阶段都可能遇到错误,检测到错误以后,必须以恰当方式处理,使得编译器能继续运行。
参考资料:《编译原理》—(美)Alfred V.Aho;Monica S.Lam;Ravi Sethi;Jeffrey D.Ullman 著 ; 赵建华 / 郑滔 / 戴新宇 译