程序的零点:CPU到底是什么

Coding这么多年,还记得初次接触计算机的情形吗?写了几万行代码,为啥水平提升越来越缓慢?想写个源程序,是否感觉非常不给力?难倒你也在为这些问题苦恼?
高手说,你不熟悉程序运行的根本机制。
不信,你想想程序运行的流程。

你再想想CPU是什么。

清楚吗?我们来怀旧一下CPU。
CPU的内部由寄存器、控制器、运算器和时钟四个部分构成,各部分之间由电流信号相互连通。寄存器可用来暂存指令、数据等处理对象,可以将其看作是内存的一种。根据种类的不同,一个CPU内部会有20~100个寄存器。控制器负责把内存上的指令、数据等读入寄存器,并根据指令的执行结果来控制整个计算机。运算器负责运算从内存读入寄存器的数据。时钟负责发出CPU开始计时的时钟信号。不过,也有些计算机的时钟位于CPU的外部。
通常所说的内存指的是计算机的主存储器(main memory),简称主存。主存通过控制芯片等与CPU相连,主要负责存储指令和数据。主存由可读写的元素构成,每个字节(1字节 = 8位 )都带有一个地址编号。CPU可以通过该地址读取主存中的指令和数据,当然也可以写入数据。但有一点需要注意,主存中存储的指令和数据会随着计算机的关机而自动清除。
程序启动后,根据时钟信号,控制器会从内存中读取指令和数据。通过对这些指令加以解释和运行,运算器就会对数据进行运算,控制器根据该运算结果来控制计算机。看到“控制”一词时,大家可能会将事情想象得过于复杂,其实所谓的控制就是指数据运算以外的处理(主要是数据输入输出的时机控制)。比如内存和磁盘等媒介的输入输出、键盘和鼠标的输入、显示器和打印机的输出等,这些都是控制的内容。
高手说,CPU是寄存器的集合体。
CPU的四个构成部分中,程序员只需要了解寄存器即可,其余三个都不用太过关注。那么,为什么必须要了解寄存器呢?因为程序是把寄存器作为对象来描述的。
不同类型的CPU,其内部寄存器的数量、种类以及寄存器存储的数值范围都是不同的。不过,根据功能的不同,可以将寄存器大致划分为八类。

从表中可以看出,寄存器中存储的内容既可以是指令也可以是数据。其中,数据分为“用于运算的数值”和“表示内存地址的数值”两种。数据种类不同,存储该数值的寄存器也不同。CPU中每个寄存器的功能都是不同的。用于运算的数值放在累加寄存器中存储,表示内存地址的数值则放在基址寄存器和变址寄存器中存储。
对程序员来说,CPU就是具有各种功能的寄存器的集合体。其中,程序计数器、累加寄存器、标志寄存器、指令寄存器和栈寄存器都只有一个,其他的寄存器一般有多个。

怀旧半天,让我们来看几个简单的问题,抗住。
1. 程序是什么?
2. 程序是由什么组成的?
3. 什么是机器语言?
4. 正在运行的程序存储在什么位置?
5. 什么是内存地址?
6. 计算机的构成元件中,负责程序的解释和运行的是哪个?
哈哈,下面是答案。
1. 指示计算机每一步动作的一组指令。
一般所说的程序,譬如运动会、音乐会的程序等,指的是“行事的先后次序”。计算机程序也是一样的道理。
2. 程序是指令和数据的组合体。
例如,C语言“printf ("你好");”这个简单的程序中,printf是指令,"你好"是数据。
3. CPU可以直接识别并使用的语言。
CPU能够直接识别和执行的只有机器语言。使用C、Java等语言编写的程序,最后都会转化成机器语言。
4. 内存
硬盘和磁盘等媒介上保存的程序被复制到内存后才能运行。
5. 内存中保存命令和数据的场所,通过地址来标记和指定。地址由整数值表示。
6. CPU
计算机的构成元件中,根据程序的指令来进行数据运算,并控制整个计算机的设备称作CPU。大家熟知的奔腾(Pentium)就是CPU的一种。
相关图书推荐

日文版重印41次!
“计算机组成原理”图解趣味版
蹲马桶就能看懂的编程基础知识
《程序是怎样跑起来的》从计算机的内部结构开始讲起,以图配文的形式详细讲解了二进制、内存、数据压缩、源文件和可执行文件、操作系统和应用程序的关系、汇编语言、硬件控制方法等内容,目的是让读者了解从用户双击程序图标到程序开始运行之间到底发生了什么。

