C语言,简述编译运行一段代码的过程

  • 源程序(.c文件):未编译的,按照一定程序设计语言规范书写的,也就是写好的代码。
  • 可执行程序(.exe文件):可以根据代码设计实现对应功能的程序。

事实上,源程序到可执行程序的过程,经历了预处理,编译,汇编,链接这四个过程。接下来以Linux平台下的gcc编译器来解释这四个过程。

预处理

使用 -E 指令,可以使源程序执行到预编译指令。经过预编译后,我们可以得到一个 .i 后缀的文件。

gcc hello.c -E > hello.i

预编译的执行过程,主要处理源代码中的预处理指令,如引入头文件,去除注释,处理所有条件编译指令(#ifdef, #ifndef, #else, #elif, #endif…),宏的替换,添加行号,保留所有的编译器指令。预编译之后的文件,即 .i 后缀的文件不再存在宏,所有的宏已经被替代。

Tip:当我们想要判断源程序的宏是否正确或者头文件包含是否正确时,可以对源程序使用 -E指令 来检测能否正常获取 .i后缀的文件。

编译

使用 -S 指令 ,可以使预处理得到的 .i 后缀文件执行到编译过程。编译过程实际上就是对 .i 后缀的文件进行语法、词法、语义分析,符号汇总,最后生成汇编代码

gcc hello.i -S > hello.s

汇编

使用 -O 指令,将汇编代码转换成二进制文件,二进制文件使可以让机器直接读取的文件。

gcc hello.s > hello.o

链接

由汇编生产的二进制文件并不能立即执行,因为某个源程序中的函数可能会引用另一个源程序中定义的变量或函数调用。面对这些问题,需要经过链接程序进行处理。链接程序的主要工作就是将有关系的目标文件连接起来,使得所有的这些目标文件都能够被操作系统装入执行。

链接分为静态链接和动态链接,其中又涉及到静态链接库和动态链接库的知识。

静态链接的执行程序能够在其他同类操作系统的机器上直接运行,静态链接会将源程序调用到的所有静态链接库代码都复制到可执行文件中,所以一般情况下静态链接的可执行文件都比较大,但静态链接的可执行文件执行的效率高,并且可执行文件的“布局”也比较好。

动态链接的执行程序不能够在其他同类操作系统的机器上直接运行,除非要把该可执行文件的dll文件都一并复制过去,并且对方机器上也要有相同版本的dll文件,否则是不能保证正常运作的。动态链接调用的函数代码并没有直接复制到可执行文件中,而是在可执行文件中添加了所调用函数的重定位信息。当应用程序要执行时,操作系统会根据动态链接提供的重定位信息,到dll文件中执行相应的函数代码。总而言之,动态链接下生成的可执行文件占用内存较小,编译效率高,但执行效率和文件“布局”都会比静态链接差一些。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王鸽子

你的鼓励都是我前进的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值