计算机系统是由硬件和系统软件组成,共同工作来运行应用程序,那么深入了解计算机系统的硬件和软件组件是如何工作的以及这些组件是如何影响程序的正确性和性能的对我们来说至关重要。
1.1 程序的生命周期 我们通过一次有趣的漫游历程,来使自己更深层次理解底层计算机系统以及它对应用程序的影响,逐步提升自己的能力。
文本文件:像hello.c这样只由ASCII字符构成的文件成为文本文件;所有其他文件都称为二进制文件。
一个hello.c程序:
#includeint main() { printf("hello, worldn"); return 0; }
简单来说,一个c语言程序,通过编译系统,编译为可执行文件,但如果深入理解,我们需要更深层次的去理解编译系统里面的过程。
我们用程序的创建开始,编译系统编译,系统运行,输出简单信息,终止等过程来理解生命周期。如下图:
上图四块内容分别对应着程序生命周期的四个阶段:
1.1.1预处理阶段: 预处理器(cpp)根据字符以#开的头命令,修改原始C程序。比如hello.c的第一行#
编译器(ccl)将文本文件hello.i翻译成汇编语言程序hello.s(文本文件)。它半酣一个汇编语言程序,该程序包含函数main的定义, 每条语句都以一种文本格式描述了一条低级机器语言指令。如下所示:
main
subq $8, %rsp
movl $.LCO, %edi
call puts
movl $0, %eax
addq $8, %rsp
ret
1.1.3汇编阶段:
接下来,汇编器(as)将hello.s翻译成机器语言指令并打包成可重定位目标程序(relocatable objectprogram)的格式, 将结果保存在二进制文件hello.o中。
1.1.4链接阶段:在hello.c程序中,程序调用了printf()函数,这是C编译器都提供的标准C库中的一个函数。printf()函数存在于一个名为printf.o程序中。链接器(ld)就是负责处理这两个程序之间的合并。结果得到hello文件,这是一个可执行目标文件(可执行文件),可以被加载到内存中,系统调用执行。
了解编译系统是如何工作的对我们有很大帮助,可以帮助我们优化程序性能;理解链接时出现的错误;避免安全漏洞。感兴趣的读者可以自行学习~
持续更新中...



