编译原理总结
1.编译程序概述
1.1概叙
计算机使用的语言可以分为:高级语言、汇编语言和机器语言三个层次。
编译程序可以将高级语言程序变换为可以在计算机上面执行的形式,同一种高级语言可以配置多种不同的编译程序。
1.2编译程序
1.2.1编译程序的功能
编译程序是专门以高级程序设计语言的源程序作为翻译对象进行翻译处理的,其基本功能是把高级语言源程序翻译成等价的目标程序,还具有语法检查、语义检查和错误处理等功能。

1.2.2解释程序
解释程序同样是将高级语言源程序翻译成目标语言程序,但是解释程序不是像编译程序那样将高级语言程序源程序翻译之后产生一个目标程序,而是边翻译边执行,直至整个程序执行完毕。
两者区别:编译程序先全部把源程序翻译成目标程序,然后再执行,而且目标程序可以反复执行。解释程序以源程序作为输入,但是不生产整个的目标文件,而是边解释边执行源程序本身。
1.2.3编译程序的工作过程
整体流程如下图所示

1.词法分析 :
从左到右一个字符一个字符地读入源程序,对构成源程序的字符流进行组合,构成单词,该阶段也被称为扫描源程序。该阶段的主要功能是审查源程序是否有此法错误,为代码生成阶段收集信息。
2.语法分析 :
在词法分析基础上,根据语言的语法规则对源程序的单词流进行分析,将单词符号串转化为语法单位(表达式 语句 程序 程序段),并确定整个输入串是否构成语法上正确的程序。
3.语义分析 :
对语法分析所识别出的各种语法单位,分析其含义,并初步翻译并产生中间代码。该阶段的主要功能是审查源程序有无语义错误,为代码生成阶段收集信息。
4.中间代码生成(非必需阶段):
编译程序将源程序变成一个内部表示形式。
5.代码优化 (非必需阶段):
对中间代码进行优化,提高目标程序的时间和空间质量。
6.目标代码生成:
将中间代码或经过优化处理的中间代码变换成低级语言代码。目标代码的形式可以是绝对及其指令代码、可重定位的机器指令代码或者汇编指令代码。
1.2.4编译程序的逻辑结构

通常情况下会把编译过程分为前端和后端,划分的依据是看编译程序是否与硬件有关。
前端依赖源语言而与目标机器的硬件无关,后端指那些依赖目标机器而一般不依赖源语言的部分。
符号表管理:符号表管理在编译程序中具有十分重要的意义,是不可或缺的一部分,用来登记源程序中出现的各类标识符及其语义属性。(编译程序大部分时间都化在符号表管理上)
出错处理:对源程序中的错误进行处理,尽可能让源程序运行下去并且能给用户一份详细的出错清单,方便用户调试程序。
1.2.5遍的概念
遍就是对源程序或源程序的中间结果从头到尾扫描一次,并做有关的加工处理,生成新的中间结果或目标程序。
多遍扫描特点:编译程序结构清晰,目标代码质量较高,但是编译速度较慢。
一遍扫描特点:编译程序结构复杂,需要占用较大空间,能提高编译速度。