这里我用linux系统的gcc编译器演示一下一个计算机程序的编译过程。
程序的编译一般分为4个步骤:
1.预处理阶段,
2.编译阶段,
3.汇编阶段,
链接阶段。
写一个简单的c代码:
1 .预处理阶段:
预处理一般要干的事情有展开头文件,宏定义替换以及相关的预处理指令
#include<stdio.h>
#define once 1
#pragma once
#就是代表预处理指令,所有带#的一般都写在文件的最上方,就是为了预处理的正确执行和后续的代码需求。
2.编译阶段:
编译阶段狭义的理解就是把我们的高级语言(c,c++,java)代码转换成汇编指令,为了后续的汇编工作。
但是编译其实是一个很广的概念,如果你想细细去研究计算机的编译,就会发现其中包含了语法分析,词法分析,语义分析,代码优化等等,《编译原理》一书中有详细介绍。
3.汇编阶段
汇编阶段就是把我们编译过的汇编指令变成机器指令。
汇编指令就是机器指令的简单替换。
4.链接阶段
就是通过调用链接器来链接程序运行需要的目标文件,以及所依赖的其它库文件,最后生成可执行文件。
链接库分为动态链接库和静态链接库。
gcc默认使用的是动态链接库。
静态链接:链接动态库生成可执行程序,就是把库文件我们需要的代码指令放入可执行程序,存在冗余,不过优点是不依赖其他环境。
动态链接:就是在可执行程序中写入了库的符号信息表,使用的时候去调用,也不会有冗余,就是必须依赖动态库的存在。