1——背景知识
什么是计算机
C语言首先是一个计算机编程语言,在谈到它之前那么就必须知道什么叫做计算机。计算机从广泛的含义来说,并单单指的我们平日常用的微型计算机PC,计算机这个概念相当的广泛,凡是可以对数据进行一定的处理计算的机器,我们都可以称之为计算机,在历史上,就曾经出现过很多机械式计算机,这种计算机利用机械结构去实现数据的计算功能,比如如Figure1所示的差分机(数学分析机器),这种计算机的形式与我们平日接触的计算机大大不同,但是其本质却是一样的,那就是计算。
Figure 1
既然一台计算机的核心是计算,那么其内部就必须要有一个单元能够实现计算的功能,这个单元我们称之为运算器,这种运算器在机械式计算机中由机械结构实现,而在现代,则由微电子元器件实现。
运算器里面包含有ALU(ArithmeticLogic Unit,运算逻辑单元)和ACC(ACCumulator, 累加器)等部件,可以进行逻辑运算和普通的算术运算等。其基本框图如Figure2,一组未经过处理的数据经过运算器就得出处理过后的数据。
Figure 2
在这里举个例子,比如在一个过程中,我需要实现1+2这个运算操作,而这个运算器中通过硬件的方式[1]现了ADD(a,b)这个运算,这个命令表示把输入的数a和b相加起来[2],如果这个运算器中由实现了MUL(a,b)乘法运算,那么就可以将输入的数a和b相乘起来了。这样就构成了计算机的核心器件之一运算器。
有了运算器我们可以进行计算功能了,但是仅仅是计算是远远不够的,因为计算出来的数值需要保存在一个存储器里面或者进行再一次的其他类型的计算,这才符合正常的需求,因此我们还需要设计出一个储存单元来存放这些中间数据,这个储存单元我们就取名为寄存器(Register)好了。就像它的名字“寄存”所表示的,寄存器的主要作用就是存放运算器计算得到的临时数据用于接下来的一些运算或者程序使用。
这里我们再举个例子,假如我这里有个需求,要计算(1+2)*3的结果,我该怎么做呢?运算器首先会先计算出ADD(1,2)的结果3,然后需要乘上3,这个时候你发现问题了吗?执行乘上3的时候,我该从哪里取出1+2的结果来呢?答案就是相应的寄存器!相应的运算过程如Figure3所示。
实现上述的过程操作在人类眼中是很简单的,但是在机器看起来就很复杂了,因此需要设计一个控制器去协调这一系列过程,同时控制器还要将需要运行的指令从内存(memory)中搬运到寄存器中,以便于下一步执行。为什么指令要放在内存而不是寄存器中呢?因为寄存器属于SRAM(Static Random Access Memory, 静态随机储存器)是由晶体管组合而成的,其集成度较低而且成本较高,内存属于DRAM(Dynamic Random Access Memory,动态随机储存器),其中包含了大量的小电容,其成本较低,但是其速度较慢而且需要频繁刷新数据,否则数据将会丢失。
这里就要做个对比,虽然说寄存器的读取速度是最快的,但是要达到和内存相应的大小成本惊人,因此我们做个折中,不如设计一些寄存器做和CPU的转存单元,负责从内存中搬运需要的数据,而不是直接CPU从速度很慢(比起CPU来说)的内存中搬运,这是一种追求更高性价比的划算的设计方式,实践证明,这样构建的计算机系统的存储器的成本接近于最底层的便宜设备而性能接近于速度快的寄存器。框架如Figure4所示。
这个便是现代一般计算机系统的储存器设计方式。
如上图,我们看到了除了储存器,运算器和控制器之外,还存在输入设备和输出设备,我们统称为I/O(Input Output)设备。一个计算机如果只是会运算而不能被人们所操控,不能和人们交互那肯定是不实用的,因此这个时候我们就需要加上一些输入设备,比如键盘鼠标以便于输入指令和数据,也需要一些输出设备,以便于输出运算结果。
这样,我们就简单地介绍了现代的计算机系统,这个介绍将会有利于我们以后对C语言的学习和理解。