计算机科学是一门研究信息转换过程的设计、分析、实现、效率反应用的学问。构成所有计算机科学的基本问题是“什么可以自动化?”。计算机科学伴随着存贮程序电子计算机的发明,于四十年代中期应运而生,并且自那以后发展迅速。

计算机科学深深地植根于数学、工程学和逻辑学之中。几千年来,数学主要研究计算。许多物理现象的模型被用来推导可以预测那些现象方程的解——例如,轨道弹道的计算,天气预报和流体的流动等。人们已经设计了许多解此类方程的通用方法——如,线性方程、微分方程和积分函数的算法。几乎是在同一时期内,工程学主要研究力学系统辅助设计的计算。例如,静止物体压力的计算,运动物体动量的计算,超过我们正常知觉的极长或极短距离的测量。

工程学与数学长期交互作用的一个结果是力学的辅助计算。一些勘测员与探险家的计算设备可以回溯到一千年前。在十七世纪中叶,帕斯卡(Pascal)和莱本尼兹(Leibniz)就制成了算术计算器。十九世纪三十年代,巴贝奇(Babbage)设计了一台“分析机”,它能机械而又无误地计算对数函数和三角函数及其它算术函数。虽然巴贝奇的这台“分析机”并没有完成,但激励了后人的工作。本世纪二十年代,布什(Bush)做了一台用于求解通用微分方程系统的电子模拟计算机。到二十年代末,能够计算加减乘除和平方根的机电计算器投入使用。电子触发器为从模拟计算器到数字计算器的过渡提供了很自然的桥梁。

逻辑学也是一门古老的学科,它研究推论的有效性标准及推理的形式原理。从欧几里德的时代开始,逻辑学就一直是严格的数学和科学论断的工具。在1830年,人们就发现已知的演绎系统都是不完全的,因为总可以找到悖论。这导致了对完全演绎系统的长达一个世纪的研究。所谓完全演绎系统就是在该系统内,总可以决定任一给定的语句是真还是假。W31年,哥德尔(G?del)发表了他的“不完全性定理”,证明了完全的系统是不存在的。1936年,图灵(Turing)也发现了类似的结论,即存在着不能用机械过程求解的问题。逻辑的重要性不仅仅在于它对自动计算的极限的深刻洞悉,而且在于它揭示了符号串(或者是被编码的数字),既当作数据又当作程序解释的可能性。

这是区别存贮程序计算机与计算器的关键思想。算法的步骤可以表示成二进制代码存贮在存贮器内,而后由处理机进行译码和执行。二进制代码可以根据高级的符号形式程序设计语言机械的产生。

正是计算的古典思想与逻辑符号变换的这种明确然而又是错综复杂的结合标志着计算机科学的诞生。

计算机科学在四十年代尚处于摇篮时代,而到了八十年代已逐步成长为一门内容丰富的学科。下表回顾了计算机科学的发展历程。表中所列的时间指的是新的领域从难以理解的技术转变为容易理解的核心原理的时间,当然这些时间都是近似的,仅仅代表了我的观点:即它们是何时成为绝大多数计算机科学系的必修课的。人工智能从计算机科学的早期开始就一直是一个很活跃的研究领域,但在许多大学中是最近才由选修课变为必修课的。

6.1

这十一个领域绝不是互相排斥的,每个领域都有自己的理论部分。大多数领域都有专用的程序设计语言作为表达算法和数据结构的记号。大多数实现都是在配备网络操作系统的机器上进行的。大多数领域处理的问题都有可并发执行的部分。有一些子学科,如软件工程,与以上这十一个领域的每一个都有关。

下面,我们将对这十一个领域的主要内容作一提要,并列出每个领域的基本问题和研究成果。

理论。这一领域研究计算的数学基础。基本问题如:机器可以解决什么问题?对于给定的问题类,优化算法是什么?相对于给定问题类而给定的机器类的固有的最好和最坏性能是什么?什么问题在计算复杂性上是互相等价的?主要成果如下:

1. 可计算性理论,它定义了机器能够做什么及不能做什么。其分支包括自动机和形式语言理论。

2. 复杂性理论,它研究如何测定可计算函数的时

间和空间要求,该理论用解决问题的算法的最坏和最好性能来讨论问题的规模。

3. 问题的复杂性分类,如多项式时间界限内确定可解的问题(即(P - 问题),和多项式时间界限内非确定可解的问题(NP - 问题))。

4. 自动定理证明。

数值计算。这个领域研究有效而准确地求解由系统的数学模型导出的方程的通用方法。基本问题如:如何用有限离散的过程来准确地逼近连续或无限过程?如何处理由于近似而引起的误差?对于一给定的方程类,如何能够快速求解以达到一给定的精确度?如何执行方程的符号操作,诸如积分、微分、最小项归约?怎样把这些问题的解放入一有效、可靠,高质量的数学软件包?主要成果如下:

