
1.1 计算机的工作机制
计算机程序不同于其他程序(如毕业典礼程序),它是由计算机来执行的。计算机程序的编制(程序设计)通常要考虑到计算机解决问题的方式和特点。因此,要进行程序设计,就有必要对计算机的工作机制有一定的了解。
1.1.1 硬件结构
虽然现在计算机硬件所提供的计算能力与早期的计算机相比有了很大的提高,但是,目前大部分计算机基本上采用的还是冯·诺依曼体系结构,即存储程序式结构。冯·诺依曼计算机的硬件构成如图1-1所示。
1. 中央处理器
中央处理器(简称CPU)是计算机的核心部件,它用于执行计算机指令,以完成计算任务。CPU由控制器、运算器以及寄存器等构成。控制器负责从内存中取指令并根据指令发出控制信号以引起其他部件的动作。运算器执行运算指令所规定的运算。寄存器主要用于记录下一条指令的内存地址、当前指令的执行状态以及暂时保存指令的计算结果,其作用主要是减少访问内存的次数,提高指令的执行效率。

图1-1 典型的计算机硬件组成
2. 内存储器
内存储器(简称内存)用于存储计算机程序。内存由许多存储单元构成,存储单元的大小视计算机的规格而定。对于微型计算机而言,内存存储单元的大小一般为一个字节,每个存储单元都有一个地址,对存储单元的访问是通过其地址来进行的。与CPU内的寄存器相比,内存容量要大得多,但访问内存单元所花费的时间要比访问寄存器多得多。
3. 外部设备
外部设备(简称外设)提供了计算机与外界的接口,主要用于计算机的输入/输出以及为计算机提供大容量的信息存储。外设包括输入设备、输出设备以及外存储器(简称为外存)。键盘和鼠标等属于输入设备,显示器和打印机等属于输出设备。
外存是大容量的低速存储部件(与内存相比),用于永久性地存储程序、数据以及各种文档等信息。外存包括硬盘、光盘、磁带等。存储在外存中的信息通常以文件形式进行组织和访问。外存与内存除了在容量和速度上不同外,它们的另一个区别在于:内存中存储的是正在运行的程序和正在使用的数据,而外存中存储的则是大量的、并非正在使用的程序和数据。
冯·诺依曼计算机的工作模型是:待执行的程序从外存装入到内存中,CPU从内存中逐条地取出程序中的指令执行;程序执行中所需要的数据从内存或外设中获得,程序执行中产生的中间结果保存在内存中,程序的执行结果通过外设输出。上述计算过程的本质是通过不断地改变程序的状态来实现计算,程序的状态由内存单元的数据构成,状态的转换由指令来实现。
CPU所能执行的指令如下。
(1)算术指令。实现加、减、乘、除等运算。
(2)比较指令。比较两个操作数的大小。
(3)数据传输指令。实现CPU的寄存器、内存以及外设之间的数据传输。
(4)执行流程控制指令。用于确定下一条指令的内存地址,包括转移、循环以及子程序调用/返回等指令。通常情况下,CPU从某个内存地址开始依次读取指令来执行,执行流程控制指令可以用来改变程序顺序执行的行为。
由于构成计算机的各个部件存在速度上的差别,快速部件往往要花费大量的时间等待慢速部件的操作,因此,在冯·诺依曼计算机中存在着几个影响程序执行效率的瓶颈,它主要体现在CPU与内存之间以及内存与输入/输出设备之间的数据传输。现在的计算机中往往利用程序执行和对数据访问所具有的局部性特征,通过缓存机制来解决部件之间速度不匹配问题,从而提高计算机的整体性能。缓存中存储的是近期用过的、今后可能还要用到的一些内容。例如,目前的计算机大都在CPU中为内存提供高速缓存,在内存中为外存提供高速缓存。
1.1.2 软件系统
计算机硬件只是提供了执行存储在内存中指令的能力,而执行的指令是需要人来提供的。也就是说,计算机硬件为计算机提供了物质基础,但它必须通过计算机软件来发挥作用。计算机软件是计算机系统中的程序以及相关文档。程序是对计算任务的处理对象(数据)与处理规则(算法)的描述;文档是为了便于人理解程序所需要的资料说明,供程序开发与维护使用。
软件系统可以分为系统软件、支撑软件和应用软件。系统软件居于计算机系统中最靠近硬件的一级,它与具体的应用领域无关,其他软件一般要通过系统软件发挥作用,如操作系统就属于系统软件。支撑软件是指支持软件开发与维护的软件,一般供开发人员使用,如软件开发环境就是典型的支撑软件。应用软件是指用于特定领域的专用软件,如学生管理软件等。计算机软件的分类如图1-2所示。

图1-2 计算机软件分类
一个软件从无到有,一直到最后的消亡,通常要经历一个过程,这个过程称为软件的生存周期。软件生存周期分成若干个阶段:软件需求分析、软件设计、编程实现、测试及运行与维护。软件需求分析的主要任务是明确待实现的软件要解决什么问题,即做什么,给出软件的需求说明。软件设计是根据软件的需求说明给出抽象的解决方案(设计说明),它包括概要设计和详细设计。概要设计是指软件的整体结构设计,详细设计是指抽象的数据结构和算法描述。编程实现是指根据软件设计说明,采用某种程序设计语言编写程序。测试是对编好的程序进行测试,确认其是否满足所规定的需求。运行与维护是指使用软件并在使用过程中发现和改正程序中的错误。值得一提的是,在维护工作上的投入往往要占整个软件生存周期的很大一部分,这是因为只要软件在使用,就需要对它进行维护。
早期的软件开发工作主要花费在编程实现阶段,并且采用的是个体的小作坊开发模式。随着计算机应用领域的不断扩大和应用层次的不断加深,使得软件的规模不断扩大、软件的复杂度不断提高,早期的软件开发模式难以驾驭软件开发过程,程序的正确性难以保证,软件生成率急剧下降,出现“软件危机”。为了解决软件危机问题,软件工程概念应运而生,其主要思想是采用工程方法来开发软件。在软件工程中,软件开发工作的中心从实现阶段转移到软件需求分析、设计和维护阶段,并且强调对软件开发过程的管理和加强各个阶段的文档制作。方法和工具构成了软件工程的两大支柱,它们贯穿于软件开发过程,对软件工程思想提供具体的支持。