作为学科的计算科学
Peter J.Denning(主席)Douglas E.Comer,David Gries,
Michael C.Mulder,A11en Tucker,A.Joe Turner,and Paul R.Young
Computing as a Discipline
from《Communications of the ACM》January 1989 Volume 32 Number I
Computing as a Discipline 英文连接 http://wenku.baidu.com/view/fd6e555e312b3169a451a4bc.html
摘要: 这是计算机科学核心攻关组的最后报告。它给出计算机学科一个新知识框架,和计算课程的一个新基础。本报告已经过美计算机协会(ACM)教育委员会认可并批准发行。
本文结构:
1 引言 2
2 攻关组的任务 2
3 学科形态(Paradigms) 3
4 程序设计的作用 4
5 计算的描述 5
5.1 要求 5
5.2 简短的定义 6
5.3 划分为分支领域 6
5.4 分支领域的进一步研究 7
6 课程模型 7
6.1 学科能力的培养 7
6.2 终身学习 8
7 导引性课程系列 8
7.1 预备知识 9
7.2 模块的组织 9
8 实验室 10
9 资格审查 12
10 结论 12
11 附录 计算科学作为一个学科的定义 12
一 算法和数据结构 14
二、程序设计语言 16
三、体系结构 17
四、数值和符号计算 18
五、操作系统 19
六、软件方法学和工程 21
七、数据库和信息检索系统 22
八、人工智能和机器人学 24
九、人机通信 25
12 致 谢 26
13 参考文献 27
1 引言
美国计算机协会(ACM)已成立42年了,但一场老问题的争论仍在继续。计算机科学是科学还是工程学科?或者只是一门技术、一个计算商品的研制者和销售者?学科的智力本质是什么?它将持续兴旺下去或者在我们的下一代衰落下去?计算机科学和工程目前的核心课程是否反映了这一领域?怎样把理论和实验室的工作集成在计算课程中?各核心课程培养计算方面的能力吗?
我们建议一种面向技术的学科描述,其基础是数学和工程。例如,我们把算法当作最基本的研究对象,而程序设计和硬件设计则当作正要的研究活动。认为“计算机科学等于程序设计”的观点在我们的许多课程里是很占上风的。导引性的课程是程序设计,程序设计技术安排在各核心课程中,而科学则在选修课中。这外观点阻止了重新组织各课程的进展,使心怀大志的最好的学生远离我们而去。它拒绝了一条统一的途径,以便把实验的和理论的计算机科学集成为课程的有机组成部分。
今天,本领域已经足够成熟,使我们能用新的水到渠成的方式来描述它的知识本质。这在计算机科学与工程博士单位评审部的领导者们1984年7月在犹他州召开的会议上进行了讨论。这一讨论及其他类似的讨论推动ACM和IEEE计算机学会组成攻关组去开创新途径。1985年春,ACM总裁Adele Goldberg和ACM教育委员会主席Robert Aiken在IEEE计算机学会热心合作之下,任命了这个计算机科学核心攻关组。同时,计算机学会在ACM的热心合作下,组成了计算机实验工作攻关组。
我们希望,本报告所反映的核心攻关组的工作能产生比预定更多的效益。有了对本学科的核心的共同的认识,就能理顺利协调这两个学会发展行各分支学科和课题的进程。本报告可以作为进一步讨论计算机科学与工程作为一个专业的基础,刺激中学计算课程的提高,导致更大范围地承认计算科学是—个学科。
我们的目的是创造一个关于本领域的新的思想方法。希经把一般性的议论融入学科的性质,寻求一个框架,但不是一个清单、一个导引,而不是一道命令。我们希望你采纳这一框架,并使之适合你自身的情况。我们高兴地介绍本学科的新的知识框架和各课程的新基础。
2 攻关组的任务
攻关组接受了三项任务:
(1)给出计算机科学的描述,该描述要强调基本问题及已有的重要成就。这个定义必须确认,本领域在不断变化,现在说的不过是持续进步过程中抢拍的一个镜头。
(2)提出计算机科学的教学规范。该规范要符合传统的科学标准,强调本学科能力的培养,并且把理论、实验相设计紧密地结合在一起。
(3)基于课程模型和学科描述,详尽地给出计算机科学导引性课程系列的一个例子。
我们当即把我们的任务扩展到包括计算机科学与汁算机工程,因为这两个领域的核心材料没有基本区别。区别仅表现在处理这些核心材料的方式不同:计算机科学注重分析和抽象;计算机工程注重抽象和设计。这里,计算学科(discipline of computing)一词用来包括计算机科学和工程。
有两件重要的事情没有包括在攻关组的任务之内。第一,本报告的课程推荐只列出了导引性的课程序列,末涉及整个核心课程的设计这样—个重大问题。而实际上如果对核心的其余部分没有新的设计,所建议的导引性课程也就没多大意义了。第二,导引性课程的目的是用严格而富有挑战性的方式把学生引到整个学科领域中去。我们所列的不过是这种途径的—个例子,或者说是我们关于计算的定义的一个“存在性证明”。我们希望各系应用本框架去确定他们自己的导引性课程,以满足自己的需要。
3 学科形态(Paradigms)
籍以从事本领域工作的三种主要形态,或称文化方式,提供了我们定义计算学科的条件。
第—个形态是理论(theory),基于数学,按统一的合理的理论发展过程.包含以下四个步骤:
(1)特征化研究对象(定义 definition);
(2)假设它们之间可能的关系(定理theorem);
(3)确定这些关系是否正确(证明 proof);
(4)解释结果。
数学家们认为,当发现错误和矛盾时,上述过程应该反复进行。
第二种形态是抽象(abstraction),或称模型化,基于实验科学方法。按客观现象的研究过程,包含以下四步:
(1)形成假设;
(2)构造模型并做出预言;
(3)设计实验并收集数据;
(4)分析结果。
科学家们希望,当模型的预言与实验结果不符时,这些步骤应该反复进行。虽然这一形态也可以称为“模型化”或“实验”,但我们仍采用“抽象”一词,因为它在学科里面比较通用。
第三种形态是设计(design),基于工程,按为解决某一个问题而构作系统或装置的过程,包含以下四步:
(1)叙述要求;
(2)给定技术条件;
(3)设计并实现该系统:
(4)测试该系统。
工程师希望,当测试表明当的系统不满足技术条件时,上述步骤须反复进行。
理论是数学科学的根本:应用数学家们都认为,科学的进展都是基于纯数学的。抽象(模型化)是自然科学的根本:科学家们相信,科学进展的过程基本上都是形成假设,然后用模型化过程去求证。类似地,设计是工程的根本:工程师们认为,工程进展基本上都是提出问题,然后通过设计去构造系统,以解决问题。关于数学、科学、工程三者哪一个更加重要的许多争论实质上都基于一个假定:三个过程(理论、抽象或设计)的某一个是最基本的。
然而,仔细考察计算学科可以发现,关于计算的这三个过程是如此紧密的交织在一起,以致无法分清哪一个更加基本。有许多例子分别表明,抽象和设计阶段出现了理论;理论和设计阶段需要模型型化,而理论和抽象阶段,始终离不开设计。
虽然这三种形态是紧密相关的,但毕竟是三种不同的形态,因为它们代表能力不同的领域。理论关心的是揭示和证明对象之间相互关系的能力。抽象关心的是应用这些关系去做出对现实世界的预言的能力。而设计则关心这些关系的某些特定的实现,并应用它们去完成有用的任务。应用数学家、计算科学家和设计工程师一般具有互不相同的专长。
并且,计算领域的人们要研究计算工具,以支持人们需要的信息变换过程。例如,从设计方面说,复杂的VLSI设计和模拟系统处我们能进行微型电路的有效和正确的设计,程序设计环境使我们能有效地进行软件设计。从模型化来说.超级计算机能评估数学模型,并做出对现实世界的预言,网络有助于传播科学实验的成果。从理论来说,计算机可以做定理证明,检查技术条件的相容性,检查反例,演示测试情况。
计算处于应用数学、科学和工程三者的主要过程的交叉路口。这三个过程在本学科是同等重要和基本的,它是理论、抽象和设计三者唯—的交汇点。维护它们的力量是把实验和设计作为信息变换器的共同兴趣、在这些过程各阶段的计算支持的共同兴趣、和在有效性方面的共同兴趣。
4 程序设计的作用
计算领域的许多活功并不是程序设计——例如,硬件设计、体系结构、操作系统结构、数据库的应用和模型验证——因此,认为“计算机科学等于程序设计”是错误的。那么,程序设计在本学科中的作用是什么?在课程中地位如何?
显然,程序设计是本学科标准的实践活动的一部分,每一个计算工作者都必须有程序设计的能力。但这并不意味着,本学科就建筑在程序设计的基础上,也不意味着导引性课程必须是程序设计方面的课程。同样明显的是,涉及任何领域的特色都要通过语言,而计算学科的特色则大都寓于程序设计符号中。程序设计语言是涉足本领域特色的工具。因此.我们建议,程序设计作为核心课程的一部分,并把程序设计语言作为涉足计算学科重要特色的有用媒介。
5 计算的描述
计算科学作为一个学科的描述包含四部分:(1)要求;(2)简短定义;(3)划分为分支领域;(4)分支领域的内容。我们的描述分四遍扫描,每一遍都大大详尽—步。
我们这里所说的仅仅是一个变化着的动态领域的抢拍镜头。它是一个“活的定义”,它可以随时修改,以反映本领域的成熟性和变化。我们希望,各分支领域的内容可以经常修改,各分支领域的分法可以偶尔有修改,而简短的定义则很少修改。
5.1 要求
形成一个定义有许多方式。我们提出五个要求:
(1)定义应该能为本领域以外的人所理解。
(2)定义应该是本领域以内人们的着力点。
(3)定义必须是明确的。
(4)它必须阐明本学科的数学、逻辑和工程的历史渊源。
(5)它必须指明本学科的基本问题和已有的重要成果。
在形成描述的过程中.我们考虑了原有的几个定义,并且得出结论,满足这些要求的描述必须按复杂程度分层次。这里,简单地综述一下其他的定义。1967年.Newell,Perlis和Simon[ 5] 主张,计算机科学是研究计算机及围绕它的主要现象的科学,而且说,反对这个定义就无异于表明其他科学都不是科学。但不管怎么争辩,许多人认为,这是一个循环定义,而且对外行人过于简略。不过,它仍是一个好的出发点,
因为我们的定义可以看作是列出了围绕汁算机的主要现象。
计算科学资格审查部(Computing Sciences Accreditation Board,CSAB)精心修改了上述想法,用了一个如下定义:“计算机科学是关于计算机和计算的知识的总体。它有理论、实验和设计三部分,并且包括(1)理解计算装置、程序和系统的理论;(2)为概念的发展和测试所进行的实验;(3)设计方法论,算法和实现工具;以及(4)验证这些实现满足要求的分析方法。”
第三个定义说,“计算机科学是研究知识表达及其实现的科学”。这个定义过于抽象,很少人能够对知识表达有相同的理解。具有同样一个问题的另一个定义是,“计算机科学是关于抽象和复杂性控制的研究”。是一个对物理、数学或哲学也适用的定义。
Abelson 和Sussman说过,“计算机革命是思维方法和思维表达方法的革命”。这种变化的本质是所谓过程性认识论的出现——它是从命令性的观点来研究知识的结构,而不是象经典数学那样用陈述性的观点来研究。数学提出一个精确处理“是什么”的问题的框架,而计算则提出精确处理“怎样做”的问题的框架[ 1]。
5.2 简短的定义
计算学科是对描述和变换信息的算法过程的系统研究,包括它的理论、分析、设计、有效性、实现和应用。全部计算科学的基本问题是“什么能(有效地)自动进行?
5.3 划分为分支领域
我们花了相当的力气,把整个学科分为若干分支领域。一开始,我们想尽量少分一些分支领域.例如模型化和实现,或者算法和机器。然而,我们提出的各种分支都太抽象,界限也很模糊,恐怕大部分人都无法顺利地确认它们。
然后,我们认识到,学科的基础包含在三个基本过程中——理论、抽象和设计。各分支领域也是用这些基本过程来完成它们自身的目的的。因此,各分支领域及其与这三个基本过程的关系的描述将是有用的。必须满足下列四个条件,才能算得上一个分支领域。
(1)科目内容基础的协调一致;
(2)实质性的理论部分;
(3)有意义的抽象;
(4)重要的设计和实现。
并且,每一个分文必须被一个研究群体或几个相关的研究该分支的群体所确认。
理论包括发展本分支数学基础的过程。这些过程又由其他领域的理论来支持。例如,算法和数据结构分支包括复杂性理论,它本身又需要图论支持。抽象处理潜在实现的模型化。这些模型忽略—些技术细节,而保存本质特性,服从分析的需要,提供计算被模型化系统行为的预言所需的工具。设计的过程是给定问题、把问题变换为设计的技术条件,然后,反复设想和考察各种各样的解,直到一个可靠的、可维护的、有详细资料的、经过验证的、付出的代价大小也符合要求的设计做比来为止。
我们认为本领域可以分为几个分支领域:
(1)算法和数据结构
(2)程序设计语言
(3)体系结构
(4)数值和符号计算
(5)操作系统
(6)软件方法学和工程
(7)数据库和信息检索系统
(8)人工智能和机器人学
(9)人机通信
5.4 分支领域的进一步研究
为了结出各分支领域的内容,我们发现,用图1.1所示的9×3矩阵是有用的。每一行对应一个分支领域,各列分别定义它的理论、抽象和设计。每一格填入相应的句子,以描述有关事项及有意义的成就。
理论 抽象 设计
图 1.1计算学科的定义矩阵课程设置模式
已有大量科学文献的某些带共同性的群体没有作为分支领域来看待,出为它们在整个学科内部是基本的东西。例如,并行性渗透到所有分支领域(包括并行算法、并行语言、并行结构等),也遍及到理论、抽象和设计。类似的情况还有安全性、可靠性和性能评估。计算机科学家关心的是矩阵的前两列,而计算机工程师关心的是后两列。这给出的计算学科的全部描述见本文附录。
6 课程模型
6.1 学科能力的培养
教育的目的是培养在某一领域的工作能力。工作能力,也就是有效的活动能力,是评价一个人在本领域进行独立实践活动的水平的标准。这个评价标准是基于本领域的历史的。培养能力的教育过程有五个步骤:(1)引起学习某领域的动机;(2)表明该领域能做什么;(3)揭示本领域的特色;(4)这些特色的历史根源;(5)实践这些特色[ 4] 。这—模型隐含了课程设置中一些有趣的问题。第一个问题是,计算领域的工作者应该具备什么能力?有两类能力:
1.面向学科的思维能力:发现本领域新的特性的能力。这些特性导致新的活动方式和新的工具,以便使这些特性能被其他人所利用。
2.使用工具的能力:使用本领域的工具有效地进行其他领域实践活动的能力。
我们建议,把面向学科的思维能力作为计算专业课程设置的主要目的。同时,计算专业工作者必须充分熟悉工具,以便与其他学科的人们有效地合作,进行那些学科的设计活动。
对能力的调查表明,某些领域目前设置的核心计算课程是不合适的。例如,计算领域的历史内容常不被强调,以致许多毕业生忽视计算学科历史,重复原来的错误。许多计算专业的学生毕业后进入商业数据处理,而他们学习的课程并没有注重培养这方面的能力。这种能力究竟应该由计算系来培养,还是由商业系来培养是一个长期争论的老问题。面向学科的思维能力必须基于坚实的数学基础,而理论目前还没有成为大多数计算课程的有机组成部分。计算领域典型的实践活动包括设置和进行实验、为大型协作课题作贡献、以及和其他学科的交流,以便让他们能有效地运用计算学科。但是,大多数课程忽视实验室操作、集体项目和交叉学科研究。
前面的讨论还没有完全说清楚,计算课程究竟应该取得什么结果。我们在这里,也不打算作彻底的分析。我们希望,这个问题在新的核心计算课程设计时优先加以考虑。
6.2 终身学习
应该设计一个课程,使毕业生们感到他们需要毕生学习。许多课程都是按讲授的形式,给出“答案”,而不是强调寻求全部学习基础的过程。我们建议下属委员会考虑改变教学规范,使学生们能够善于提出问题,查阅计算科学文献,并准备学习一辈子。
7 导引性课程系列
在本课程设置模式中,引出本领域的学习目的和显示本领域的内容必须在课程的讲授和实践之前。导引性课程系列的目的就在于此。要培养学生能力的那些主要的计算领域必须充分深入和严格的教给学生。使他们领会学科的力量,以从取得在这些学科独立工作能力能够带来的利益。然后,课程再系统介绍该领域,揭露新概念和新性质,并让学生们实践。
因此,我们建议导引性课程包含正规讲授和密切相关的每周一次实验。讲授强调基本原理、实验室技术知道怎么做。
这种方式和过去物理科学和工程所用的一样。讲授强调长久不变的原理和概念,而实验室强调暂时性的材料和与当前技术有关的技能。例如,课堂上讲授算法的设计与分析,或者功能层网络协议的组织。而在相应的实验课上,学生们将为课堂上分析的算法写程序,并测量其运行时间,或者安装和测试网络接口,并测量他们的包吞吐量。
根据这个意见,计算机科学的第一门课将不仅是介绍程序设计、算法和数据结构,还要介绍其他各分支学科的材料。数学和其他理论也要在合适的地方融合进去。我们希望导引性课程能够包含对整个学科严格而富有挑战性的综述。Feynman的物理讲座是我们所希望的的导引性课程的范例。
如果我们只强调按照本建议重新设计导引性性课程,而不重新设计全部的大学课程,那将是一个严重的错误。物理系的经验就包含了许多值得计算系借鉴的教训。
7.1 预备知识
我们假定计算专业的学生在下列方面有一定基础:某种语言的程序设计、某些基于计算机的工具的使用经验,如字处理、展开片(Spreadsheet)[注]和数据库。由于计算机在高中和家庭的广泛使用,似乎可以假定大多数进入大学的学生已有这种基础.而只是对其他学生提供程序设计的一个补习性的课程就可以了。然而,我们发现,在高中对程序设计进行适当准备的假定是大有争议的。事实上很少有适当的准备。因此,我们建议计算系在导引性课程之前,提供程序设计和计算机工具的初等教程作为预备知识。并且建议系里允许在高中已有适当准备的学生免修该课。
数学方面的正式的预备知识和公用基础知识就更难说清楚,而必须因地制宜。然而,计算科学资格审查部要求相当的数学知识,包括离散数学、微积分、概率论和统计。这些要求有些过分。在我们的初等计算课程的描述中,给出了这九个分支领域所需要的数学知识。我们还尽可能的给出了每一个课程模块所需要的数学基础。这样,各系可以自己去平衡他们所开的课程及对数学知识的要求。有时,为了某个特定的计算课题,而需要引入适当的数学基础,这是合适的。一般来说,应该让学生们尽早看到在他们学习计算的过程中
需要用到的有关的数学。
[ 注] :译文为展开片,实际指的应该是电子表格
7.2 模块的组织
导引性课程应能给出本领域统一的基础,又能按灵活而自然的方式由上一个题目转向下一个题目。因此,把这个课程分为九部分,每一部分对应一个分支领域是不合适的。这种简单的对应将使课程变成一个大众烩,各部分之间很难连接。满足这一要求的题目顺序是:
基本算法概念
计算机组织(“冯·诺依曼”)
数学的程序设计
数据结构和抽象
可计算件的限制
操作系统和安全性
分布式计算和网络
人工智能模型
文件和数据库系统
并行计算
人机接口
我们把题目分成11个模块,每一模块包括该科目的有代表性和挑战性的材料,而不是对每一部分材料肤浅的拼凑。每一模块从定义矩阵的几个方块中抽取材料。因而,许多模块将不与定义矩阵的各行一一对应。例如,我们给出的课程的第一个模块题为基本算法概念。它只限于研究时序算法,包括形式化和理论的作用、程序设计方法、程序设计概念、有效性和特定算法。它抽取定义矩阵的第一、第二、第四和第六行的信息。后面关于分布式计算和网络以及关于并行计算的模块推广第一模块的材料,并从定义矩阵的第三和第五行中抽取新的材料。
一般来说,每一模块包括讲授所需的理论和大部分抽象的课时。理论一般只在需要时才引入。每一模块都紧密结合实验课,实验作业的种类包含在模块规范中。我们草拟的规范是一个三个学期的课程系列,每学期讲授42次并进行35次实验。该规范本文未予列出,但已收入报告全文中。
我们重申,本规范只是企图提供从学科描述到导引性课程系列的对应关系的一个实例,并不是所有导引性课程的一个清单。其他方式可参考某些学院和大学现有的导引性课程。
8 实验室
我们描述了一个课程,它把原理和技术分开,但保持二者的统一。我们已经推荐,课堂上讲授原理,实验室培养技术,使二者得以紧密结合。
实验室工作有三个目的:
1.实验室工件应该表明,课堂上讲授的原理怎样运用于实际软件和硬件的设计、实现和测试。实验室必须提供具体经验,以帮助学生理解抽象概念。这些经验对提炼学生关于实际计算的直觉知识、对强调建造正确有效的计算机程序和系统所需的脑力劳动都是极其必要的。
2.实验室要强调怎样做才能导致一个好的计算的过程。必须强调程序设计,而不光是程序本身。必须强调实验室技术、硬件能力的理解、软件工具的正确使用;文档的正确使用以及实验和方案的适当文档。主机上要求许多的软件工具,以利于在附加的子系统上构作、控制和监控实验。实验室应教会学生如何适当的使用这些工具。
3.实验室应介绍试验方法,包括试验的使用和设计、软件和硬件监控器、结果的统计分析以及研究结果的适当陈述。学生们必须学会把细心地试验和粗心地观察区别开来。为了达到这些目的,必须仔细计划和管理实验室的工作。学生们必须按时到达实验室。一般每周三小时。实验主作业必须事先计划好,并且给每一个学生书面的实验目的与方法。这份幅面材料的深度要和学生过去的实验经验相适应。对最初的几个实验,这份材料需要更加详细。实验室作业应在实验主教师的指导下进行,以保证每个学生运用正确的方法。导引性课程的实验需要仔细辅导,而且需要详细计划试验步骤。因此,平均每个学生所需的实验室工作人员人数应该比高级实验室多一些。
验课题应与课堂讲授的材料相协调。个人实验课题一般探讨硬件与软件的结合。某些实验室作业强调简化软件开发过程的技术与工具;有些则强调分析和测量已有软件或比较已知的算法;有的则强调基于课堂上所学原理的程序开发。
实验室作业必须是自包含的。也就是说,中等水平的学生应能在指定时间内完成。实验室作业应该鼓励学生自己发现和学习一些东西。应该要求学生有一个试验记录本,以记录试验、观察和数据。同时,要求学生保存他们的软件,并建立软件库,以备以后实验课题之用。
我们希望,实验窒应该和课堂一样,给学生留家庭作业,并要求使用实验室管辖之外的计算机。换句话说,有组织的实验课是补充,而不是代替通常的程序设计作业和书面作业。
在相当数量的程序开发实验室里,作业是修改或完成由教师给出的一个已有的程序。这就强制学生去读写好了的程序,并提供软件集成的经验,产生更大、更使学生满意的程序。
计算技术是在不断变化的。因此,对实验室应该有的硬件系统、软件系统、仪器和工具,很难给出详细的技术要求。实验室设备和人员的选择应遵循下列原则:
1.实验室必须装备有跟上时代的系统和语言。程序设计语言对学生形成对计算的看法有重要影响。实验室应该使用那些能使学生养成良好习惯的系统。尤其重要的是,在核心课程里要避免使用过时的系统(硬件和软件)。
2.硬件和软件要加强维护。有故障的装置将使学生受挫,干扰他们的学习。必须配备合适的工作人员来维护实验室的硬件和软件。这和其他学科的实验室情况类似。
3.功能齐全是重要的(这包括分时系统的适当的响应时间)。在学生刚开始接触系统时,限制学生在语言或系统的一个小的子集中也许是有用的,但当学生有了进步,这些限制就应该取消。
4.好的程序设计工具是需要的。编译器受到很大重视,但其他程序设计工具也同样经常用到。例如,在UNIX系统中,学生们必须用像emacs那样的编辑器,并学会使用像shell,grep,awk和make等工具。存储和处理的软件工具必须充足,使实验室里随时都可以用这些工具。
5.必须提供硬件和仪器方面必要的支持。某些课题要求学生连接硬件单元的线路,进行信号测量,监视数据通路等。应该能充分提供小部件、连接器、电缆线、监视装置和测试仪器等。
IEEE 计算机学会的面向目的的实验室开发攻关组对此作了深入的研究。他们的报告讨论了本课程各种水平的实验室所需资源(即人力和设备)。
9 资格审查
以本课程为倒的资格审查工作在计算科学资格审查部(CSAB)的标准指导下已经完成。如何适应CSAB标准的详细情况超出了本委员会的范围。
10 结论
本报告企图提出关于计算科学作为一个学科的新思路,即在揭示内容时,强调基本概念、原理和特性。同时,也建议按照其他学科的教育模式重新设计本学科的核心课程。先讲解有用特性的存在性,然后进行培养能力的实践。这一方法用一个严谨的导引性课程为例,说明如何在课堂卜讲授概念和原理,在有关的公共实验里教授技术。
系里不能简单地用新课取代现有的导引性课程,必须重新设计该课,使新的导引成为统一整体的一部分。因此,我们建议ACM成立一个委员会继续工作,以完仝核心课程的重新设计。为了使新课程成为本领域的有机组成部分,许多实际问题有待研究。例如:
1.基于新概念形式化,教师需要重新设计他们的课程。
2.现在还没有基于本文框架的教材或教科书。
3.为了本文建议的教育使命,目前大多数系的实验室、设备和材料都小相适应。
4.助教和教师都不熟悉这一新观点。
5.在高中阶段对计算科学准备很好的不多。
我们知道,我们的许多建议是有挑战性的,距离实现还有很长的路要走。但是,我们相信,按照本建议改进计算科学教学的努力是有价值的,欢迎你和我们一起为此而努力。
11 附录
计算科学作为一个学科的定义
计算机科学与工程是对描述和变换信息的算法过程其理论、分析、设计、效率、实现和应用——的系统的研究。全部计算科学的基本问题是,什么能(有效地)自动进行[ 2,3] 。本学科和算法理论、数理逻辑和存储程序式电子计算机的发明一起,形成于40 年代初。
计算的渊源可以深入扩展到数学和工程。数学把分析分到这一领域,而工程把设计分到这领域。本学科包括它自己的理论、实验方法和工程。这与许多其他的自然科学不同。许多其它的自然科学和运用其成果的工程学科是分开的(例如化学和化学工程原理)、计算机科学与工程却是不可分的,因为本学科的科学与工程形态从根本上是相互渗透的。
计算作为数学的主要对象已有几千年了。自然现象的许多模型被用来导出方程,它的解就导致那些自然现象的预言。例如轨道的弹道计算、天气预报和流体的流动等。解这些方程的许多方法已经给出。例如线性方程组的解法、微分方程的解法和求函数的积分。几乎在这同时,机械系统设计中所需要的计算成为工程主要关注的对象。例如计算静态物体压力的算法、计算运动物体惯量的算法和测量比我们直觉要大得多或小得多的距离的方法。
工程和数学长期合作的一个成果一直是用于计算的机械工具。某些测量员和航海家的仪器可追溯到几千年前。Pascal 和LEIBNIZ 在17 世纪中叶制造了算术计算器。在19 世纪30 年代,Babbage 设想了一个“分析机”,可以用机械,无误地计算对数、三角函数和其他般的算术函数。他的机器虽然没有完成,却给后来的工作以启发。到20 世纪20 年代,Bush 制造了一台电子模拟计算机,来解一般的微分方程组。同时,出现了能做加.减、乘、除和开平方的电动计算机。后来,电子触发器成为从这些机器到无运动部件的数字计算机的桥梁。
逻辑是数学的一个分支,研究推断合理性准则和推理的形式原理。自从欧几里得时代以来,它一直是严格的数学和科学论证的工具。从十九世纪开始,人们开始寻找通用的逻辑系统,它应该在已知的演绎系统中看不到不完全性。在完全系统中,就可以机械地确定任何给定的陈述是真还是假。Godel 在1931 年发表了他的“不完全性定理”,指出这种系统是不存在的。到20 世纪30 年代后期,图灵探索了通用计算机的想法,这种通用计算机能够模仿任何其他计算机器上一步一步运箅的过程。他的发现与GODEL 的想法类似,即某些良好定义的问题不能用任何机械的过程来解决。逻辑之所以重要,不仅因为它深刻地看到了自动计算的限制,而且因为注意到了符号串,或者已经编码的数字。既可解释成数据,又可解释成程序。
这一看法成为区别存储程序式计算机和运算机械的关键的想法。算法步骤被编码成机器表示,并存放在存储器中,以后使用时译码,并由处理器执行。机器码可以从高级符号形式(程序设计语言)机械地推导出来。
这就是关于古代计算和逻辑符号运算错综复杂的历史渊源,以及近代关于电子学和信息的电子表示的线索。它们导致了计算学科的诞生。
我们确认了计算科学的几个分支领域:
1.算法和数据结构
2.程序设计语言
3.体系结构
4.数值和符号计算
5.操作系统
6.软件方法学和工程
7.数据库和信息检索
8.人工智能和机器人学
9.人机通信
每一分支领域都有科目的公用基础、本质的理论部分、有意义的抽象和重要的设计与实现问题。理论研究作为该分支领域基础的数学的发展。包括支撑理论,象图论、组合论或形式语言。抽象(模型化)处理潜在的实现模型。这些模型忽略一些技术细节,而保存本质特性,并提供预言未来行为的工具。设计的过程是给定问题、导出要求和技术条件、反复研制和测试样机,从而实现这个系统。设计包括实验方法。计算科学中的实验方法有好几种形式:测量程序和系统,验证假设的合理性、通过样机使抽象变为现实。
虽然软件方法学本质上说属于设计,但它包含理论和抽象的实质性成分。因此,我们把它作一个分支领域。另一方面。并行和分布式计算渗透到所有分支领域和它们的各个层次理论、抽象和设计)。它们既未作为一个分支领域,也不作为某分支领域的一个层次。以下各节提供各分支领域的三个层次的细节。理论与抽象、抽象设计的界限必然是模糊的,随各人的胃口可能会有所不同。
我们的目的是通过列出学科的主要特点来提供学科的指南,但不是详尽的罗列。应该记住,这个学科指南小是一个课程计划,它只是设计一个课程所需的框架。同时应该记住,这个学科指南是一个不断变化着的有机体的瞬间抢拍镜头。它需要不断考验和定期修改。
一 算法和数据结构
本领域研究一些特定类型的问题及它们的有效的解。
基本问题包括:
对给定类型的问题,最好的算法是什么?
它们要求多少存储空间和时间?
空间与时间的折衷方案是什么?
存取数据最好的方法是什么?
最好算法的最坏情况是什么?
算法的运行按平均来说好到何种程度?
算法一般化到何种程度——即什么类型的问题可以用类似的方法处理?
1.理论
算法和数据结构领域理论的主要原理是:
(1)可计算性理论。它定义机器能干什么、不能干什么。
(2)计算复杂性理论。它告诉你如何测度计算函数的时空要求,把问题的大小和解决该问题算法的最好或最坏情况的性能联系起来,
并提供证明对问题的任何可能解的下界的方法。
(3)算法和算法类的时间和空间界限。
(4)难解性(intractability)水平。例如,确定性的多项式时间内可解的问题(P-问题);非确定性的多项式时问内可解的问题(NP-问题);
以及有效的并行机可解问题(NC-问题)。
(5)从算法的数据流要求到机器通讯通路的并行计算、下界和影射。
(6)在时空上比确定性算法更加有效、且以足够高的概率获得TF 确果的概率算法。蒙特卡洛方法。
(7)密码术。
(8)支撑领域:图论、递归函数、递推关系、组合论、微积分、归纳、谓词逻辑和时态逻辑(Temporallogic)、
语义学、概率和统计等支撑领域。
2.抽象
算法和数据结构的抽象的主要部分是:
(1)对重要问题类的有效的最优的算法和对最好、最坏和一般算法性能的分析。
(2)控制和数据结构对各种问题类时空要求的影响的分类。
(3)重要的技术类型,像分治(divide-and-conquer)、格里地算法、动态规划、有限状态机解释器、堆栈机解释器。
(4)并行和分布式算法,把问题分由可以在不同处理器上执行的任务的划分方法。
3.设计
算法和数据结构领域的设计和实验的主要内容是:
(1) 对重要问题类的算法的选择、实现和测试。这些问题类包括搜索、排序、随机数产生和结构模式匹配。
(2)对于许多类型的问题都可以使用的通用方法的实现和测试。如杂凑法(hashing)、图和树。
(3)分布式算法的实现和测试。例如网络协议、分布式数据更新、信号(semaphores)、死锁检测器和同步方法。
(4)存储管理的实现与测试。例如无用单元收集、伙伴系统(buddy system)、表(lists)、表格(tables)和分页。
(5)对组合问题启发式算法的大量实验测试。
(6)能够安全可靠和秘密通信的密码协议。
二、程序设计语言
本领域研究执行算法的虚拟机的符号表达、算法和数据的符号表达以及从高级语言到机器码的有效的翻译。
基本问题包括:
由一种语言给出的虚拟机的可能的组织(数据类型、运算、控制结构、引入新类型和运算的机制)是什么?
这些抽象怎样在计算机上实现?
用什么样的符号表达(语法)可以有效地指明计算机应该做什么?
1.理论
程序设计语言领域的理论的主要部分是:
(1)形式语言和自动机,包括语法分析和语言翻译的理论。
(2)图灵机(过程性语言的基础)。
(3)形式语义:定义计算机数学建模及模型、语法和实现之间关系的方法。主要的方法包括标志的、代数的、操作的和公理的语义。
(4)支撑领域:谓词逻辑、时态逻辑、近世代数和数学归纳。
2.抽象
程序设计语言领域的抽象的主要部分包括:
(1] 基于语法和动态语义模型的语言的分类:即静态型、动态型、功能的、过程性的、面向对象的、逻辑的,说明性的、报文传递和数据流。
(2)语言按应用领域的分类:即商业数据处理、模拟、表处理和图形。
(3)程序结构的主要语法和语义模型的分类:即过程分级、功能合成、抽象数据类型和通信的并行过程。
(4)每种语言的主要类型的抽象实现模型。
(5)语法分析、编译、解释和开标码优化的方法。
(6)语法分析器、扫描器、编译器部件和编译器自动产生的方法。
3.设计
程序设计语言倾向的设计与实验的主要内容是:
(1)和特定抽象机器(语义)和语法一起,能形成统一的一可实现的整体的特定语言。
例如,过程性的(COBOL,FORTRAN,ALGOL,Pascal,Ada,C)、功能的(Lisp),数据流(SISAL,VAL)、
面向对象的(Smalltalk,CLU),逻辑(Prolog),串处理(Snobol),
和并行性(CSP,Occam,Concurrent Pascal,Modula2)。
(2)特定类型语言的指定的实现方法:运行时间模型,静态和动态执行方法、打印检查、存储和寄存器分配、编译器、交叉编译器和解释器、
在程序中寻找并行性的系统。
(3)程序设计环境。
(4)语法分析器和扫描器的产生器(例如YAcc,LEx)、编译器产生器。
(5)语法和语义错误检查程序、剖面(profing)、查错和跟踪。
(6)程序设计语言方法对文件处理功能的应用,如制表、图、化学公式、展开片、方程式、输入和输出以及数据开关。其他应用,如统计处理。
三、体系结构
本领域研究将硬件(和相应软件)组织成有效和可靠系统的方法。
基本问题包括:
在一个机器中实现处理器、存贮和通讯的好方法是什么?
我们如何设计和控制大的计算系统并且有说服力地表明,它们能够在有错误和故障的情况下完成预期的工作?
什么类型的体系结构能使许多处理单元有效地协同工作,实现一个计算的并行?
我们怎样测度计算机的性能?
1.理论
体系结构领域的理论主要部分是:
(1)布尔代数
(2)开关理论
(3)编码理论
(4)有限状态机理论
(5)统计、概率、排队论、可靠性理论、离散数学、数论和不同数制下的算术等支撑领域。
2. 抽象
体系结构领域的抽象主要部分是:
(1)把功能和行为联系起来的电路的有限状态机和布尔模型。
(2)由基本元件综合出系统的其它一般的方法。
(3)在有限域上计算算术函数的电路和有限状态机的模型。
(4)数据通路和控制结构的模型。
(5)对各种模型和工作负荷情况下指令系统的优化。
(6)硬件可靠性:冗余,差错检测,恢复和测试。
(7)在VLSI 装置设计中空间、时间和组织的折衷。
(8)各种计算模型的机器的组织:时序的、数据流、表处理、阵列处理、向量处理和报文传送。
(9)分级设计的确定:即系统构成级、程序级、指令系统级、寄存器级和门级。
3.设计
体系结构领域的设计与实验的主要内容是:
(1)快速计算的硬件单元。例如算术函数单元、高速缓冲存储器。
(2)所谓冯诺依曼机器(单指令序列存贮程序式计算机):简单指令系统计算机(RISC)和复杂指令系统计箅机(CISC)实现。
(3)存储和记录信息、检测和改正差错的有效方法。
(4)对差错的特殊处理途径:恢复、诊断、重构和后备过程。
(5)为VISI 电路设计的计算机辅助设计(CAD)系统和逻辑模拟、版图生成程序、故障诊断、硬编译器。
(6)各种计算模型的机器实现;如数据流、树形、LISP 、超立方(hypercube)、向量和多微处理机。
(7)超级计算机,如Cray 和Cyber 机。
四、数值和符号计算
本领域研究有效和精确地求解由系统的数学模型导出的方程的一般方法。
基本问题包括:
我们怎么才能用有穷离散过程去精确地逼近连续或无穷的过程?
我们怎么处理逼近导致的误差?
怎样才能按照给定精度很快地解出给定类型的方程?
怎样对方程进行符号运算,例如积分、微分和化简为最小项等?
怎样把这些问题的回答加入到有效的、可靠的、高质量的数学软件包中去?
1.理论
数值和符号计算领域的理论的主要部分是:
(1)数论
(2)线性代数
(3)数值分析
(4)非线性力学
(5)微积分、实分析、复分析和代数等支持领域。
2. 抽象
数值和符号计算领域抽象的主要部分是:
(1)把物理问题形式化为连续的(有时离散的)数学模型。
(2)连续问题的离散逼近。线性和非线性系统解的向后误差分析、误差传播和稳定性。特殊情况下的特殊方法,例如快速傅里叶变换和泊松解答器。
(3)可由正规网孔和边界值给定的大类问题的有限元模型,相应的迭代方法和收敛理论:直接、隐含、多栅格、收敛率。并行解法。
数值积分时自动格栅精炼。
(4)符号积分和微分
3. 设计
数值和符号计算领域设计和实验的主要内容是:
(1)高级问题形式化系统,如CHEM 和WEB 。
(2)为线性代数、常微分方程、统计、非线性方程和优化而特殊设计的程序库和程序包,例如LINPACKK,EISPACK,ElLPACK 。
(3)将有限元算法映射到特定结构的方法 例如,这些特定结构可能是超立方体上的多栅格。
(4)符号运算,例如MACSYMA 和REDUCE,能进行有力的非显然的运算,特别是微分、积分和表达式到最小项的简化。
五、操作系统
本领域研究允许多种资源在程序执行中有效配合的控制机制。
基本问题包括:
在计算机系统运行的各级上可见对象和允许的操作是什么?
对每一类资源(某一级上的可见对象),允许它们有效使用的最小操作集是什么?
怎样组织接口,使得用户只处理资源的抽象形式,而可以不管硬件的实际细节?
对作业调度、存储器管理、通信、软件资源存取、并发任务间的通信、可靠性和安全的有效控制策略是什么?
系统应该在功能上可以扩展,只要反复应用步量的构造规则就可以了。那么,这种扩展应遵循的原则是什么?
怎样组织分布式计算,使得许多由通信网络连结起来的自治的机器能够参与同一计算,而详细的网络协议、
主机位置、带宽和资源名称,人都是不可视的?
1. 理论
操作系统领域理论的主要部分是:
(1)并发性理论:同步、确定性和死锁。
(2)调度理论,特别是处理器调度。
(3)程序行为和存储器管理的理论,包括存储分配的最优策略。
(4)性能模型化与分析。
(5)存储器包装、概率论、排队论、排队网络、通信和信息论、时态逻辑和密码学等支持领域。
2.抽象
操作系统领域抽象的主要部分是:
(1)允许用户不考虑实际细节对同一类型资源进行操作的抽象原理
(例如,面向进程而不是处理器,虚拟存储器而不是主从分级,文件而不是磁盘)。
(2)用户接口可以察觉的对象到内部计算结构的束缚(binding)。
(3)重要子问题的模型,这些子问题的例子有进程管理、存储器管理、作业调度、二级存储管理和性能分析。
(4)分布式计箅的模型。例如顾客和服务器、合作时序进程、消息传送和远程过程调用。
(5)安全计算模型。例如存取控制、鉴别(Authentication)和通信。
(6)网络。包括分层协议、命名、远程资源使用、帮助服务和局部网络协议,如记号传送、分时总线。
3. 设计
操作系统领域的设计与实验的主要内容是:
(1)分时系统、自动存储分配器、多级调度器、存储管理器、分级文件系统、及其他作为商业性系统基础的系统部件等的样机。
(2)建造操作系统的技术,这些操作系统的例子是UNIX,Multics,Mach,VMS,和MS-DOS 。
(3)建造实用程序库的技术,这些实用程序包括编辑器,文件形成器、编译器、连接器和设备驱动器。
(4)文件和文件系统。
(5)排队网络模型和实际系统性能评估的模拟程序包。
(6)网络结构,如以太网、FDDI 、令牌环网、SNA 和DECNET.
(7)包含在国防部协议集(TCP/IP)中的协议技术、虚拟电路协议、交互式网络(internet)、实时会议和X.25 。
六、软件方法学和工程
软件领域研究满足技术要求、安全、可靠、可信的程序和大型软件系统的设计。
基本问题包括:
在程序和程序设计系统的开发背后的原理是什么?
怎样去证明程序或系统满足它的技术要求?
怎样上给定技术要求,使之不遗漏重要的情况,而且可以分析它的安全性?
怎样使软件系统通过不同阶段不断改进?
怎样使软件设计得易理解和易修改?
1. 理论
软件方法学和工具领域理论的主要部分是:
(1)程序验证和证明。
(2)时态逻辑。
(3)可靠性理论。
(4)谓词演算、公理语义学、和认知心理学等支撑领域。
2. 抽象
软件方法学和工具抽象的主要部分是:
(1)定义技术要求的方法。如谓词变换器、程序设计演算、抽象数据类型和弗洛依德-霍尔(Floyd-Hoare)公理化符号。
(2)方法学,如逐步提炼、模块化设计、模块、分离编译、信息隐藏(information hiding)、数据流和抽象层次。
(3)程序开发自动化的方法。例如,文本编辑程序,面向语法的编辑程序和屏幕编辑程序。
(4)可信计算的方法学;例如,容错,安全性,可靠性,恢复,N版本程序设计,多方式冗余,和检查点插入。
(5)软件工具和程序设计环境。
(6)程序和系统的测度和评估。
(7)软件系统到特定机器结构的匹配问题域。
(8)软件研制的生命周期模型。
3.设计
软件方法学和工具领域殴计和实验的主要内容是:
(1)技术要求描述语言(如PSL2,IMA JO)、构造管理系统(如在Ada APSE)和修改控制系统(如RCS,SCCS)。
(2)指向语法的编辑器、行编辑器、屏幕编辑器和字处理系统。
(3)在软件开发实践中倡导和使用的特定方法,如HDM,及Dijkstra,Jackson,Mills或Yourdon等人倡导的方法。
(4)测试的过程和实践(例如,遍历、手模拟、模块间接口的检查、测试集的程序通路列举和事件跟踪),质量保证和计划管理。
(5)程序开发和查错.剖面分析.文本格式化和数据库操作的软什工具。
(6)像国防部那样的安全计算系统的标准级和验证过程的技术要求。
(7)用户接口的设计。
(8)设计非常人的可靠、容错和可信的系统的方法。
七、数据库和信息检索系统
本领域研究对大量持续的分享的数据集合的组织,使之能够进行有效地查询和刷新。
基本问题包括:
用什么样的模型化概念去表示数据元和他们之间的关系?
怎样把存储、定位、匹配和检索等基本操作组合成有效的事务处理?
这些事务处理怎么与用户有效地交互作用?
怎样把高级查询翻译成高性能的程序?
什么样的机器结构能导致有效的检索和刷新?
怎样保护数据,以抵制非法存取,泄露或破坏?
怎样保护大型数据库不会由于同时刷新而导致不相容?
当数据分散在许多机器中时,怎样使保护和性能二者得以兼顾?
怎样索引和分类正文,以达到有效的检索?
1. 理论
数据库和信息检索系统领域理论的主要部分是:
(1)关系代数和关系演算。
(2)相依性理论。
(3)并发理论、特别是可串行的事务处理、死锁和多复制件的同步更新。
(4)统计推断。
(5)排序和搜索。
(6)性能分析。
(7)作为支持理论的密码学。
2.抽象
数据库和信息检索系统抽象的主要部分是:
(1)表示逻辑结构和数据元之间关系的模型,包括关系模型和实体关系模型。
(2)为快速检索的文件的表示,如索引、树、反演和相联存储。
(3)保证更新时数据库完整性(相容性)的方法,包括多复制件的并发更新。
(4)防止非法泄露或更改以及极小化统计推断的方法。
(5)对不同类型数据库提出询问的语言(例如,超正文、正文、空间的、图形、图象、规则集)。对信息检索系统也类似。
(6)模型,例如超正文,它允许文件包含多级正文.并包括显示、图形和声音。
(7)人的因素和接口。
3.设计
数据库和信息检索系统领域设计的主要内容是:
(1)设计关系、分级、网络和分布式数据库的技术。
(2)设计数据库系统,如INGRES,System R,dBASE III 和DB-2 的技术。
(3)设计信息检索系统,如LEXIS,Osiris和Medline 的技术。
(4)安全数据库系统的设计。
(5)超正文系统,如NIS,NoTeCard,Intermedia,和Xanadu。
(6)把大型数据库录入磁盘存储器的技术。
(7)把大型只读数据库存入光存储媒介的技术,例如CD/ROM和WORMS 。
八、人工智能和机器人学
本领域研究动物和人类(智能)行为模型。
基本的问题包括:
摹本的行为模型是什么和我们怎样建造机器来模拟它们?
由规则赋值、推理、演绎和模式计算所描写的智能可以达到什么程度?
由这些模型模拟行为的机器最终能达到什么性能?
感知的数据应如何编码,使得类似的模式有类似的码字?
驱动码怎样和感知码相联?
学习系统的体系结构如何,以及这些系统如何表示他们对外部世界的知识?
1. 理论
人工智能和机器人学领域理论的主要部分是:
(1)逻辑:即单调的、非单调的和模糊的。
(2)概念相依性。
(3)识别。
(4)自然语言理解的语法的和公理的模型。
(5)机器人运动和机器人用的外部世界模型中的运动学和力学。
(6)结构力学、图论、形式语法、语言学、哲学和心理学等支持领域。
2. 抽象
人工智能和机器人学领域抽象的主要部分是:
(1)知识表示(例如,规则、框架、逻辑)和处理它们的方法(例如,演绎、推理)。
(2)自然语言理解和自然语言表示的模型,包括音素表示、机器翻译。
(3)语音识别和合成、正文到语音的翻译。
(4)推理和学习模型,例如,非必然性、非单调逻辑、贝叶斯推断、信念。
(5)启发式搜索方法、分枝限界法、控制搜索。
(6)模仿生物系统的机器结构,例如,神经网络、连接机制,稀疏分布式存储器。
(7)人类存储模型、自动学习和其他机器人系统元件。
3.设计
人工智能和机器人学领域设计的主要部分包括:
(1)为逻辑程序设计、定理证明和规则赋值的软件系统的设计技术。
(2)小范围专家系统(如Mycin,Xcon)和为在新范围内编程用的专家系统外壳技术。’
(3)逻辑程序设计的实现(如PROLOG)。
(4)自然语言理解系统(如Margie,SHRDLU和选择语义学)。
(5)神经网络和稀疏分布式存储器的实现。
(6)玩跳棋、象棋和其他策略性游戏的程序。
(7)工作语音合成、识别。
(8)工作机器人,静态的和移动的。
九、人机通信
本领域研究人类和机器通过各种类似于人的传感器和电动机进行的有效的信息交换,并研究反映人类的概念化的信息结构。
基本问题包括:
表示对象并自动创造视见画面的有效方法是什么?
接收输入或给出输出的有效方法是什么?
怎样使错误理解及其后的人的差错导致的危险减到最小限度?
怎样用图形和其他工具通过存储在数据集中的信息去理解自然现象?
1.理论
人机通信理论的主要部分是:
(1)二维和高维几何,包括解析几何、投影几何,仿射几何和计算几何。
(2)着色理论。
(3)认知心理学。
(4)傅利叶分析、线性代数、图论,自动机、物理和分析等支撑领域。
2.抽象
人机通信领域抽象的主要部分是;
(1)画面显示算法,包括解决以下问题的方法:光滑化、浓淡渐变(shading)、隐藏线、声线描迹、隐藏面、透明面、阴影、明暗分布、边缘、
着色图、样条表示、透视图、纹理化、防误认、统一性、动画片、画面作为对象的分级表示。
(2)计算机辅助设计(CAD)模型。
(3)实体对象的计算机表示。
(4)图象处理和增强方法。
(5)人机通信,包括为减少人为错误和提高人的生产率而引入的交互方式的心理学研究。
3.设计
人机通信领域设计与实现的主要部分是:
(1)图形算法在各种图形装置上的实现,这些图形装置包括向量和光栅显示和许多硬拷贝装置。
(2)不断增多的模型和现象的实验性的图形算法的设计与实验。
(3)在显示中彩色图的适当使用;在显示和硬拷见装置上彩色的精确重现。
(4)图形标准(如GKS,PIHGS,VDI),图形语言有(如PostScript),和特殊图形包(如化学的MOGLI)。
(5)各种用户接口技术的实现,包括位映象装置上的直接处理和字符装置的屏蔽技术。
(6)为了不同系统和机器之间信息传送的各种标准文件交换格式的实现。
(7)工作CAD系统。
(8)工作图象增强系统(如在从空间探测接收来的画面JPL上)。
12 致谢
许多人对本报告的原稿慷慨地提出了书面意见,虽然无法采纳所有这些意见,但我们在修改原稿时确实考虑了每一条意见。谨对下列各位提出的意见表示感谢。
13 参考文献
[1] Abelson,II..and Sussman,G.Structure and Interpretation of Computer Programs. MIT Press,Cambridge,Mass.,1985
[2]Arden.B..cd. See What Can BeAutomated? Report of the NFS Computer Science and Engineering ResearchStudy(COSERS).MIT Press. Cambridge,Mass.,1980
[3]Denning,P.What is computer science? Am..Sci.73(Jan.Feb.1985)16-19
[4]Flores.F.,and Craves,M.Education(working paper available from Logonet,lnc.,2200 Powell Street,11th.Floor,Emeryville,Calif.94608)
[5]Newell,A.,Perlis,A.,and Simon,H.What is computer science?Sci.157(1967)1373-1374)reprinted in Abacus 4,4(Summer 1987),32)
COMPUTING_AS_A_DISCIPLINE.pdf
[备注]
本文仅作个人学习之用,原文由中科院计算所的闵应骅老师翻译。
14 计算机科学领域另一个分类
计算机科学主要领域
|
|
---|---|
数学基础 |
数理逻辑
· 集合论
· 数论
· 图论
· 类型论
· 范畴论
· 数值分析
· 信息论
|
计算理论 |
自动机
· 可计算性理论
· 计算复杂性理论
· 量子计算
· 数值计算方法
|
算法 和数据结构 |
算法分析
· 算法设计
· 计算几何
|
编程语言 和编译器 |
语法分析器
· 解释器
· 过程化编程
· 面向对象程序编程
· 函数式编程
· 逻辑编程
· 编程范型
|
并发,并行 和分布式 系统 |
多处理器
· 网格计算
· 并发控制
|
软件工程 |
需求分析
· 软件设计
· 程序设计
· 形式化方法
· 软件测试
· 软件开发过程
|
系统架构 |
计算机系统结构
· 微处理器体系结构
· 操作系统
|
电信 与网络 |
路由
· 网络拓扑
· 密码学
|
数据库 |
数据库管理系统
· 关系数据库
· SQL
· 事务处理
· 数据库索引
· 数据挖掘
|
人工智能 |
自动推理
· 计算语言学
· 计算机视觉
· 进化计算
· 专家系统
· 机器学习
· 自然语言处理
· 机器人学
|
计算机图形学 |
可视化
· 计算机动画
· 图像处理
|
人机交互 |
计算机辅助功能
· 用户界面
· 可穿戴计算机
· 普适计算
· 虚拟现实
|
科学计算 |
人工生命
· 生物信息学
· 认知科学
· 计算化学
· 计算神经科学
· 计算物理学
· 数值算法
· 符号计算
|
注释:计算机科学领域也可根据 ACM-1998分类系统进行分类。
|