1. 方法的稳定性理论和由于有限离散表示引起的错误传播理论——特别是,回溯误差分析。

2. 对于诸如快速富里叶(Fourier)变换,及泊阿松(Poisson)方程求解的快速算法,算法的精确性和效率的扩充估计。

3. 可由规则网格和边界值说明的一大类问题的有限元模型,相关循环方法和收敛性理论,数值积分时的自动网格求精。

4. 处理一些有关矩阵、常微分方程和统计学理论的通用问题的数学软件包;有关偏微分方程,优化和非线性方程的非通用问题的数学软件包。

5. 能够进行表达式的有效隐涵归约,微分、积分的符号操作。

体系结构。这个领域研究把许多硬件和软件组织成有效而可靠的系统的方法。基本问题如:在机器上实现处理存贮和通讯功能的最好方法是什么?我们怎样制造一个大型计算系统使得尽管会发生各种故障仍可正常工作?主要的研究成果如下:

1. 有限状态自动机理论与布尔电路代数,它们表明了硬件功能与结构的关系。

2. 单指令流存贮程序的所谓冯 · 诺意曼(Von Neumann)计算机。

3. 快速算术的硬件单元。

4. 在各种介质上,信息编码及存贮的有效方法。

5. 可靠计算理论,包括冗余部件、重构、诊断和测试。

6. 同基本部件组成大的复杂系统的方法。

7. 能够支持成百上千个同时执行的处理机的多处理机机器的模型。

8. 微电子电路技术及超大规模集成电路的计算机辅助设计。

程序设计语言和方法学。该领域研究表达算法和数据的记号,以及从高级语言到机器代码的翻译和有效地构造正确程序的方法。基本问题如:在各种类型的问题中,基本的数据类型是什么?它们如何表示?控制计算执行的基本方法是什么?如何使用语言的句法描述来构造有效的编译程序并且产生优化代码?应该借助什么方法来证明一个程序完成了所要求的功能?主要成果如下:

1. 面向过程的程序设计语言(如Cobol,Fortrom,Algol,Pascal和Ada,函数型语言,如APL,Lisp,Prolog和VAL. 目标操作语言,如Smalltalk和CLU. )

2. 程序设计语言基本概念的组合,如基本数据类型(子界,数据,记录,串)和控制结构(串行,循环,选择,子程序,递归)。

3. 编译及代码产生的理论及其在实际编译程序中的应用。

4. 验证程序的功能描述与其执行相符号。

5. 句法制导的编辑程序,它控制程序构成并且提醒用户避免潜在错误。

算法和数据结构。该领域研究特定的问题类和它们的有效解法,基本问题品:对于给定的一类问题,最好的算法是什么?算法所需的空间和时间为多大?空间和时间的最佳适应点是什么?最好算法的最坏情况是什么?算法的平均性能如何?算法的通用性如何——即什么样的问题可以用类似的方法解决。主要成果如下:

1. 对于重要问题的算法的好与坏的标志,这些问题如搜索、排序、随机数发生和正文模式匹配等。

2. 适用于许多问题类的通用算法的评价,如表内信息存贮,图算法,树算法。

3.区分数据结构对于各种问题类的程序所需的时间和空间的影响。

操作系统。这一领域研究使多个资源在程序执行时有效的协调的控制机制。基本问题如:在计算机系统操作的每个时间片中,可见的客体是什么?客体上允许的操作是什么?对每类资源(在某层可见的客体),允许使用它们的最小操作集合是什么?如何组织接口使得用户不必知道硬件的物理细节而仅与抽象资源打交道?任务调度,存贮器管理,通讯,软件资源存取,并发任务通讯、可靠性,保密性等等的有效控制策略是什么?可以通过什么原理重复使用少量的构造规则扩充系统的功能?主要成果如下:

1. 分时系统、中断系统、存贮器自动分配、调度器和文件系统都是主要的商用系统的基础。

2. 用户程序库,如正文编辑器,文件格式程序,编译程序,链接程序以及设备驱动器。

3. 有效的分层抽象原理,使得用户在理想化的资源上操作而不必关心物理细节——例如,进程取代了处理机,文件取代了磁盘,数据流取代了程序输入/输出。

4. 进程管理理论,包括可靠的进程间同步通讯和死锁控制。

5. 存贮器管理理论,包括优化的虚拟存贮器交换策略,文件存取方法和次级存贮器优化。

6. 目录分层。

7. 任务调度理论,排队网络模型和其他形式的性能模型。

8. 特定用户所有的文件的存取控制模型。

9. 高层命令接口,它使得用户能简单地表达从系统的文件中选出的部分组成的计算。这个接口包括交互式的“窗口”,命令“菜单”及“鼠标器”指针。

