title: CSAPP(一)–计算机系统漫游
author: Qian Jipeng
tags:
- 计算机系统
- 动态链接
- 静态链接
- 编译系统
categories: - 计算机系统
date: 2019-08-29 11:20:00
计算机系统学习
狂补知识ing…
计算机系统
计算机系统是由计算机硬件和系统软件组成的,它们共同工作来与进行应用程序。接下来,我会以hello.c为例,进行一些零散的总结。
#include <stdio.h>
int main() {
printf("Hello World!\n");
return 0;
}
信息
信息就是位+上下文,我们的hello.c文件叫源文件、源程序,实际上就是一个由值0和1组成的位序列,叫比特(bit),8个位被组织成一组,成为一个字节(byte),每个字节表示程序中的某些文本字符,现在大部分的计算机都使用ANSII标准来存储字符,每个字符都对应唯一的单字节大小的整数值,叫ANSII值。
编译系统
目前的C、C++、Pascal等都是高级语言,汇编语言也是一些汇编指令,只有最低级的机器指令(0、1序列)才能够被计算机直接“识别”,所以说,要想运行一串高级语言代码,必须要有一样东西,把这些高级语言代码转换为计算机能够直接识别的机器指令,这就是编译器的作用。
一个计算机编译系统,由四部分组成:
- 预处理器(ccp)
- 编译器(ccl)
- 汇编器(as)
- 链接器(ld)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DlLXlS0E-1570954478966)(http://px1awapyv.bkt.clouddn.com/55.png)]
相应的,一个程序的编译过程,也分为四个阶段: - 预处理阶段
预处理器会扫描源文件,定位到以"#"开头的内容,根据这个内容,修改源文件的内容,比如说前面#include <stdio.h>
,这时候,我就要找到stdio.h这个头文件,把这个头文件的内容直接插入到hello.c源文件中(至于具体在哪个位置,我们不知道)
,生成新的源文件hello.i,通常以**.i**作为文件扩展名。 - 编译阶段
编译器会将文本文件hello.i翻译成文本文件hello.s,它包含了一个汇编语言程序,。即将高级语言翻译成汇编语言。的汇编程序可以为不同的高级语言和不同的编译器提供通用的输出语言。
gcc -S hello.s hello.c
- 汇编阶段
汇编器将汇编语言翻译成机器语言指令,把这些指令打包成一种叫做可重定位目标程序的格式,将结果放在hello.o这个二进制文件中。
gcc -c hello.o hello.c
- 链接阶段
我们的hell.o调用了stdio的printf()函数,它是C语言的一个标准库函数,位于printf.o这个独立的预编译好了的目标文件中,必须要加入我们的hello.o文件中,程序才能够正常运行。链接器就是做这个工作的,将printf.o文件与hello.o文件链接,得到hello可执行目标文件,当然,也是二进制文件。这个可执行目标文件可以加载到内存中,被计算机所执行。
gcc -o hello hello.c
这样的命令会生成可执行文件hello,一般没有后缀。
了解编译系统的工作流程
带来的好处:
- 优化程序性能
比如说,switch就会比if效率高吗?while和for的效率问题,函数调用的开销到底有多大,传指针和传值到底有什么区别?
这些目前我还不清楚、或者说不太清楚,所知道的也就是从书上、网上学来的。或许学了程序的编译过程,就会明白了把。 - 理解链接时的错误
写代码时,经常会遇到链接错误,顺带提一下,动态链接和静态链接,待学习。
动态链接和静态链接
1. 动态链接
Windows: .lib文件
Linux: .a文件
函数库的一份拷贝是可执行文件的物理组成部分,称之为静态链接。静态链接当链接程序时,需要使用的每个库函数的一份拷贝被加入到可执行文件中。静态链接使用静态库进行链接,生成的程序包含程序运行所需要的全部库,可以直接运行,不过静态链接生成的程序体积较大(即使是在静态链接中,整个库文件也并没有全部装入到可执行文件中,所装入的只是需要的函数)。
2. 静态链接
Windows: .dll文件
Linux: .so文件
如果可执行文件只是包含了文件名,让载入器在运行时能够寻找程序所需要的函数库,称之为动态链接。动态链接允许系统提供一个庞大的函数库集合,可以提供许多有用的服务,程序在运行时寻找它们。动态链接使用动态链接库进行链接,生成的程序在执行的时候需要加载所需的动态库才能运行。动态链接生成的程序体积较小,但是必须依赖所需的动态库,否则无法执行。
3. 细节
gcc编译器默认使用动态编译,如果要指定静态编译,需要加上-static
参数