1.前言
在我们编写C程序代码并点击运行的时候,C编译程序与计算机会对所编写的代码进行一系列的处理,最终转换成计算机能够识别并执行的机器语言,从而通过计算机的输出设备呈现给我们。运行C程序的内部逻辑可以分为编辑、编译、连接和运行四个阶段。
2.编辑
编辑是指程序员通过代码编辑器编写代码,在C语言中当然是使用C语言的语法规范进行编程,编程得到的程序称为源程序,该程序文件的后缀应当选择为.c,说明我们编写的程序是C程序文件。
3.编译
编译分为两个阶段,一是预编译,也叫预处理;二是编译,即正式编译。
预编译是指通过预编译器(预处理器)对C程序中预处理指令进行编译预处理,例如#include<stdio.h>是我们经常使用的预处理指令,在预编译阶段,预编译器会将stdio.h头文件的内容读进来,取代#include<stdio.h>一行。由预编译处理得到的程序与其余的程序组合成一个完整的、可编译的源程序,然后再由编译器对该完整的源程序进行编译。
在编译阶段,编译器首先对程序的语法进行检查,查看我们编写的代码有无语法问题,如有,则发出错误信息,在程序员修改错误之后再次编译,直到没有语法错误为止,这时通过编译的程序会转换成二进制形式的目标程序,其文件后缀为.obj。
4.连接
在编译后形成二进制的目标程序后,该程序仍然不是完整的可执行程序,虽然二进制代码已经是计算机能够识别的语言,但是该目标程序并不是完整的,还需要对其进行连接处理,这时使用的是连接编辑程序。
比如,在我们编写C程序代码的时候,有时候会包含多个源程序文件,而一次编译只能得到与一个源程序文件对应的目标文件,因此,必须把每个源程序文件所编译成的目标文件连接起来,才是我们想要的完整程序。
之所以是我们想要的完整程序,是因为从编程者的视角看,这部分程序是我们编写的能够直观看到的所有程序,但在连接完成所有目标程序之后,还需要再与函数库相连接,这才是一个完整的可供计算机执行的程序,称为可执行程序,其文件后缀为.exe。
因此,即使我们只编写了一个源程序文件,仍然需要与函数库相连接,以形成可执行程序。
5.运行
运行阶段其实就是计算机运行可执行程序,并得到运行结果的过程,这时C程序的运行就到此为止了,但我们的编程往往还没有结束,因为有时候运行的结果与我们的预期相去甚远。
如当我们想要编写一个输出“Hello World!”的程序,结果运行时候输出了“ByeBye World!\n”,这并不是我们想要的答案,因此还需要回到我们所编写的程序中去进行修改,然后再经过以上的C程序运行的四个阶段,直到得出我们理想的结果。
6.总结
运行C程序代码会经过编辑、编译、连接和运行四个阶段,并需要用到相应的如编译器、连接编辑程序等程序,但其实我们在实际的编程过程中,往往只需要编写然后点击运行就可以了,这是因为我们现在通常使用的是IDE,即集成开发环境,包括了代码编辑器、编译器、调试器、图形用户界面等,其集成了程序的编辑、编译、连接和运行等操作,所以我们前文说的四个阶段都是通过一个软件来完成的,使用起来十分方便。