读 CSApp 笔记(一)— 编译系统简单理解

在读《深入理解计算机系统》时,自己模糊或者不清楚的点,内容全部来自书中,理解有误欢迎指出。

#include 

int main() 
{
    printf("hello,world\n");
    return 0;
}

以上是我们一个最简单的 hello.c , 然而为了在系统上运行 hello.c 程序,每条 C 语句都必须被其他程序转化为一系列的低级机器语言指令。然后这些指令按照一种称为可执行目标程序的格式打好包,并以二进制磁盘文件的形式存放起来。目标也称为可执行目标文件。

这个翻译过程可以分为四个阶段,预处理,编译,汇编,链接 四个阶段,也就构成了编译系统。
读 CSApp 笔记(一)— 编译系统简单理解_第1张图片
编译系统
  • 预处理阶段: 预处理器(cpp)根据字符 # 开头的命令,修改原始的 C 程序,得到另一个 C 程序,通常是 .i 为文件扩展名。

  • 编译阶段:编译器将 .i 文件翻译成 .s 的文本文件。可以理解为翻译成低级机器语言,让其成各种高级语言可以通用的输出语言。

  • 汇编阶段:汇编器将 .s 翻译成机器语言指令,把这些指令打包成一种叫可重定位目标程序的格式,并将结果保存在目标文件 .o 中。

  • 链接阶段:链接器将各种预编译的好的目标文件合并起来(例如上述执行 printf 函数就存在于一个名为 printf.o 的单独预编译好的目标文件中),得到一个可执行目标文件,可以被加载到内存中,由系统执行。

单单想预处理阶段(当然其他三个阶段理解还不够咯,哈哈),对于我们 iOS 平常开发来说,此处一下子就可以到联想之前我们 iOS 中 的 pch 文件,以及预处理语言对源文件进行转换时的处理。

  • 头文件引用
#import <>
  • 条件编译
#if
#endif
#define ...
  • pragma
#pragma mark -

此处也可以再次回顾,为什么要少用宏的原因啦!

总之,了解编译系统是如何工作是大有益处的,慢慢挖掘吧!

你可能感兴趣的:(读 CSApp 笔记(一)— 编译系统简单理解)