C语言应该是所有程序猿刚刚入门时所接触的语言,在刚刚开始学习实践时,程序猿们从二进制的角度用一句"Hellow world!"向这个世界问了个好。
C语言自诞生以来就屹立不倒,由此可见C语言在程序猿的世界是多么重要!作为一个大学牲C语言菜鸟,虽然使用了C语言开发了些项目,但是其真正的面貌我还是没有看清楚。所有有必要从底层重新认识认识我这个C语言朋友啦,不然哪天被这位朋友戏耍得团团转那可就真的很伤心!
但是对于这么一段简单的代码,真的了解他嘛?
C语言编译主要分为四个阶段
1、预处理
该阶段主要完成#符号后面的各项内容到源文件的替换。如:#ifdef为完成条件编译的替换;#include为在当前目录、指定目录或者默认目录搜索头文件,并将头文件拷贝到源文件中;#define为替换define的内容。
该阶段由编译器完成,产生的是预处理文件(.i)。
2、编译
C语言代码由固定的词汇按照固定的格式组织起来,简单直观,程序员容易识别和理解,但是对于CPU,C语言代码就是天书,根本不认识,CPU只认识几百个二进制形式的指令。这就需要一个工具,将C语言代码转换成CPU能够识别的二进制指令,也就是将代码加工成 .exe 程序的格式;这个工具是一个特殊的软件,叫做编译器(Compiler)。
该阶段完成语法和语义分析,然后生成中间代码,其中中间代码是汇编代码,但是机器还是不能执行。
该阶段由编译器完成,产生的是汇编文件(.s)。
3、汇编
该阶段主要完成将汇编代码翻译成机器码指令,并将这些指令打包形成可重定位的目标文件。
该阶段由汇编器完成,产生的是目标文件(.o)。
4、链接
该阶段完成文件中调用的各种函数、静态库和动态库的链接,并将他们一起打包合并形成目标。
该阶段由链接器完成,产生的是目标文件(.o)。
C语言代码经过编译以后,并没有生成最终的可执行文件(.exe 文件),而是生成了一种叫做目标文件(Object File)的中间文件(或者说临时文件)。目标文件也是二进制形式的,它和可执行文件的格式是一样的。对于 Visual C++,目标文件的后缀是.obj;对于 GCC,目标文件的后缀是.o
。
链接(Link)其实就是一个“打包”的过程,它将所有二进制形式的目标文件和系统组件组合成一个可执行文件。完成链接的过程也需要一个特殊的软件,叫做链接器(Linker)。