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