Programs Are Translated By Other Programs Into Diffrent Forms
今天的英文阅读是《深入理解计算机系统》的第一章第二节,
首先我写贴上Hello World的C程序代码:1
2
3
4
5
6
7#include<stdio.h>
int main()
{
printf("hello world\n")
return 0
}
上面是一个简单的Hello World程序,它可以很容易的被人读懂,但是机器无法读懂并执行它。
我们需要将上面的文本内容通过其他程序翻译成低级的机器语言,并打包存储为二进制文件(可执行目标程序),目标程序也被叫做可执行目标文件。
那么计算机是如何把文本格式的源代码翻译成机器可执行的文件的呢?这就要使用到编译系统了。
编译系统
编译系统由以下4部分组成:
- 预处理器
- 编译器
- 汇编器
- 链接器
编译过程
参考图:
预处理阶段:预处理器找到hello.c中的#开头的指令,引入头文件stdio.h,拼接成一个完成的文本源代码,存为hello.i的文本文件。
编译阶段:编译器把hello.i文件转换为汇编代码hello.s的文本文件。
代码如下:1
2
3
4
5
6
7main:
subq $8, %rsp
movl $.LCO, %edi
call puts
movl $0, %eax
addq $8, %rsp
ret汇编阶段:汇编器把hello.s的汇编代码源文件翻译成机器指令,打包存储成一个hello.o的可重定位目标程序。此时文件是一个二进制文件。
链接阶段:我们从hello.c的源代码中看到程序调用了printf函数,它是C语言标准库里的一个函数,它存在于一个叫做printf.o的文件中。此时我们需要把printf.o合并到hello.o中,这样就组成了一个完整的可执行程序,而这个合并的过程就是链接。
这一小节通过一个最简单的打印Hello world的C语言源代码,分析了从源代码到可执行文件的编译过程。让我对程序是如何执行的有了一个大致的了解。