本篇文章主要涉及计算机的发展、程序的基本执行过程与计算机的层次结构

一、计算机的基本组成与基本功能

1、冯·诺依曼结构

冯·诺依曼创造了现代计算机的原型。

1.1 冯·诺依曼结构思想

冯·诺依曼结构最重要的思想是:存储程序(Stored-program)。
即:

任何计算机要完成的工作都需要先被编写成程序,然后将程序和原始数据送入主存并启动执行。 一旦程序被启动,则计算机应能在不需要操作人员干预的情况下,自动的逐条取出指令和执行指令的任务。

1.2 冯·诺依曼结构组成

image.png
上图为冯·诺依曼结构计算机的组成图示,可以看出:
计算机应由运算器、控制器、存储器、输入设备、输出设备5个基本部件组成。

运算器:进行基本算术运算、逻辑运算等 控制器:自动取出指令执行 存储器:存放数据和指令,数据和指令存放形式上没有区别,但计算机可以区分

对于存储器中存放的数据和指令,使用二进制格式进行存储。
每条指令由操作码和地址码两部分组成。操作码指出操作类型,地址码指出操作数的地址。

2、现代计算机结构

依冯·诺依曼结构的思想,逐步发展出了现代计算机的结构模型。

2.1 现代计算机结构模型

image.png

现代计算机结构中的基本部件释义: CPU:中央处理器 PC:程序计数器 MAR:存储器地址寄存器 ALU:算术逻辑单元 GPRs:通用寄存器组 IR:指令寄存器 MDR:储存器数据寄存器

可以看出计算机结构模型基本上就是冯·诺依曼结构模型的实现。
CPU相当于冯·诺依曼结构的控制器和运算器的组合。
各个部件之间通过总线实现通信。

2.2 现代计算机工作流程

那么现代计算机是如何工作的呢?我们参照厨师做菜的流程来解释一下计算机中的工作流程。

厨房:CPU 厨师:控制器 盘子:GPRs 锅灶:ALU 架子:存储器

  • 准备工作

原材料(数据)和菜谱(指令)按顺序放置在厨房外的架子(存储器)上,每个架子都有编号(存储单元地址)
菜谱包含信息:原料的地址,做法,做完放哪里
然后助手告诉厨师:从第5个架子上(起始PC=5)指定菜谱开始做

  • 开始做菜

1、从5号架子上取菜谱(根据PC取指令)
2、看菜谱(指令译码)
3、从架子上或者盘子中取原材料(取操作数)
4、洗菜、切菜、炒菜等操作(指令执行)
5、装盘或直接送桌(回写结果)
6、计算下一个菜谱所在的架子号5+1(修改PC值)
7、继续做下一道菜(执行下一条执行)
通过以上的例子,我们就能很好的理解计算机的工作流程。
还需知道的是:
程序启动前,指令和数据都存放在存储器中,形式上没有差别,都是0/1序列。
指令执行中,指令和数据被从存储器取到CPU,指令存放在IR中,数据存放在GPRs中。

二、程序开发和执行过程

1、程序开发

1.1 程序发展

