在读《深入理解计算机系统》时,自己模糊或者不清楚的点,内容全部来自书中,理解有误欢迎指出。
#include <stdio.h>
int main()
{
printf("hello,world\n");
return 0;
}
以上是我们一个最简单的 hello.c , 然而为了在系统上运行 hello.c 程序,每条 C 语句都必须被其他程序转化为一系列的低级机器语言指令。然后这些指令按照一种称为可执行目标程序的格式打好包,并以二进制磁盘文件的形式存放起来。目标也称为可执行目标文件。
这个翻译过程可以分为四个阶段,预处理,编译,汇编,链接 四个阶段,也就构成了编译系统。
预处理阶段: 预处理器(cpp)根据字符 # 开头的命令,修改原始的 C 程序,得到另一个 C 程序,通常是 .i 为文件扩展名。
编译阶段:编译器将 .i 文件翻译成 .s 的文本文件。可以理解为翻译成低级机器语言,让其成各种高级语言可以通用的输出语言。
汇编阶段:汇编器将 .s 翻译成机器语言指令,把这些指令打包成一种叫可重定位目标程序的格式,并将结果保存在目标文件 .o 中。
链接阶段:链接器将各种预编译的好的目标文件合并起来(例如上述执行 printf 函数就存在于一个名为 printf.o 的单独预编译好的目标文件中),得到一个可执行目标文件,可以被加载到内存中,由系统执行。
单单想预处理阶段(当然其他三个阶段理解还不够咯,哈哈),对于我们 iOS 平常开发来说,此处一下子就可以到联想之前我们 iOS 中 的 pch 文件,以及预处理语言对源文件进行转换时的处理。
- 头文件引用
#import <>
- 条件编译
#if
#endif
- 宏
#define ...
- pragma
#pragma mark -
此处也可以再次回顾,为什么要少用宏的原因啦!
总之,了解编译系统是如何工作是大有益处的,慢慢挖掘吧!