目录
C语言标准中的环境
1.两种不同环境
在C语言标准中,存在着两种不同的环境,分别是:
编译环境 | 将源代码转换成可执行的机器指令 |
执行环境 | 执行代码,生成结果 |
ps:以上的图解都是大致过程,不可深究全过程
- 组成一个程序的每个源文件通过编译过程分别转换成目标代码(object code)。
- 每个目标文件由链接器(linker)捆绑在一起,形成一个单一而完整的可执行程序。
- 链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数也链接到程序中
2. 编译环境阶段的详细内容
因为vs2022集成度太高,不易察觉文件整个执行过程,所以我们在linux系统下进行学习。
前提:已存在test.c文件,内容如下
a.预编译(预处理)
想要在预编译这步停下来,需要用到这条指令
gcc -E test.c -o test.i
可以看到生成了 test.i 文件
我们来查看一下里面的内容
查看指令
cat test.i 或者 less test.i 或者 more test.i
总结:
预编译过程中的实现
- 头文件的引用
- 注释的删除
- #define 的替换
b.编译
想要在编译这步停下来,需要用到这条指令
gcc -S test.c
可以看到,又生成一个文件 test.s
继续,让我们来查看一下里面的内容
可以看到非常多的字符串(下面还有,只是没截下来),而这些字符串就是其实是一条条汇编指令。是的,我们可以总结:
编译过程中的实现
- 将源程序转换成汇编语言
其中转换的细节有很多,如语法分析,词法分析,语义分析,符号汇总,……,这里就不继续深究了,属于汇编原理的知识。
c.汇编
想要在汇编这步停下来,需要用到这条指令
gcc -c test.s
又可以看到,又生成了文件 test.o (二进制文件,其实这个就是上面提及到的.obj目标文件)
我们继续打开看看,发现是一群乱码
也确实是这样,解码方式不一样,二进制文件读出来就是乱码。(如果要阅读可以借助readelf -s test.o)
由此我们可以总结出来:
汇编过程中的实现:
- 将汇编指令转换成二进制编码
其中还有别实现,比如形成符号表……(就不细讲了,因为我也不太会了,〒▽〒)
d.链接
链接就是最后一步了,我们可以用下面这条指令来执行
gcc test.o -o test
这里提一下,-o test 是将gcc test.o执行完的文件命名为 test,如果没有就默认命名为a.out
这是执行后的结果
我们可以知道,执行完指令生成了可执行文件test,这就是编译环境的最终版了。
链接过程中的实现:
- 合并段表
- 符号表的合并和重定位
这里也不深究了,因为博主也不会(ಥ﹏ಥ),等我学会了,我再写一篇博客吧。
最后,推荐一本书籍《程序员的自我修养》,修炼内功的秘典。