1.为什么需要编译器
-
PC只能识别二进制 0, 1。
-
程序员为了提高编程效率,发明了高级的编程语言。
-
借助编译器等工具,把高级语言转译为机器可以识别的语言,最后运行在PC上。
2.编译器是如何工作的
今天我们开始介绍编译器的工作过程。
先看一段用C语言实现加法计算 1+ 1 =2的代码:
#include <stdio.h> //头文件
#include <stdlib.h>
int main( void ){
int a;
a = 1 + 1; //1+1的计算
printf( "a=%d\n", a ); //输出结果
return 0;
}
对于上面代码最终需要经过几个工序处理后,才能变成二进制(目标代码)供PC识别。
本文着重介绍编译的过程。 也就是如何利用编译器生成汇编代码的过程。
以下方的一行代码举例,探讨编译器需要完成的工作。
a = 1 + 1;
(1)编译器需要识别出哪个是变量(如代码中的a), 哪个是操作数(如1),是什么操作符(如 =,赋值操作; +,加法操作)以及结束符(;),而且要去除代码中的空格。
(2)编译器需要判断这是一个加法运算表达式。
(3)生成特定机器可理解的二进制代码,方便机器进行加法计算。
让我们站在前人的肩膀上,以更严谨的态度重新理解编译器工作的过程。
首先,对于编译器来说,一行行的代码就是一行行的字符串。经过词法分析器的处理后,分析得出词法信息,也就是token流(相当于一个一个的单词),如下图所示
然后,通过语法分析器转换成语法树保存相应的信息,如下图所示。
接着,语义分析器根据语法树的信息理解相应的信息,借助中间代码生成器生成Intermediate representation, 又称中间代码。
(中间代码的特点是:与硬件平台无关)
最后, 中间代码被相应的目标平台汇编成汇编代码。
(PS: 从这一步开始,就是与平台相关的产物)
汇编代码经过汇编器汇编,再链接成可执行文件后,就可以被PC执行了。
下一讲,我们将详细介绍词法分析。