网络。这一领域研究由互连的计算机组成的系统。基本问题如:检错与纠错的最有效的方法是什么?在各种介质中(如,电话线、微波、激光)可靠地交换信息的最有效方法是什么?调解共享通道竞争的最有效方法是什么?应该用什么方法连接远距计算机?应该用什么方法连接近距计算机?怎样把系统是由部件通过网络连接这一事实对于那些不想知道层次细节的用户隐藏起来?主要成果如下:

1. 远程计算机到计算机之间通讯网的标准,它们往往作为商用网络的基础。

2. 近距的计算机高速链接的局部网,如:Ethernet,pronet和标志环网(token-ring)。

3. 在不可靠的网络中,使计算机建立链路和维护链路的协议。

4. 调解共享或广播式通道中高速竞争的协议。

5. 保证保密确认和秘密通讯的加密协议。

6. 使网络对于那些不想知道细节的人透明的操作系统的结构化原理。

人机接口。这一领域研究如何通过各种人的感觉和机动技能,在人与机器之间进行信息传输。基本问题如:表达客体与自动产生视觉图像的有效方法是什么?接收输入与发送输出的有效方法是什么?怎样使感觉的错误及其造成的人的错误减为最小?主要成果如下:

1. 有效地表达与显示客体的硬图形系统,这些系统可以实时显示旋转、平移、全景和放大,这包括从基本部分构成图像,平滑,加明暗,取消暗线等一系列算法。

2. 计算机辅助设计的交互式方法。

3. 输入输出的高级形式,如光学读入器,光笔,触觉敏感的拍纸薄和“鼠标器”指针。

4. 减少人的错误,增加人的效率的交互模式的心理学研究。

数据库系统。这一领域研究如何将大量的数据组织起来以方便查询。基本问题如:应该用什么样的模型表示数据元素和其间的关系?用什么操作对数据进行存贮,定位,检索和匹配?如何以语言的形式把这些操作最有效地表示出来?高层查询描述怎样翻译成有效的可直接查询数据库的代码?什么样机器的体系结构适合于最快速的检索?怎样保护数据免受非授权的存取,泄露和破坏的干扰?当有同时存取操作,尤其当数据是在多台机器上分布式放置时,如何保护大型数据库的一致性?主要成果如下:

1. 表示大型数据集合及数据元素间关系的主要模型,包括:关系模型,分层模型和网络模型。为快速查询对文件进行的特殊表示,如倒向树和相联式存贮。

2. 当许多用户同时访问一些记录时,对这些记录进行加锁的设计原理。

3. 当一个网络中的不同机器上存有多个数据副本时,保持一致性的设计原理。

4. 数据库中防止信息非授权的泄露与改动的原理,包括在实时查询系统中防止统计推断。

5. 高性能的数据库计算机。

并发计算。这一领域研究需要多个处理单元并发工作进行计算的组织。基本问题如:并发计算的基本模型是什么?每种模型最适合什么问题?每种模型中,什么样的机器最适合程序的有效实现?应该在高层提供什么样的工具以使得大量并发计算能够既迅速又正确地表达出来?怎样管理这种计算所需要的大量资源?主要成果如下:

1. 并行计算的通用模型,如树型机,网格向量机,数据流机和通讯顺序进程;为这些计算机设计的新的程序设计语言。

2. 在这些机器上,开发重要的问题类的并行算法;对程序进行分割以使得它们能够并发执行的方法;并行算法的时间与空间复杂性的分界。

3. 并发计算中进行程序设计和排错的交互式辅助方法。

人工智能。这一领域研究智能的模拟。基本问题如:什么是智能?智能的基本模型是什么?如何设计能够模拟智能的计算机?在什么程度上,智能由规则评价描述?通过评价规则来模拟智能的计算机的性能极限是什么?在什么程度上,智能是不可预测的?这能够在计算机上依随机性建立模型吗?主要成果如下:

1. 认知和思维理论用计算机所能识别的形式表达出来。

2. 知识表示和通过知识库搜索的有效方法。

3. 逻辑程序设计,定理证明和规则评价的有效的软件系统。

4. 一些特殊的应用,如,机器人学,图像处理,视觉,及语言识别。

5. 在一些窄范围的领域内模拟专家行为的基于规则评价的专家系统。

计算机科学作为一门学科,它包括有自己的理论,实验方法和工程。这与大多数的物理科学是不同的,物理科学与工程是分离的,工程应用物理科学发现的成果——如,化学与化工。我认为科学与工程在计算机科学内不能彼此分开,这是因为要强调效率。但我也承认计算机科学还欠完善,因为构成计算机科学的基本问题在近期内尚不能得到答案,这个问题就是:什么可以自动化?

[American Scientist,1985年第1期]