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

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

1.预编译

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

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

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

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

2.编译

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

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

1.语法分析

2.词法分析

3.语义分析

4.符号汇总

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

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

3.汇编

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

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

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

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

4.链接

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

1.合并段表

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值