第2章 编译和链接

来源:互联网 发布:数据保密性 编辑:程序博客网 时间:2024/06/05 09:03

用C语言写好Hello World程序hello.cpp,怎么才能让程序执行?通常我们都是用IDE工具点击BuiLd,即可傻瓜式执行,那里面的奥秘是什么?

其实,上述过程可以分解为4个步骤,分别是预处理、编译、汇编和链接。

先说预处理。程序里面一般会包含头文件(例#include<stdio.h>)、宏(#define ……),预处理过程主要处理那些源文件中的以“#”开始的预编译指令。主要规则如下:

l  删除所有的“#define”,将所有的宏展开。

l  处理所有的条件预编译指令,比如“#if”、“#ifdef”、“#elif”、“#else”、“#endif”。

l  处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置。

l  删除所有的注释。

l  添加行号和文件名标识。

l  保留所有的#pragma编译器指令,因为编译器需要使用它们。

再说编译。编译过程可以参考编译原理一书,分为词法分析、语法分析、语义分析、代码生成、目标代码优化。

l  词法分析:源代码被输入到扫描器,扫描器运用一种类似于有限状态机的算法,将源代码的字符序列分割成一系列的记号(关键字、标示符、字面量、特殊符号)。

l  语法分析:语法分析器将对由扫描器产生的记号进行语法分析,从而产生语法树。由语法分析器生成的语法树就是以表达式为节点的树。

l  语义分析在语法分析的基础上,判断表达式是否有意义,比如两指针相乘,语法上合法,但明显是没有意义的;经过语义分析阶段以后,整个语法树的表达式都被标识了类型。

l  中间语言生成:源码级优化器往往将整个语法树转换成中间代码。

l  目标代码生成和优化;代码生成器将中间代码转换成目标机器代码,目标代码优化器对目标代码进行优化。

汇编器是将汇编代码转变成机器可以执行的指令,根据汇编指令和机器指令的对照表一一翻译即可。

最后谈谈链接。链接的主要内容就是把各个模块之间相互引用的部分都处理好,使得各个模块之间能够正确地衔接。链接过程主要包括了地址和空间分配、符号决议和重定位。
0 0