浅谈一个程序在计算机中的旅途

浅谈一个程序在计算机中的旅途

引言

对于一位计算机专业的学生来说,Ta的C语言课程往往会以下面这个经典的程序开始(后面我们称之为hello程序):

#include <stdio.h>

int main()
{
    printf("Hello World\n");
    return 0;
}

经过简单学习的人都知道,这段程序会在控制台打印一个字符串“Hello World”并换行。很多人都知道hello程序的作用,但却从未想过从我们在代码编辑器上写出这段程序,到执行打印出“Hello World”,hello程序在计算机中到底经历了什么?

今天,我们以不一样的视角来简单看看这段hello程序在计算机中的旅途。

一个简单hello程序的运行也需要复杂的软硬件系统逻辑,本文只是简单粗略的描述,至于更详细的解释,敬请期待!

编译系统

我们在编辑器上写出hello程序,然后点击编辑器自带的运行按钮,即可运行我们刚刚些好的hello程序。好像很简单的样子,这是因为我们使用的编辑器帮助我们在背后完成了一系列的操作,又对我们隐藏了具体细节,这种编辑器我们称之为集成开发环境(IDE,Integrated Development Environment )

hello程序从编写到运行,需要经历一套编译系统:

image-20241120195618377

hello源程序在预处理阶段会识别#include <stdio.h>这段代码,读取系统头文件stdio.h的内容并将其加在hello程序内。然后经过编译器、汇编器的处理后,链接器识别到程序中用到了printf函数,会在预提供的函数库中找到printf.o文件与hello.o链接。最后输出hello可执行目标程序,运行该可执行目标程序即可打印出Hello World

硬件结构

此时,hello可执行目标程序会被存储到磁盘,需要将其从磁盘中读取到处理器中才能执行该程序:

image-20241120202616124

  1. 总线:贯穿整个系统,在各个部件间传输数据
  2. CPU:中央处理单元,简称处理器,用于执行指令
  3. PC:程序计数器,指向处理器需要执行的指令,即记录指令地址
  4. 寄存器:为处理器运行提供快速数据存取服务
  5. ALU:运算单元,进行数学运算
  6. 主存:临时存储设备
  7. 磁盘:提供持久化存储服务
  8. 控制器/适配器:接入I/O设备

系统会从磁盘中读取hello程序到主存储器中,处理器再根据PC指定的指令地址,从主存中读取一条指令,将相应数据存在寄存器中,并通过ALU完成数据运算。当执行完一条指令后,再次读取PC指向的下一条指令并处理,直到执行完hello程序,将结果输出到显示器中。

存储结构

至此,hello程序在计算机中的旅途便简单的走完了。在过程中,我们看到hello程序从磁盘走到主存,在从主存走到寄存器,为什么不能直接一步到位呢?

这就不得不讲到,在物理硬件世界,对于不同的存储器材料,相应的成本可是天差地别!虽然磁盘的容量可能必主存大1000倍,但是主存的读取速度却可以比磁盘快1000万倍!如果要造一个足够大的主存来取代磁盘,其带来的经济成本是难以承受的。

我们虽然不能用一个大的主存来取代磁盘,但却可以用一个小的更快的存储器在两者中间提供一层缓存,也可以起到加速的作用!就如同我们在图书馆里,无法将全部的书都拿走,但却可以先将最近要读的书拿到书桌上,这样就不用每次换新书都去书架上找,再将那一本书拿到书桌上了,这样就大大提高了我们读书的效率。

常见存储结构:

image-20241120210041038

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值