一、什么是编译程序
一个编译程序就是一个语言翻译程序。语言翻译程序把一种语言(称作源语言)书写的程序翻译成另一种语言(称作目标程序)的等价程序。
高级语言程序 ------> 编译程序 -------> 低级语言程序(目标程序)
高级语言程序的处理过程
需预处理的源程序-------->预处理程序(文件合并、文件包含、宏处理、条件编译)----->编译程序---->目标汇编代码-->汇编程序-->可再装配的机器代码
------>可在装配的目标文件(装配/链接-编译程序)--->绝对的机器代码
二、编译过程和编译程序的结构
编译过程可划分为 词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成 六个阶段。
1.词法分析
词法分析是编译过程的第一个阶段。这个阶段的任务是从左到右一个字符一个字符的读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个
单词(也称单词符号或符号)。这里所谓的单词是指逻辑上紧密相连的一组字符,这些字符具有集体含义。比如标识符是由字母字符开头,后跟字母、数字字符的字符序列组成一种单词。保留字(关键字或基本字)是一种单词,此外还有算符、界符等。
源程序------>单词特别序列,把注释、换行等直接忽略
2.语法分析
语法分析是编译过程的第二个阶段,语法分析的任务是在词法分析的基础上讲单词序列分解成各类语法短语,如“”“程序”“”“语句”“”“表达式”等。一般这种语法短语,也称为语法单位,可表示成语法树。
单词序列---->语法短语(语法树)
语法分析所依据的是语言的语法规则,即描述程序结构的规则,通过语法分析确定整个输入串是否构成一个语法上正确的程序。程序的机构通常由递归规则表示的。
可用以下规则来定义表达式:
(1)任何标识符都是表达式。
(2)任何常数(整常数、实常数)是表达式。
(3)若表达式1和表达式2都是表达式,那么
表达式1 + 表达式2
表达式1 * 表达式2
(表达式1)
都是表达式1
类似的,语句也可以递归的定义,如
(1)标识符 := 表达式 是语句
(2)while(表达式) do 语句 和
if (表达式) then 语句 else 语句
都是语句。
3.语义分析
语义分析是审查源程序有无错误。为代码生成阶段收集类型信息。比如语义分析的一个工作是进行类型审查,审查每个算符是否具有语言规范允许的运算对象,当不符合语言规范时,编译程序应报告错误。
功能:类型是否匹配,数组下标有无越界,变量是否定义
4.中间代码生成
在进行了上述的语法分析和语义分析阶段的工作之后,有的编译程序将源程序变成一种内部表示形式,这种内部表示形式叫做中间语言或中间代码。所谓“中间代码生成式”是一种结构简单。含义明确的记号系统,这种记号系统可以设计为多种多样的形式,重要的设计原则分为两点:一是容易生成;而是容易将它翻译成目标代码。很多编译程序采用了一种近似“三地址指令”和“四元式”中间代码,这种四元式的形式为(运算符,运算对象1,运算对算2,结果)。
5.代码优化
在此阶段的任务是对前阶段产生的中间代码进行变换或者进行改造,目的是使生成的目标代码更为高效,即省时间和省空间、
6.目标代码生成
这一阶段的任务是把中间代码变换成特定机器上的绝对指令代码或可或可重定位的指令代码或汇编指令代码。这个阶段的工作很复杂,涉及到硬件系统功能部件的运用、机器指令的选择、各种数据类型变量的存储空间以及寄存器和后续缓存寄存器的调度等。
中间代码----->汇编代码
三、编译程序和解释程序的区别
解释程序不产生目标程序,写一句执行一句,解释程序一般是把源程序一个语句一个语句的进行语法分析,转换成一种内部表示形式,存放在源程序区。
拓展:动态语言和静态语言
静态类型语言是指在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型,某些具有类型推导能力的现代语言可能能够部分减轻这个要求. 动态类型语言是在运行时确定数据类型的语言。变量使用之前不需要类型声明,通常变量的类型是被赋值的那个值的类型。