程序的表示、转换与链接 - week1

最近在 coursera 上发现一门不错的课程,程序的表示、转换与链接,内容是类似《深入理解计算机系统》这本书的,说来惭愧,虽然在上学时零星上过一些相关的课程,但是却没有系统地将这些内容串起来理解。本着算法工程师首先得是个工程的原则,觉得还是有必要去了解一下这块内容;而且课程内容讲得挺通俗的,值得一听。

本文的内容主要是 week1 的内容,较为宏观地介绍了如何从冯・诺依曼体系结构演进至现代计算机结构、程序执行的基本原理、微体系结构与指令集 (ISA) 等。由于课程 PPT 说得已经较为清晰了,这里大部分内容会直接截图(懒得再打字也是一个原因。。。)

冯・诺依曼结构

基本思想

冯 - 诺依曼结构主要思想是存储程序的工作方式,即让计算机完成的任何的一项工作,事先要编写成程序,然后把这个程序以及程序处理的这个数据先要送到主存,然后启动运行,运行以后,计算机就可以自动的取出一条一条指令,并且取出来进行执行,就是取出指令,执行。然后再取下条指令再执行,这样按部就班的取出指令并执行

按照上面的描述,计算机应该有如下的组成部分

Von Neumann architecture

更抽象一点的结构如下

Von Neumann architecture1

因此,冯 - 诺依曼结构主要思想是

  1. 计算机由运算器,控制器,存储器,输入设备和输出设备五个基本部件组成
  2. 各部件的基本功能是
    • 存储器不仅能存放数据,也能存放指令,形式上两者都是 0/1 序列
    • 控制器能自动取出指令来执行
    • 运算器能够进行加减乘除、与或非等运算
    • 操作人员可以通过输入设备和输出设备与主机进行通信
  3. 内部以二进制表示指令和数据。每条指令由操作码和地址码组成,操作码指出操作类型,地址码指出操作数的地址
  4. 采用 “存储程序” 的工作方式

现代计算机的模型结构和工作原理

现代计算机采用的基本就是前面提到的冯 - 诺依曼结构,更深入地看 CPU 的基本组成如下图所示,

Von Neumann architecture2

各个部件的作用如下

  • PC(program counter): 程序计数器,是一个用于存储指令在 memory 中的地址的寄存器,需要执行的指令先送到 PC,然后送到 MAR
  • MAR (memory address register):存储 memory 中某些指令或数据的地址 (跟总线相连),除了接收 PC 的指令地址,还可以接收 GPR 的数据地址
  • MDR (memory data register): 从 memory 读出的指令或数据 (跟总线相连),送给 IR 或 GPR(同理也可往里面写)
  • IR(instruction register):存储真实的指令,每条指令由 OP 和 ADDR 组成,表示指令的具体操作和要操作的对象的地址,供控制器读取
  • 标志寄存器:存储运算的结果得到的符号是什么,有没有进位 有没有溢出等等一些标志信息

因此,cpu 从内存读取指令 / 数据的流程是:PC/GPR -> MAR -> memory -> MDR ->IR/GPR(同时会有一些控制信号,即图中的红色虚线)

下面是以做菜的例子更详细描述计算机是如何工作的

cookVSprogram1
cookVSprogram2

从机器语言到高级编程语言

  • 机器语言(01 表示指令):增减指令后需要重新对纸带打孔
  • 汇编语言(符号表示指令): 增减指令不影响,需要通过汇编程序转为机器语言
  • 高级语言:与平台无关,编译程序 (生成目标文件)和解释程序(不生成目标文件)

因此,高级语言 (这里以 c 为例)需要执行如下步骤才能最终被计算机执行

compile&link1

各个步骤做的事情如下

  1. 预编译(生成 .i 文件):主要是处理 # 开头的语句,如进行宏展开、将被 include 的文件插入到对应的地方(递归执行)
  2. 编译(生成 .s 文件):将代码编译成汇编代码,包括词法分析、语法分析、语义分析和生成汇编代码的优化;虽然不同语言都可通过 gcc 来统一编译,但是 gcc 对于对于不同的语言调用了不同的编译程序(如 c 是 cc1,c++ 是 cclplus,java 是 jc1)
  3. 汇编(生成.o 文件):将汇编代码逐条转换成机器指令(有查找表)
  4. 链接(生成可执行文件):静态链接与动态链接

下面是一个简单的例子

compile&link2

上面的图中有几点值得注意

  • 汇编指令与机器指令是一一对应的
  • 任何程序最终都是通过执行若干条指令来完成
  • 指令集体系结构由计算机硬件决定

计算机的层次结构

计算机简单可分为软件和硬件两个层次,而在这两个层次内又可以做更细的划分,连接着两层的则是指令集 (ISA) 如下图所示

level

作为软件和硬件的桥梁,ISA 具体做了些啥,简单来说,ISA 规定了如何使用硬件;类似于一个协议,其细节如下图所示

ISA

计算机组成也被称为微体系结构 (Microarchitecture),微体系结构跟 ISA 的关系不是一一对应的,不同的 ISA 定义了不同的指令集,同一个 ISA 可对应于多个微体系结构

Microarchitecture v.s ISA

小结

week1 的内容比较宏观地介绍了冯・诺依曼结构的计算机系统层次结构、程序在计算机系统内运行的基本原理、高级语言如何转换为机器语言、ISA 的概念等基本内容,课程总共有 12 周,后面的课程当于是对上述的相关部分内容进行展开。

content