最佳答案
1. 编译的不雅点
编译顺序读取源顺序(字符流),对之停止词法跟语法的分析,将高等言语指令转换为功能等效的汇编代码,再由汇编顺序转换为呆板言语,并且按照操纵体系对可履行文件格局的请求链接生成可履行顺序。
2. 编译的完全过程
C源顺序 > 预编译处理(.c) > 编译、优化顺序(.s、.asm) > 汇编顺序(.obj、.o、.a、.ko) > 链接顺序(.exe、.elf、.axf等)
2.1 编译预处理
- 读取C源顺序:预处理器(cpp)起首读取C源顺序,对其停止处理。
- 处理伪指令:伪指令重要包含以下四个方面:
- 宏定义指令:如
#define Name TokenString
,#undef
等。预编译会将顺序中的全部Name用TokenString调换,但作为字符串常量的Name则不被调换。 - 前提编译指令:如
#ifdef
,#ifndef
,#else
,#elif
,#endif
等。这些指令容许顺序员经由过程定义差其余宏来决定编译顺序对哪些代码停止处理。 - 头文件包含指令:如
#include "FileName"
或许#include <FileName>
等。头文件中一般用伪指令#define
定义了大年夜量的宏(最罕见的是字符常量),同时包含有各种外部标记的申明。
- 宏定义指令:如
- 预处理成果:预处理的成果是一个预处理源文件,其扩大名为
.i
。
2.2 编译
- 编译器:预处理后的源文件会被编译器(如gcc)编译成汇编代码。
- 转换过程:编译器将C言语的高等语句转换为呆板可能懂得的初级指令。
- 错误检查:编译器会检查语法错误跟范例检查,假如发明错误,编译过程会结束,并给犯错误提示。
- 输出文件:编译后的输出文件平日以
.s
或.asm
开头。
2.3 汇编
- 汇编器:汇编器(as)将编译器产生的汇编代码转换为呆板码,即二进制情势的目标文件。
- 输出文件:汇编过程中的输出文件平日以
.obj
或.o
开头。
2.4 链接
- 链接器:链接器(ld)将全部须要的目标文件跟库文件链接在一同,生成终极的可履行文件。
- 链接过程:链接器担任处理函数挪用跟全局变量的引用,确保顺序运转时能正确找到这些元素。
- 输出文件:链接后的输出文件平日以
.exe
或.elf
开头。
3. 运转顺序
- 加载可履行文件:当用户运转顺序时,操纵体系会将可履行文件加载到内存中。
- 履行代码:顺序在内存中运转时,会利用打算机的硬件资本,比方CPU、内存、硬盘等。
4. 总结
C言语顺序的编译过程是一个复杂的过程,涉及到多个阶段跟东西。经由过程懂得这个过程,我们可能更好地懂得C言语顺序的任务道理,并编写更高效、牢固的顺序。