计算机科学基础
计算机械
我们已经学习了一些计算的基本原理,并见证了基于这些原理运行的强大技术所展现的计算能力。在最初的学习中,我们设想,如果能够构建一个能够执行一些简单任务的简单设备,那么计算可以通过符号操作纯粹机械地完成。在本课中,我们将研究计算机发展的历史以及所有现代计算机硬件运行的原理。从物理层面来看,计算机不过是一个遵循简单规则操作两个符号的简单设备。
计算机硬件
能够自动执行计算的计算机硬件已经存在了很长时间。从早期计算机到我们今天使用的现代计算机,它们经历了一段简短但迅速发展的历史。
机械计算机
查尔斯·巴贝奇(Charles Babbage)在19世纪早期发明了可编程计算机的概念,并设计了第一台机械计算机。他的差分机(Difference Engine)和分析机(Analytical Engine)是用于计算多项式函数的机械设备。这些机器使用穿孔卡片输入程序和数据,输出结果可以记录在卡片上,也可以直接传送到打印机、曲线绘图仪或铃声装置上。机器采用普通的十进制定点运算。巴贝奇的计算机设计是第一个图灵完备(Turing-complete)的通用计算机设计。
模拟计算机
20世纪初期,机械模拟计算机被设计出来以执行越来越复杂的计算任务,例如通过积分求解微分方程。模拟计算机利用物理现象(如电、机械或液压量)中可以连续变化的特性来建模或量化计算,但其精度不如现代数字计算机。
数字计算机
世界上第一台全自动数字计算机是由康拉德·楚泽(Konrad Zuse)于1941年发明的 Z3。这台机电可编程计算机使用电开关驱动机械继电器进行计算,用二进制系统代替了十进制系统,并率先使用浮点数。程序和数据存储在穿孔胶片上。数字设备与模拟设备的区别在于,数值的表示是离散的还是连续的。例如,黑白是离散值,而无数种灰色(灰度)则是连续的。
电子数字计算机
世界上第一台电子数字可编程计算机是1943年建造的“巨型机”(Colossus),它由大量电子管(真空管)构成,完全采用电子设计,用于破解德国的“恩尼格玛”(Enigma)密码。
晶体管计算机
从1955年开始,晶体管取代真空管用于计算机设计,使计算机变得更小、更可靠、功耗更低,从而诞生了“第二代”计算机。
集成电路计算机
1952年,集成电路的发明开启了计算机械的新纪元——微型计算机时代。采用集成电路的微处理器被用来制造我们今天看到的常见计算设备:台式计算机、笔记本电脑、手机,甚至贺卡。
数字计算的原理
数字计算的数学基础是乔治·布尔(George Boole)发明的布尔逻辑。克劳德·香农(Claude Shannon)在20世纪30年代证明了电子电路可以使用布尔逻辑进行二进制计算,这成为了所有现代计算设备背后的基本原理和思想。
布尔代数
布尔代数定义了三种操作:与(AND)、或(OR)和非(NOT),操作的对象是两种值:真(true)和假(false)。三种操作的评估规则如下图所示:
- 与(AND):仅当两个输入值都为真时,输出为真,否则为假。
- 或(OR):只要有一个输入值为真,输出为真;仅当两个输入值都为假时,输出为假。
- 非(NOT):将输入值取反,真变为假,假变为真。
这些基本操作规则构成了布尔逻辑的核心,支撑着现代计算设备的运算逻辑和二进制操作。
布尔运算作用于布尔值,并始终返回一个布尔值。对于与(AND)运算,仅当两个操作数都为真时,结果才为真。而或(OR)运算则只在两个操作数都为假时结果为假。非(NOT)运算只需要一个操作数,并简单地将其取反。我们将看到,如果可以通过电子电路实现这三种运算,就可以构建能够执行各种算术和逻辑功能的电路。
这三种布尔运算可以通过晶体管实现。晶体管本质上是一个微小的开关,如下图所示。
当一个高电压(逻辑1)施加到控制引脚时,开关闭合,将输入引脚直接连接到输出引脚。晶体管以两种电压工作:高电压和低电压,这两种电压可以分别表示两种不同的逻辑值:真和假,或两种二进制值:1 和 0。我们使用高电压物理上表示逻辑1,使用低电压表示逻辑0。
晶体管与逻辑门
晶体管是简单但基本的电子电路构建模块,尽管它体积微小。举例来说,我们可以使用单个晶体管构建一个名为**非门(NOT Gate)**的设备,如下图所示。
如果我们将红框内的内容视为一个单元,它的行为就像一个反相器,在数字逻辑设计中被称为非门(NOT Gate)。如图所示,该设备的真值表显示,当输入为逻辑1时,开关闭合,输出与地线连接,输出电压被拉低,表示逻辑0。相反,当输入为逻辑0时,开关保持断开状态,输出端通过电阻连接到电源,由于没有电流流动,电阻不会导致电压下降,输出端将保持高电压,表示逻辑1。
一旦构建了这样的设备,我们可以将其作为构建更复杂电路的基本单元。我们将使用以下符号来表示非门:
利用晶体管和非门,我们可以构建一个执行与操作的器件。
如图所示,该设备精确执行了与运算(AND operation)。只有当两个输入均为逻辑1(高电压)时,输出才为逻辑1。这是因为两个开关都会闭合,将非门前的输出拖低,随后非门将输出取反为高电压,即逻辑1。
同样,我们可以构建用于执行或运算(OR operation)的设备。
如图所示,这种并联结构确保了只要有一个晶体管闭合,输出就是高电压。换句话说,这种关系反映了两个输入和输出之间的或逻辑函数(OR logical function)。
从逻辑门到电路
利用三种基本逻辑门(AND、OR、NOT),我们可以构建任何组合逻辑电路。电路由输入线、通过导线连接的逻辑门以及输出线组成。一旦电路设计完成,它可以被视为一个实现特定逻辑的黑盒,将输入映射到输出。以下是标准的电路构建算法:
- 根据所需逻辑构建真值表(truth table)。
- 根据真值表构建“积之和”形式的逻辑表达式(sum-of-products form)。
- 使用逻辑门将表达式转换为电路设计。
现在,我们希望构建一个用于测试两个比特是否相等的电路。输入为两个比特,分别用高电压(逻辑1)或低电压(逻辑0)来表示。根据所需的电路逻辑,我们可以绘制以下真值表:
前两列列出了两个输入线的所有可能值组合。只有当两个输入相同时,输出才是逻辑1(真)。根据真值表,我们可以推导出以下逻辑表达式(积之和形式):
(a AND b) OR (NOT a AND NOT b)(a \text{ AND } b) \text{ OR } (\text{NOT } a \text{ AND NOT } b)
推导积之和形式
我们检查真值表中输出为逻辑1的行。我们知道,这些行中显示的输入组合应使输出变为逻辑1。我们可以用逻辑表达式表示这些行。例如,(a AND b)(a \text{ AND } b) 表示真值表的最后一行,因为当 aa 和 bb 均为逻辑1时,根据 AND 操作的定义,该表达式的值为逻辑1。同样,(NOT a AND NOT b)(\text{NOT } a \text{ AND NOT } b) 表示第一行。将这两种情况组合起来,我们可以用一个单一表达式表示所需逻辑:
(a AND b) OR (NOT a AND NOT b)(a \text{ AND } b) \text{ OR } (\text{NOT } a \text{ AND NOT } b)
如果我们将真值表中的输入代入这个表达式,它会对每种对应情况输出正确的值。
构建电路
由于我们知道如何构建实现 AND、OR 和 NOT 操作的逻辑门设备,因此我们可以构建一个用于比较两个比特是否相等的设备。这个设备可以完全机械地(盲目地)执行这种操作,因为它并不理解操作的实际含义。
构建更复杂的电路
使用相同的方法,我们可以逐步构建越来越复杂的电路。例如,我们可以构建一个设备来相加两个二进制数字:即一位加法器。构建这样的设备只是一个确定所需逻辑并使用我们已经知道如何制造的基础组件来实现的过程。
一旦我们从真值表中得到了逻辑表达式的积之和形式,构建电路就变得非常直接,因为我们只需要三种基本逻辑门和导线连接。下图展示了使用三种基本逻辑门设计的一位加法器(带进位)的电路结构。
我们可以通过连接多个1位加法器来构造多位加法器。如下图所示,将第一个位加法器的进位与第二个位加法器的进位连接起来,即可构成一个二位加法器。
计算机数据存储