计算机科学
计算机科学(简体:计算机科学;繁體:電腦科學;英语:Computer Science,有时缩写为CS)是系统性研究信息与计算的理论基础以及它们在计算机系统中如何实现与应用的实用技术的学科。[1][2]它通常被形容为对那些创造、描述以及转换信息的算法处理的系统研究。计算机科学包含很多分支领域;有些强调特定结果的计算,比如计算机图形学;而有些是探讨计算问题的性质,比如计算复杂性理论;还有一些领域专注于怎样实现计算,比如编程语言理论是研究描述计算的方法,而程序设计是应用特定的编程语言解决特定的计算问题,人机交互则是专注于怎样使计算机和计算变得有用、好用,以及随时随地为人所用。
有时公众会误以为计算机科学就是解决计算机问题的事业(比如信息技术),或者只是与使用计算机的经验有关,如玩游戏、上网或者文字处理。其实计算机科学所关注的,不仅仅是去理解实现类似游戏、浏览器这些软件的程序的性质,更要通过现有的知识创造新的程序或者改进已有的程序。[3]
目录
历史
早期计算机科学创建的基础得追溯到最近电子计算机的发明。那些计算固定数值任务的机器,比如算盘,自古希腊时期即已存在。Wilhelm Schickard在1623年设计了世界上第一台机械计算器,但没有完成它的建造。[4] 布莱兹·帕斯卡在1642年设计并且建造了世界上第一台可以工作的机械计算器Pascaline。埃达·洛夫莱斯协助[5] 查尔斯·巴贝奇在维多利亚时代设计了差分机。[6] 1900年左右,打孔机[7] 问世。然而以上这些机器都局限在只能完成单个任务,或者充其量是所有可能任务的子集。
到了20世纪40年代,随着更新更强大的计算机器被发明,术语“计算机”开始用于指代那些机器而不是它们的祖先。[8] 计算机的概念变得更加清晰,它不仅仅用于数学运算,总的来说计算机科学的领域也扩展到了对于计算的研究。20世纪50年代至20世纪60年代早期,计算机科学开始被确立为不同种类的学术学科。[9] 世界上第一个计算机科学学位点由普渡大学在1962年设立。[10] 随着实用计算机的出现,很多计算的应用都以它们自己的方式逐渐转变成了研究的不同领域。
虽然最初很多人并不相信计算机可能成为科学研究的领域,但是随后的50年里也逐渐被学术界认可。[11] IBM公司是那段时期计算机科学革命的参与者之一。在那段探索时期,IBM(International Business Machines的缩写)发布的IBM 704以及之后的IBM 709计算机被广泛使用。“不过,使用IBM电脑工作仍然是一件很沮丧的事情。如果你弄错了一条指令中的一个字母,程序将会崩溃,而你也得从头再来。”[11] 20世纪50年代后期,计算机科学学科还在发展阶段,这种问题在当时是一件很常见的事情。
随着时间的推移,计算机科学技术在可用性和有效性上都有显著提升。现代社会见证了计算机从仅仅由专业人士使用到被广大用户接受的重大转变。最初,计算机非常昂贵,要有效利用它们,某种程度上必须得由专业的计算机操作员来完成。然而,随着计算机变得普及和低廉,已经几乎不需要专人的协助,虽然某些时候援助依旧存在。
主要成就
虽然计算机科学被认定为正式学术学科的历史很短暂,但仍对科学和社会作出了很多基础贡献。包括:
- “数字革命”的开端:信息时代与互联网。[13]
- 对于计算和可计算理论的正式定义,证明了存在计算上不可解及难解型问题。[14]
- 提出程序语言的概念,作为一种使用不同的抽象层次来精确表达处理程序的工具。[15]
- 在密码学领域,恩尼格玛密码机的破译被视为盟军在二战取得胜利的重要因素。[12]
- 科学计算实现了高复杂度处理的实用价值,以及完全使用软件进行实验。同时也实现了对人类思想的深入研究,使得人类基因组计划绘制人类基因成为可能。[13] 还有探索蛋白质折叠的分布式计算项目Folding@home。
- 算法交易增长了金融市场的经济效益与市场流通性,通过人工智能,机器学习及大规模的统计和数值技术。[16]
- 计算机成像广泛用于娱乐,包括电视、电影、广告、动画、电子游戏等。[来源请求]
- 自然语言处理,包括语音到文字(speech-to-text)转换、语言间的自动翻译[来源请求]
- 对各种过程的模拟,包括计算流体力学、物理、电气、电子系统和电路,以及同人类居住地联系在一起的社会和社会形态(尤其是战争游戏,war games)。现代计算机能够对这些设计进行优化,如飞机设计。尤其在电气与电子电路设计中,SPICE软件对新的物理实现(或修改)设计具有很大帮助。它包含了针对集成电路的基本设计软件。[来源请求]
哲学
Peter Wegner提出计算机科学可以分成三个领域:数学、工程学、科学。Amnon H. Eden提议了三种范式应用于计算机科学的各个领域:[17]
- “理性主义范式”,将计算机科学看作是数学的分支,在理论计算机科学中很流行,主要利用演绎推理。
- “技术专家范式”,这类范式有着很明显的工程学倾向,尤其是在软件工程领域。
- “科学范式”,人工智能的某些分支可以作为这类范式的代表(比如说对于人工生命的研究)。
计算机科学的领域
作为一个学科,计算机科学涵盖了从算法的理论研究和计算的极限,到如何通过硬件和软件实现计算系统。[18][19] CSAB(以前被叫做Computing Sciences Accreditation Board),由Association for Computing Machinery(ACM)和IEEE计算机协会(IEEE-CS)的代表组成[20],确立了计算机科学学科的4个主要领域:计算理论,算法与数据结构,编程方法与编程语言,以及计算机组成与架构。CSAB还确立了其它一些重要领域,如软件工程,人工智能,计算机网络与通信,数据库系统,并行计算,分布式计算,人机交互,计算机图形学,操作系统,以及数值和符号计算。
理论计算机科学
广义的理论计算机科学包括经典的计算理论和其它专注于更抽象、逻辑与数学方面的计算。
计算理论
按照Peter J. Denning的说法,计算机科学的最根本问题是“什么能够被有效地自动化?”[21] 计算理论的研究就是专注于回答这个根本问题,关于什么能够被计算,去实施这些计算又需要用到多少资源。为了试图回答第一个问题,递归论检验在多种理论计算模型中哪个计算问题是可解的。而计算复杂性理论则被用于回答第二个问题,研究解决一个不同目的的计算问题的时间与空间消耗。
著名的“P=NP?”问题,千禧年大奖难题之一,[22] 是计算理论的一个开放问题。
P = NP ? | GNITIRW-TERCES | |||
自动机理论 | 递归论 | 计算复杂性理论 | 密码学 | 量子计算论 |
信息与编码理论
算法[编辑]信息论与信息量化相关,由克劳德·香农创建,用于寻找信号处理操作的根本极限,比如压缩数据和可靠的数据存储与通讯。编码理论是对编码以及它们适用的特定应用性质的研究。编码(code)被用于数据压缩,密码学,前向纠错,近期也被用于网络编码。研究编码的目的在于设计更高效、可靠的数据传输方法。
算法分析 | 算法 | 数据结构 | 计算几何 | 图论 |
算法指定义良好的计算过程,它取一个或一组值作为输入,经过一系列定义好的计算过程,得到一个或一组输出。[23]算法是计算机科学研究的一个重要领域,也是许多其他计算机科学技术的基础。算法主要包括数据结构、计算几何、图论等。除此之外,算法还包括许多杂项,如模式匹配、部分数论等。
程序设计语言理论
程序设计语言理论是计算机科学的一个分支,主要处理程序设计语言的设计、实现、分析、描述和分类,以及它们的个体特性。它属于计算机科学学科,既受影响于也影响着数学、软件工程和语言学。它是公认的计算机科学分支,同时也是活跃的研究领域,研究成果被发表在众多学术期刊,计算机科学以及工程出版物。
类型论 | 编译器设计 | 程序设计语言 |
形式化方法
形式化方法是一种特别的基于数学的技术,用于软件和硬件系统的形式规范、开发以及验证。在软件和硬件设计方面,形式化方法的使用动机,如同其它工程学科,是通过适当的数学分析便有助于设计的可靠性和健壮性的期望。但是,使用形式化方法会带来很高的成本,意味着它们通常只用于高可靠性系统,这种系统中安全或保安(security)是最重要的。对于形式化方法的最佳形容是各种理论计算机科学基础种类的应用,特别是计算机逻辑演算,形式语言,自动机理论和形式语义学,此外还有类型系统、代数数据类型,以及软件和硬件规范和验证中的一些问题。
并发,并行和分布式系统
并行性(concurrency)是系统的一种性质,这类系统可以同时执行多个可能互相交互的计算。一些数学模型,如Petri网、进程演算和PRAM模型,被创建以用于通用并发计算。分布式系统将并行性的思想扩展到了多台由网络连接的计算机。同一分布式系统中的计算机拥有自己的私有内存,它们之间经常交换信息以达到一个共同的目的。
数据库和信息检索
数据库是为了更容易地组织、存储和检索大量数据。数据库由数据库管理系统管理,通过数据库模型和查询语言来存储、创建、维护和搜索数据。
应用计算机科学
尽管计算机科学(computer science)的名字里包含计算机这几个字,但实际上计算机科学相当数量的领域都不涉及计算机本身的研究。因此,一些新的名字被提议出来。某些重点大学的院系倾向于术语计算科学(computing science),以精确强调两者之间的不同。丹麦科学家Peter Naur建议使用术语"datalogy",以反映这一事实,即科学学科是围绕着数据和数据处理,而不一定要涉及计算机。第一个使用这个术语的科学机构是哥本哈根大学Datalogy学院,该学院成立于1969年,Peter Naur便是第一任教授。这个术语主要被用于北欧国家。同时,在计算技术发展初期,《ACM通讯》建议了一些针对计算领域从业人员的术语:turingineer,turologist,flow-charts-man,applied meta-mathematician及applied epistemologist。[24] 三个月后在同样的期刊上,comptologist被提出,第二年又变成了hypologist。[25] 术语computics也曾经被提议过。在欧洲大陆,起源于信息(information)和数学或者自动(automatic)的名字比起源于计算机或者计算(computation)更常见,如informatique(法语),Informatik(德语),informatika(斯拉夫语族)。
著名计算机科学家Edsger Dijkstra曾经指出:“计算机科学并不只是关于计算机,就像天文学并不只是关于望远镜一样。”("Computer science is no more about computers than astronomy is about telescopes.")设计、部署计算机和计算机系统通常被认为是非计算机科学学科的领域。例如,研究计算机硬件被看作是计算机工程的一部分,而对于商业计算机系统的研究和部署被称为信息技术或者信息系统。然而,现如今也越来越多地融合了各类计算机相关学科的思想。计算机科学研究也经常与其它学科交叉,比如心理学,认知科学,语言学,数学,物理学,统计学和经济学。
计算机科学被认为比其它科学学科与数学的联系更加密切,一些观察者说计算就是一门数学科学。[21] 早期计算机科学受数学研究成果的影响很大,如Kurt Gödel和Alan Turing,这两个领域在某些学科,例如数理逻辑、范畴论、域理论和代数,也不断有有益的思想交流。
计算机科学和软件工程的关系是一个有争议的话题,随后关于什么是“软件工程”,计算机科学又该如何定义的争论使得情况更加混乱。David Parnas从其它工程和科学学科之间的关系得到启示,宣称计算机科学的主要重点总的来说是研究计算的性质,而软件工程的主要重点是具体的计算设计,以达到实用的目的,这样便构成了两个独立但又互补的学科。[26]
人工智能
这个计算机科学分支旨在创造可以解决计算问题,以及像动物和人类一样思考与交流的人造系统。无论是在理论还是应用上,都要求研究者在多个学科领域具备细致的、综合的专长,比如应用数学,逻辑,符号学,电机工程学,精神哲学,神经生理学和社会智力,用于推动智能研究领域,或者被应用到其它需要计算理解与建模的学科领域,如金融或是物理科学。人工智能领域开始变得正式源于Alan Turing这位人工智能先驱提出了图灵试验,以回答这样一个终极问题:“计算机能够思考吗?”
机器学习 | 计算机视觉 | 图像处理 | 模式识别 |
认知科学 | 数据挖掘 | 进化计算 | 信息检索 |
知识表示 | 自然语言处理 | 机器人科学 |
计算机体系结构与工程
计算机系统结构,或者数字计算机组织,是一个计算机系统的概念设计和根本运作结构。它主要侧重于CPU的内部执行和内存访问地址。这个领域经常涉及计算机工程和电子工程学科,选择和互连硬件组件以创造满足功能、性能和成本目标的计算机。
数字电路 | 微架构 | 多处理机 | |
操作系统 | 计算机网络 | 数据库 | 计算机安全 |
普适计算 | 系统架构 | 编译器设计 | 编程语言 |
计算机图形与视觉
计算机图形学是对于数字视觉内容的研究,涉及图像数据的合成和操作。它跟计算机科学的许多其它领域密切相关,包括计算机视觉、图像处理和计算几何,同时也被大量运用在特效和电子游戏。
计算机安全和密码学
计算机安全是计算机技术的一个分支,其目标包括保护信息免受未经授权的访问、中断和修改,同时为系统的预期用户保持系统的可访问性和可用性。密码学是对于隐藏(加密)和破译(解密)信息的实践与研究。现代密码学主要跟计算机科学相关,很多加密和解密算法都是基于它们的计算复杂性。
计算科学
计算科学(或者科学计算)是关注构建数学模型和量化分析技术的研究领域,同时通过计算机分析和解决科学问题。在实际使用中,它通常是计算机模拟和计算等形式在各个科学学科问题中的应用。
数值分析 | 计算物理学 | 计算化学 | 生物信息学 |
信息科学
信息检索 | 知识表示 | 自然语言处理 | 人机交互 |
本章节需要扩充 (2013年1月) |
软件工程
软件工程是对于设计、实现和修改软件的研究,以确保软件的高质量、适中的价格、可维护性,以及能够快速构建。它是一个系统的软件设计方法,涉及工程实践到软件的应用。
一些教授计算机科学的大学主要进行计算和算法推理的研究。其中包括计算理论、算法分析、形式化方法、并行理论、数据库、计算机图形学以及系统分析等。通常也教授程序设计,但仅仅将它看作是支持计算机科学其它领域的媒介,而不是高级研究的重心。
其它一些学院、大学、中学以及职业培训的计算机科学课程则主要侧重于训练高级编程,而不是算法和计算理论。这些课程着重教授那些对于软件工业很重要的技能。像这样的计算机编程过程通常被叫做软件工程。
然而,尽管计算机科学专业日益推动着美国经济,但是计算机科学教育依然不存在大多数美国K-12课程中。2010年10月由ACM和计算机科学教师协会(CSTA)共同发表了一篇名为“Running on Empty: The Failure to Teach K-12 Computer Science in the Digital Age”的报告,文中揭示了仅有14个州通过了有意义的高中计算机科学教育标准。同时,仅有9个州将高中计算机科学课程算作毕业要求的核心学科。配合“Running on Empty”这篇文章,一个新的无党派宣传联盟:Computing in the Core(CinC)被创建,以影响联邦和政府政策,比如Computer Science Education Act要求政府拨款以制定计划完善计算机科学教育及支持计算机科学教师。
数学基础 | |
---|---|
计算理论 | |
算法和数据结构 | |
编程语言和编译器 | |
并发、并行和分布式系统 | |
软件工程 | |
系统架构 | |
电信与网络 | |
数据库 | |
人工智能 | |
计算机图形学 | |
人机交互 | |
科学计算 | |
注释:计算机科学领域也可根据ACM-1998分类系统进行分类。 |