美文网首页
读 CSApp 笔记(一)— 编译系统简单理解

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

作者: 天空中的球 | 来源:发表于2017-09-26 23:41 被阅读119次

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

    #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 -
    

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

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

    相关文章

      网友评论

          本文标题:读 CSApp 笔记(一)— 编译系统简单理解

          本文链接:https://www.haomeiwen.com/subject/enakqxtx.html