深入了解计算机系统——1.计算机系统初步

本文详细描述了计算机程序从源代码(如C语言的hello.c)到可执行文件的过程,包括预处理、编译、汇编和链接阶段,以及处理器如何读取和解释内存中的指令。重点介绍了源文件、文本文件和二进制文件的区别,以及C++等高级语言与机器语言的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

计算机系统

信息是什么

信息是位+上下文

  • 下面写一段程序
...(省略)
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输出它的消息然后终止

硬件组成

这一块内容太多,放到下一篇介绍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tomorrowave

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值