深入理解计算机系统一--c程序发生了什么

计算机系统漫游

计算机系统是由硬件和系统软件组成的,它们共同工作来运行应用程序。。虽然系统的 具体实现方式随着时间不断变化,但是系统内在的概念却没有改变。所有计算机系统都有 相似的硬件和软件组件,它们又执行着相似的功能。

第一个c程序

一般第一个程序都是输出hello world,这里我们使用c语言输出一个hello world。后面在来讲这里面都发生了什么。

#include <stdio.h>

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

最终程序都会被转成2进制代码,一般都根据ASCII码来转换,下图是上面的代码根据ASCII码转换成的二进制代码。

在这里插入图片描述

程序被翻译成不同格式

计算机最后能执行的是二进制文件,所以需要把c文件转换成二进制文件,这是经过几个步骤的转换,而不是一次性转换成的。当然了,我们使用gcc编译的时候他是一下子执行了所有步骤的。

分为4个阶段

  • hello.c 经过 预处理器(cpp) 输出 hello.i (修改了的源程序)
  • hello.i 经过 编译器(ccl) 输出 hello.s (汇编程序)
  • hello.s 经过 汇编器(as) 输出 hello.o (可重定位目标程序)
  • hello.o 和 引入的其他库的文件 经过 连接器(ld) 输出 hello.exe (可执行程序)

预处理阶段

预处理器根据以字符#开头的命令,修改原始的c程序。把你引入的文件插入到原始文件中。生成新的hello.i文件。

编译阶段

编译器把hello.i这个c程序文件编译成汇编程序文件。生成新的hello.s文件。

汇编阶段

汇编器把hello.s这个汇编程序翻译成机器语言指令,把这些指令打包成可重定位目标程序。生成新的hello.o文件,它包含的17个字节是函数main的指令编码。

链接阶段

我们的c程序调用了别的函数,调用了printf这个输出函数,这个函数是标准c库里面的函数,这个函数存在于printf.o这个预先编译好的文件里面,而我们要把这两个文件合并到一起,链接器就负责这种合并。最后得到一个可执行程序 hello.exe

猜你喜欢

转载自blog.csdn.net/Thepatterraining/article/details/108464671