人类总是会追求高效率的工作方式,程序的发展也是朝着这个目标奋进。
程序的发展史经历了以下几个阶段:

  1. 机器语言编程:直接编写0/1序列表示指令
  2. 汇编语言编程:用助记符和标号表示指令,与机器语言一一对应。但是汇编语言不能跨平台执行
  3. 高级语言编程:跨平台,可读性强

    1.2 高级语言编程

    当前我们的程序开发工作大部分都是通过高级语言编程实现的。
    高级语言程序的执行最终需要转译为机器语言程序,才能被计算机解释和执行。
    当前高级语言程序转译为机器语言程序一般都两种方式:
  • 编译方式(Complier):将高级语言源程序转换为机器级目标程序,执行时只要启动目标程序即可
  • 解释方式(Interpreter):将高级语言语句逐条翻译成机器指令并立即执行,不生成目标文件

    2、程序执行

    我们以一个c语言源程序为例,解释程序的执行过程: ```c // hello.c : 输出hello, world

    include

int main() { printf(“hello, world\n”); } `` 需要明确的一点是:计算机并不能直接执行hello.c的源程序,需要通过一系列编译生成可执行程序后才能执行。<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/1102034/1641966988030-62d63dee-fe27-4249-a28e-12cfe528618d.png#clientId=u7811b53a-6c7c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=308&id=u78f206cb&margin=%5Bobject%20Object%5D&name=image.png&originHeight=410&originWidth=1376&originalType=binary&ratio=1&rotation=0&showTitle=true&size=185849&status=done&style=shadow&taskId=u3a835fb5-63bb-4c1c-b143-8e0614dd11e&title=GCC%2BLinux%E5%B9%B3%E5%8F%B0%E5%A4%84%E7%90%86hello.c%E7%9A%84%E8%BF%87%E7%A8%8B&width=1032 "GCC+Linux平台处理hello.c的过程")<br />那么hello.c通过编译生成可执行程序后,在终端输入./hello回车时,数据是如何流动的呢?<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/1102034/1641967338572-93de26fa-1477-4b9f-8f6e-f4c5b298ea05.png#clientId=u7811b53a-6c7c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=623&id=u36014654&margin=%5Bobject%20Object%5D&name=image.png&originHeight=830&originWidth=1486&originalType=binary&ratio=1&rotation=0&showTitle=true&size=568359&status=done&style=shadow&taskId=u398c2e40-41fb-454b-b8ad-8f1e3e4cb46&title=hello%E7%A8%8B%E5%BA%8F%E7%9A%84%E6%95%B0%E6%8D%AE%E6%B5%81%E5%8A%A8%E8%BF%87%E7%A8%8B&width=1115 "hello程序的数据流动过程")<br />1、shell命令行<br />当我们在终端键入./hello时,shell程序将字符通过总线读入寄存器,然后再将寄存器中的字符放入存储器中。<br />2、加载可执行文件<br />当我们按下回车时,shell通过指令将磁盘中的hello可执行程序(指令和数据)加载到存储器中。<br />3、执行<br />处理器开始处理hello`程序中的指令,将打印结果从存储器复制到寄存器,然后将寄存器中的内容输出到输出设备上。

三、计算机系统层次结构

1、计算机系统层次结构发展过程

早期的使用机器语言编程时,计算机系统层次结构比较简单:
image.png
后来发展到汇编语言编程时,增加了操作系统和汇编程序:
image.png
发展当前高级语言编程时,抽象出了语言处理系统:
image.png

语言处理系统: 包含各种语言处理程序(编译器、汇编器、连接器)和运行时系统(库函数、调试、优化)

下图为计算机系统抽象层的转换关系:
image.png
其中ISA起到了承上启下的作用,是对硬件的抽象。
ISA:指令集体系结构,或叫指令系统。
ISA规定了如何使用硬件:

  • 可执行的指令的集合。包含指令格式,操作种类等
  • 指令可以接受的操作数的类型
  • 操作数所能存放的寄存器组的结构,包含寄存器的长度、编号、名称、用途
  • 操作数所能存放的存储空间的大小和编址方式
  • 操作数在存储空间存放时按照大端还是小端方式存放
  • 指令获取操作数的方式,即寻址方式
  • 指令执行过程的控制方式,包括程序计数器(PC)、条件码定义等

    四、总结

    计算机结构的核心思想是:存储程序。任何需要计算机完成的工作,都需要事先编写好程序,计算机能在不需要人为操作的情况下,执行指令完成工作。
    计算机的主要结构为:控制器、运算器、存储器、输入设备、输出设备,指令和数据通过总线传输,从而完成任务。
    高级编程语言在计算机中执行需要通过预处理器、编译器、汇编器、链接器等编译程序编译为二进制可执行程序或者通过解释程序解释执行。