程序源码要运行出结果,需要机器可以识别程序指令,主要进行以下四个步骤:
- 预处理, 展开头文件/宏替换/去掉注释/条件编译 (test.i main .i)
- 编译, 检查语法,生成汇编 ( test.s main .s)
- 汇编, 汇编代码转换机器码 (test.o main.o)
- 链接 链接到一起生成可执行程序 a.out
预处理包括展开头文件/宏替换/去掉注释/条件编译:
展开头文件、
处理宏 - 字符替换、
处理所有的条件编译指令,比如“#if”、
处理“#include”预编译指令、
删除所有的注释、
添加行号和文件名标识等。
- 另外这里对
#include“animal.h”
和#include <animal.h>
进行说明一下区别
.<>和“”表示编译器搜索头文件的顺序不同: <>
表示从系统目录下开始搜索,然后再搜索PATH环境变量所列出的目录,不搜索当前目录
""
表示先从当前目录搜索
,然后是系统目录和PATH环境变量所列出的目录下搜索
所以如果我们知道头文件在系统目录或者环境变量目录下时,可以用<>来加快搜索速度
编译:包含词法分析,语法分析,语义分析,和进行优化操作,生成汇编代码。
词法分析作用:找出单词 。如int a=b+c; 结果为: int,a,=,b,+,c和;
语法分析作用:找出表达式,程序段,语句等。如int a=b=c;的语法分析结果为int a=b+c这条语句。
语义分析作用:查看类型是否匹配等。
编译原理(8):代码优化_weixin_44226857的博客-CSDN博客blog.csdn.net汇编过程:
将汇编代码转换成01机器码,即.o文件。.o文件是纯二进制文件。因为.o中放的是纯二进制的机器指令。
汇编语言和机器语言是一一对应的,每一条汇编语句,基本对应一条机器指令。
汇编指令是机器指令的助记符,汇编指令是更便于记忆的一种书写格式。它较为有效地解决了机器指令编写程序难度大的问题,汇编语言与人类语言更接近,便于阅读和记忆。
机器指令: 1000100111011000
汇编指令: MOV AX, BX
上述的机器指令和汇编指令是一一对应的,它们操作的含义都是:把寄存器 BX 中的内容送到 AX 中。
链接过程:
链接是将所有的.o文件和库(动态库、静态库)链接在一起,得到可以运行的可执行文件(Windows的.exe文件或Linux的.out文件)等。
它的工作就是把一些指令对其他符号地址的引用加以修正。
链接过程主要包括了地址和空间分配、符号决议和重定向。
静态链接是链接时候将库的内容加入到目标可执行程序中的做法,将库函数和目标文件链接到一起生成一个可执行文件。
动态链接:所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些库函数的重定位信息)。执行的时候会根据重定位信息调用库函数。