编译简介

首先来看编译的定义:
编译
1、利用编译程序从源语言编写的源程序产生目标程序的过程。
2、用编译程序产生目标程序的动作。 编译就是把高级语言变成计算机可以识别的2进制语言,计算机只认识1和0,编译程序把人们熟悉的语言换成2进制的。
  编译程序把一个源程序翻译成目标程序的工作过程分为六个阶段:
 扫描 、语法分析、语义分析、源代码优化、代码生成以及目标代码优化
  主要是进行语义分析和语法分析,又称为源程序分析,分析过程中发现有语法错误,给出提示信息。

编译过程介绍

看一下一个简短的代码:
array[index] = (index + 4) * (2 + 6);

词法分析

首先源代码会被输入到扫描器,扫描器对源码进行词法分析。
词法分析一般产生以下几类记号:关键字、标识符、字面量(数字、字符串等)和特殊符号。
同时在识别记号的同时,扫描器也会完成其他工作,如将标识符放在符号表,将数字、字符串常量放在文字表等。

语法分析

语法分析器将对由扫描器产生的记号进行语法分析,从而产生语法树。
简单的说,由语法分析器产生的语法树就是以表达式为节点的树。符号和数字是其中最小的表达式

以下是个例子:

语义分析

语义分析由语义分析器来完成。语法分析仅仅是完成了对表达式的语法层面分析。但它并不了解这个语句是否真正的有意义
编译器所能分析的语义是静态语义(在编译期可以确定的语义)。
静态语义通常包括声明和类型的匹配,类型的转换

上图语法树经过语义分析将会成为以下形式:

中间语言生成

中间代码是源程序的一种内部表示,或称中间语言。
中间代码的作用是可使编译程序的结构在逻辑上更为简单明确,特别是可使目标代码的优化比较容易实现中间代码,即为中间语言程序,中间语言的复杂性介于源程序语言和机器语言之间。
中间语言有多种形式,常见的有逆波兰记号、四元式、三元式和树。

其中比较常见的就是三段地址码:

x = y op z

中间代码使得编译器可以被分为前端后端。编译器前端负责产生机器无关的中间代码,编译器后端将中间转换成目标机器代码。

目标代码的生成和优化

目标代码生成是编译的最后一个阶段。目标代码生成器把语法分析后或优化后的中间代码变换成目标代码。
目标代码有三种形式:
① 可以立即执行的机器语言代码,所有地址都重定位;
② 待装配的机器语言模块,当需要执行时,由连接装入程序把它们和某些运行程序连接起来,转换成能执行的机器语言代码;
③ 汇编语言代码,须经过汇编程序汇编后,成为可执行的机器语言代码。

代码优化是指对程序进行多种等价变换,使得从变换后的程序出发,能生成更有效的目标代码。
所谓等价,是指不改变程序的运行结果。
所谓有效,主要指目标代码运行时间较短,以及占用的存储空间较小。这种变换称为优化。

编译器后端主要包括代码生成器目标代码优化器
代码生成器将中间代码转换成目标代码。

参考文献

[1] 俞甲子 石凡 潘爱明.程序员的自我修养.电子工业出版社,2009.4.
[2] 百度百科 https://baike.baidu.com/item/%E7%BC%96%E8%AF%91