文章目录
目录
一、程序的编译环境和执行环境
存在两种不同的环境:
一、翻译环境,在这个环境中源代码被转换为可执行的机器指令。
二、执行环境,它用于实际执行代码。
先把源代码改成机器可以看懂的程序(翻译环境),然后机器执行(执行环境)。
翻译环境被我们拆解成编译和链接的两个过程。看图的话,会比较清晰。
我们编译用的工具是编译器,链接用的工具是链接器。当我们以后写代码越写写越长,越写越复杂的时候,就会有很多个源文件,那时候,我们内部是怎么编译,链接的呢?
组成一个程序的每一个源文件通过编译过程分别转换成目标代码。每一个目标文件由链接器捆绑在一起,形成一个单一而完整的可执行程序。
链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数也链接到程序中。
二、翻译环境
1、预编译过程:
用Visual Studio Code软件:
gcc -E test.c
-o test.i
预编译过程实现:
1.头文件的包含#include
2.注释的删除
3.#define符号的替换
……
预编译过程进行的是文本操作。
2.编译
把C语言代码转换成了汇编代码,生成test.s文件。
gcc -S test.i
C语言编译具体实现内容:
1.语法分析
2.词法分析
3.语义分析
4.符号汇总
3.汇编
把汇编指令转换为二进制指令,生成test.o目标文件。
gcc -c test.s
C语言汇编具体实现内容:形成符号表
4.链接
C语言链接具体实现内容:
1.合并段表
2.符号表的合并和重定位
三、执行环境
程序执行的过程:
1.程序必须载入内存中。在有操作系统的环境中:一般这个由操作系统完成。在独立的环境中,程序的载入必须把由手工安排,也可能是通过可执行带啊置入只读内存来完成。
2.程序的执行便开始,接着调用main函数。
3.开始执行程序代码。这个时候程序将使用一个运行时堆栈(函数栈帧),存储函数的局部变量和返回地址。程序同时也可以使用静态内存,存储在静态内存中的变量在程序的整个执行过程中一直保留他们的值。
4.终止程序(也有可能是意外终止)。
四、总结
以上,我们比较笼统地介绍了我们程序编译和链接的过程。