#include<stdio.h>
int main(){
printf("hello,world\n");
return 0;
}
翻译过程可以分为四个阶段完成,如下图所示,执行这四个阶段的程序(预处理器、编译器、汇编器和链接器)一起构成了编译系统。
-
预处理阶段。预处理器(cpp)根据以字符#开头的命令,修改原始的C程序。即读取系统头文件stdio.h的内容,并把它直接插入程序文本中,结果就得到了另一个C程序,通常是以.i作为文件拓展名。
-
编译阶段。编译器(ccl)将文本文件hello.i翻译成文本文件hello.s,它包含一个汇编语言程序。
-
汇编阶段。汇编器(as)将hello.s翻译成机器语言指令,把这些指令打包成一种叫做可重定位目标程序的格式,并将结果保存在目标文件hello.o中。hello.o文件是一个二进制文件。
-
链接阶段。hello程序调用了printf函数,他是每个C编译器都提供的标准C库中的一个函数。printf函数存在于一个名为printf.o的单独的预编译好了的目标文件中,而这个文件必须以某种方式合并到我们的hello.o程序中。连接器(ld)就负责处理这种合并,结果就得到了hello文件,再被加载到内存中,由系统执行。
- 优化程序性能。比如,一个switch语句是否总比一系列的if-else语句高效?一个函数调用的开销有多大?while循环比for循环更有效吗?
- 理解链接时出现的错误。链接器报告说他无法解析一个引用,这是什么意思?静态变量和全局变量的区别是什么?
- 避免安全漏洞。堆栈原理和缓冲区溢出错误等。