文章目录
- 计算机系统
- 信息是什么
- 我们来看看hello在哪
- 程序被其他程序翻译成不同的格式
- 处理器读取并解释内存中的指令
- 硬件组成
计算机系统
信息是什么
信息是位+上下文
- 下面写一段程序
...(省略)
printf("hello world");
...
hello.c
上面是一段hello程序,他首先是从一个源文件开始
- 那么什么是源文件?
源文件也就是源程序,是我们程序员通过编辑器创建并保存的文本文件,文件名是hello.c 源程序实际上是一个用0或1组成的位(比特)序列,
注意: 8位一bit,当然只是基础概念,,也就 是字节,每个字节表示程序中的某些文本字符。
我们来看看hello在哪
现在hello程序是以字节序列存储在文件中的,每个字节都有一个整数值,对于某些字符,例如,第一个字符的整数值是35,他对应的就是字符“#”。第二个字节的整数值为105,它对应的字符是“i”,依次类推,注意:每个文本行都是以一个看不见的换行符"\n"来结束的,它所对应的整数值为10.像hello这样的用ASCII码构成的文件我们叫它文本文件。,其他为二进制文件
程序被其他程序翻译成不同的格式
hello程序的生命周期是从一个高级C语言程序开始的,因为这种形式能够被人读懂,然而,为了在系统上运行hello程序,每条C语句都必须被其他程序转化成一系列的低级机器语言指令。然后这些指令按照一种称为可执行目标程序的格式打好包,并以二进制磁盘文件的形式存放起来,目标程序也就是可执行目标程序
gcc -o hello hello.c
可以看到,这就是从源文件到目标文件的转化过程,这是通过编译器驱动程序完成的,GCC编译器驱动程序读取源程序文件hello.c,并把它翻译成一个可执行目标文件hello,这个翻译过程可分为四个阶段完成,
1.预处理阶段
预处理起修改原始C程序代码,比如hello.c中的第一行的#include<stdio.h>命令告诉预处理器读取系统头文件stdio.h的内容,并把它直接插入程序文本中,结果就得到了另一个C程序,通常是以.i为文件扩展名。
2.编译阶段
编译器把hello.i翻译成文本文件hello.s,经过编译以后的就是所谓的汇编语言程序。该程序包含函数main。
如下所示:
sub $8,%rsp
move $.lCO,%edi
call puts
mov $0,%eax
add $8,%rsp
ret
文本格式表示了机器语言,汇编语言是非常有用的,因为它为不同高级语言的不同编译器提供了通用的输出,
**高级语言:python,javascript,C++**直接就可以调用库函数
3.汇编阶段
汇编阶段是把hello.s变成he ll.o这是一个二进制文件,也就是我们的机器可以识别的机器语言
4.链接阶段
printf函数存在于一个print f.o的单独预先编译好的目标文件里面,这个文件必须以某种方式合并到我们的hello.o程序中。链接器(ld)负责处理这种合并。然后文件执行
处理器读取并解释内存中的指令
hello.c源程序已经被便衣系统翻译成了可执行文件hello,并存放在磁盘上。
./hello
hello world
shell上一个命令解释,它输出一个提示符,等待输入一个命令行,然后执行这个命令。如果该命令开头不是一个内置的shell命令,那么shell就会假设这是一个可执行文件的名字,它将加载并运行这个文件。所以在此例中,shell加载并运行hello程序 ,然后等待程序终止。
hello输出它的消息然后终止
硬件组成
这一块内容太多,放到下一篇介绍