我们在写完一段代码之后,就编译,执行,那我们有没有想过,编译器是怎么让我们写的代码变成可执行程序的呢?
1.预编译
首先编译器会先将我们的代码进行预编译,那这一步到底在干什么呢?
编译器会把我们的注释全部给删掉,毕竟注释是给人看的,编译器又看不懂
还要把#define定义的那些符号,全部给你改掉,包括宏定义的符号,也会在这一步全部都替换掉
然后编译器还会把我们#include包含的头文件全部都加进去,然后预编译相当于是告一段落
2.编译
在进行完准备工作之后,编译器会进行编译,编译会干什么呢?
其实主要的功能是把C语言翻译成汇编代码
1.语法分析
2.词法分析
3.语义分析
4.符号汇总
这里前三个比较深入,就不在这讲了,我们就提一下第四点符号汇总
符号并不是我们所理解的那些+-*/等等,而是我们写的函数名,叫做符号,这一步我们会把所以这种符号全都给一个没用的地址,然后留着给第汇编用
3.汇编
这一步的主要功能是把汇编代码给他变成二进制语言(机器语言)
这一步会形成符号表,符号表就会引用到上一步的符号汇总
找到汇总的符号,并且给那些符号分配有用的地址然后就会形成一个符号表,大概类似这样
汇编结束之后,会进行链接,也就是把我们在不同文件中的代码给他连接起来运行
4.链接
这一步会进行链接,把我们在不同文件中的代码给他连接起来运行
1.合并段表
2.符号表的和合并和重新定位
合并段表就不讲了,主要是符号表的合并和重新定位,还记得我们在C语言中有个错误叫做****未定义吗,这个错误就是在链接的时候找到的,这一步编译器会根据汇编得到的符号表中的地址去寻找相关的函数,然后如果找到了就开辟对应的栈帧用来执行函数语句,如果没找到,就会报未定义的错误了
如果想了解更多这方面相关的知识,建议去阅读一本书《程序员的自我修养》
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)