前言:
学习过此程序怎么写,了解了写程序的语法等等基础知识,现在我们可以深入学习一个程序从写到运行的整个过程究竟是怎么样的。
程序的翻译和执行
当我们用一些开发环境写代码一直到执行程序,拿VS举例:
第一步:写程序,我们写好程序之后,这些程序会被放在.c的源文件中(如果我们写的是C语言程序)。
源文件:
第二步:这些源文件也就是.c文件会被翻译成机器指令,从C语言到汇编语言,最后到二进制指令,才能被计算机识别并执行。
目标文件(二进制文件):
翻译环境:
预编译:
如下代码:
#include<stdio.h>
#define M 100
//定义M
int main()//主函数
{
int a = M;
int b = 19 + M;//加法
printf("%d", b);
return 0;
}
如果经过预编译会变成什么样子?
首先会生成一个xxx.i的一个文件。
其次这个文件中有好多代码,有的有几万行代码!
在这些代码的最后,发现是我们写的代码
但是区别是
1、#define定义的常量都被替换了。
2、我们所有的注释内容被直接清空了,被换成了空格
所有操作都是文本操作!!
编译:
C语言代码被翻译成汇编代码,之后进行:
1、词法分析
2、语法分析
3、语义分析
4、符号汇总
把C语言的每一个符号全部拆解!!!
汇编:
把汇编代码翻译成二进制指令。生成.o文件(目标文件)
操作:
生成符号表!!!!
每个源文件都会生成自己的目标文件,每个目标文件都有一定的格式的。
会按照elf这种文件形式组织的段:
链接:
链接目标文件和链接库生成可执行程序二进制程序。
操作:
1、合成段表(上述的每个段表都会合并在一起)
2、符号表的合并和重新定位(将有效的符号表合并在一起!!)