2018-01-05 创建人:Ruo_Xiao
2018-01-06 修改人:Ruo_Xiao
1、添加编辑器之后,预处理之前的编译器的操作。
2、添加对优化器的简单的说明。
2018-01-12 修改人:Ruo_Xiao
修正最后的逻辑总图,添加“源代码处理”。
2018-01-20 修改人:Ruo_Xiao
增加对编译器和连接器更详细的说明。
一、概括
C源代码 -> C编辑器 -> 源代码处理 -> 预处理器 -> C编译器 ->(优化器) -> 连接器 -> 可执行文件 -> CPU执行
二、C源代码
英文:Source Code。
三、C编辑器
- 用C语言编写的程序都存储在文本文件中,该文件被称为源代码文件(Source Code Files),大多数系统都以“.c”为扩展名。
拓展:点号“.”前面的部分被称为基本名(Basename),点号后面的部分被称为扩展名(Extension),基本名和拓展名的组合被称为文件名。 - 常用的C编辑器有:
(1)windows:记事本(notepad)。(需要修改扩展名)
(2)Linux:Vi、Vim。
(3)Unix:emacs、jove、Vi、X Window System文本编辑器。 - 有的C编辑器具有自动纠错功能,例如Vim。
四、源代码处理
1、编译器把源代码中出现的字符映射到源字符集,该过程处理多字节字符和三字符序列。
2、编译器定位每个反斜杠后面跟着换行符实例,并删除它们。也就是说把下面两个物理行(physical line):
printf("Hello,my\
wife!/n");
转化为一个逻辑行(logical line)。
printf("Hello,my wife!/n");
3、编译器将文本划分成预处理记号序列、空白序列和注释序列(记号是由空格、制表符或换行符分隔的项)。这里,编译器将空白字符序列和注释序列用一个空格替换。所以下面代码
int/*我是注释!*/i = 0;
变成了
int i = 0;
五、预处理器
- 预处理器是在真正的编译开始之前由编译器调用的独立程序。
- 预处理器指令以#号开头标识,末尾不包含分号。
- 主要功能有文件包含、宏替换、条件编译等。
- 在编译的预处理阶段实现的功能:
(1)将头文件加载到代码中。
(2)对宏进行替换。等等
再根据条件编译指令,最终生成新的源代码,传给编译器。
六、C编译器
- 英文: C Compiler。
- 是将经过预处理器处理之后的C代码翻译成对应于各种CPU能够执行的可执行代码的程序。
拓展:可执行代码,用计算机的机器语言表示的代码,这种语言是由数字码表示的指令组成,即CPU的微指令。 - 编译器检查的是语法、函数与变量的声明是否正确。
- 存储编译器生成的可执行代码的文件被称为目标文件(Object file)。
拓展:目标文件
(1)扩展名:
Unix/Linux:“.o”。
Windows:“.obj”。
(2)目标文件虽然包含机器语言代码,但是不能直接运行,原因如下:
A、缺少启动代码(Startup Code),启动代码充当着程序和操作系统的之间的接口。
B、缺少库函数代码,只是包含了库函数的指令。 - 种类
(1)GNU编译器集合(GCC,其中包含GCC C 编译器),Linux和Unix下使用gcc即可调用GCC C 编译器。
(2)GCC编译器在windows上的运行的软件是Cygwin和MinGW。
(3)LLVM项目的Clang编译器,通过clang调用,应用于Linux和FreeBSD(默认)中。
(4)VC和VS。
(5)cc 是 Unix系统的 C Compiler,一个是古老的 C 编译器。
七、优化器
- 对目标代码进行进一步处理,使其效率更高。
- 只针对Release,Debug不进行处理。
八、连接器
- 将编译器生成的目标文件中的代码、系统的标准启动代码和库代码三者合并成一个文件,即可执行文件。
- 主要是链接函数和全局变量。链接器会在所有的Object File中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error)。在VC下,这种错误一般是:Link 2001错误,意思说是说,链接器未能找到函数的实现,你需要指定函数的ObjectFile。
九、可执行文件
- windows:扩展名为“.exe”。
- Unix/Linux:扩展名“.out”。
十、CPU执行
- 能让CPU执行的只要其特有的微指令集。
- 可执行文件就是由微指令集中的指令构成,故在windows下,双击exe就可以让CPU开始按照C源代码中所设想的那样工作了。