程序是怎样跑起来的

  在程序员的开发中,使用的语言基本都是类似C、Java、Python等高级编程语言,那么我们日常编写的代码是如何在计算机上跑起来的呢?今天,就让我们一起来捋一捋程序跑起来的过程。

一、计算机组成

​  现代计算机基本都是冯诺依曼体系,称为程序存储型计算机。主要包含了五个元素:输入(比如鼠标、键盘等)、输出(比如显示器、音响等)、存储器(比如内存、磁盘等)、运算器和控制器。其中的运算器和控制器再加上时钟和寄存器便组成了我们的CPU。
在这里插入图片描述
  CPU的作用是解释和运行程序,因此我们写的程序最终需要依靠CPU来执行。CPU中各部分的作用如下:

  • 运算器: 处理来自内存中的数据
  • 控制器: 读取内存中的指令、数据等至寄存器,并根据执行结果控制计算机的运行
  • 寄存器: 暂存数据、指令等处理对象,可看作是存储器的一种,但读写速度极快
  • 时钟: 发出时钟信号,决定了CPU的频率
二、CPU能识别的语言——机器语言

  假设我们使用C语言编写了一个程序,此时用C写的源代码存储于硬盘上。我们知道代码最终需要被CPU执行,那么现在由这么多高级编程语言,CPU又如何能一一识别它们,并顺利的执行呢?这个要从CPU的组成来看,CPU内部由成千上亿个晶体管构成,晶体管组成一个个门电路,门电路组成半加器、全加器等不同功能的模块,为了能够使用这些模块来控制计算机,便有了CPU指令集(机器语言)。但是机器语言都是数字序列,一般格式为“操作码+操作数”,不易阅读,使用起来比较困难,于是使用add、mov、cmp等英文助记符代替机器语言中的操作码,使用地址符号或标签代替操作数的地址,这也就是汇编语言。汇编的一般格式是“操作码+操作数”,这和机器语言类似。

汇编语言案例:mov ax,bx
机器语言案例:1000100111011000

三、从C源代码到机器码

  基于上面的描述,我们想让CPU执行C写的程序,就需要将C的源代码转为机器码。我们可以使用C编译器将C源代码编译为汇编代码,再使用汇编器将汇编代码编译为机器码,CPU拿到机器码后就可以执行程序中的代码了。从“C源代码->汇编代码->机器码”这个过程,可以更加细致的划分为如下步骤:
在这里插入图片描述

  1. C源代码经过C编译器编译为汇编代码
  2. 汇编代码经过汇编器编译为目标代码(一般源代码的文件有多个,每个文件生成一个对应的目标文件)
  3. 目标代码经过链接器链接静态程序库生成可执行代码(将多个目标文件链接成一个可执行文件)
  4. 装载器将可执行代码(即机器码)装载到内存中
  5. CPU从内存中读取指令和数据,开始执行程序
四、可执行代码的装载

  CPU内部有个程序计数器,记录着下一行需要执行的代码地址,每次执行完一条指令就会+1,然后执行下一条指令。这就意味着我们程序的代码是一条一条顺序的被执行,即指令需要连续的存储。然而我们的装载器将可执行文件(机器码)装载到内存中时没法保证程序一定被加载某段内存地址上,因为可能这段内存地址已经被其他程序占用了,那有什么办法可以解决这个问题呢?
在这里插入图片描述
  这里就引入虚拟内存地址和物理内存地址两个概念。我们可执行文件中使用虚拟内存地址,而实际内存中的称为物理内存地址,正因为我们的程序时连续存储,我们便可以在找到实际物理内存中一段连续的地址空间,和可执行文件中的虚拟内存地址做一个映射。这样的好处就是我们只需要关注虚拟内存地址,而不必操心我们的程序实际会被加载到哪段物理地址上,我们要做的就是维护这个虚拟和实际物理内存地址之间的映射关系。

五、CPU执行程序

  现在能被CPU识别的程序已经加载到了内存中,CPU就可以执行这个程序了。执行的过程可分为以下几个:

  1. 取指: CPU从程序计数器中拿到下一条需要执行的指令地址,根据指令地址从内存的对应位置把指令读取到指令寄存器(作用是存储指令),然后程序计数器自增1,变成下一条待执行指令的地址
  2. 译指: 解析指令寄存器中的指令,知道这条指令需要操作哪些寄存器、内存地址或数据
  3. 执行指令: 根据解析指令的结果,实际运行指令,操作对应的寄存器、内存地址,或进行各种运算
       CPU在上述三个步骤中不停的循环,我们的程序就跑起来了!
总结

  一个程序要跑起来,需要CPU和相关硬件的支持,而由于CPU的构造等原因,CPU只认识机器码,因此我们的程序最终都需要转化为机器码才能被执行。以上是最近学习的一些总结,每天进步一点点,fighting!

  • 7
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值