大概了解一下我们写C的时候编译器在做什么

大概了解一下我们写C的时候编译器在做什么,第1张

我们在写完一段代码之后,就编译,执行,那我们有没有想过,编译器是怎么让我们写的代码变成可执行程序的呢?

1.预编译

首先编译器会先将我们的代码进行预编译,那这一步到底在干什么呢?

编译器会把我们的注释全部给删掉,毕竟注释是给人看的,编译器又看不懂

还要把#define定义的那些符号,全部给你改掉,包括宏定义的符号,也会在这一步全部都替换掉

然后编译器还会把我们#include包含的头文件全部都加进去,然后预编译相当于是告一段落

2.编译

在进行完准备工作之后,编译器会进行编译,编译会干什么呢?

其实主要的功能是把C语言翻译成汇编代码

1.语法分析

2.词法分析

3.语义分析

4.符号汇总

这里前三个比较深入,就不在这讲了,我们就提一下第四点符号汇总

符号并不是我们所理解的那些+-*/等等,而是我们写的函数名,叫做符号,这一步我们会把所以这种符号全都给一个没用的地址,然后留着给第汇编用

3.汇编

这一步的主要功能是把汇编代码给他变成二进制语言(机器语言)

这一步会形成符号表,符号表就会引用到上一步的符号汇总

找到汇总的符号,并且给那些符号分配有用的地址然后就会形成一个符号表,大概类似这样

汇编结束之后,会进行链接,也就是把我们在不同文件中的代码给他连接起来运行

4.链接

这一步会进行链接,把我们在不同文件中的代码给他连接起来运行

1.合并段表

2.符号表的和合并和重新定位

合并段表就不讲了,主要是符号表的合并和重新定位,还记得我们在C语言中有个错误叫做****未定义吗,这个错误就是在链接的时候找到的,这一步编译器会根据汇编得到的符号表中的地址去寻找相关的函数,然后如果找到了就开辟对应的栈帧用来执行函数语句,如果没找到,就会报未定义的错误了

如果想了解更多这方面相关的知识,建议去阅读一本书《程序员的自我修养》

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/578631.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-11
下一篇 2022-04-11

发表评论

登录后才能评论

评论列表(0条)

保存