Map of Computer Science

From: Dominic Walliman / 原理

image Source: Dominic Walliman

我们通过计算机来拓展我们自己的大脑。最开始计算机被用来解决和算数有关的问题,但其自身的价值很快地延伸到了各个领域。像是运行互联网络,处理实时图像,制造人工智能,以及模拟整个宇宙等等。而其神奇的地方就在于这一切强大功能的背后,竟然仅是 0 和 1 的来回变化。

计算机正以无法置信的速度变小变快。现在手机的计算能力已经超过了60年代超级计算机计算能力的总和。当年阿波罗11号的整个登月系统如今甚至只需要在两个任天堂就能完成。计算机科学总的来说就是研究计算机能做什么。计算机科学如今已经扩展出了很多相互关联的分支,但我仍然把整个学科分成三个部分:计算机理论计算机工程,以及计算机应用

计算机理论

讲到计算机理论。我们得从计算机之父,创造了图灵机(Turing Machine)的阿伦·图灵讲起。图灵在一篇名为《论可计算机器判定问题的应用》一文中首次定义了“有限次运算”并提出了图灵机的原型。图灵机是一个对现在通用计算机的一个简单的描述,而并非一个实体的机器。之后的科学家们提出了很多计算机模型,但这些模型的根本都是图灵机。所以说图灵机也是现代计算机的理论基础。

图灵机由几个部分组成,一个写有符号的无限长的带子,一个可以在带子上读写的读写头,一个储存当前状态的状态寄存器,以及一串命令。在如今的电脑上,带子就是现在的内存(当然不再是无限大的),读写头就是现在的处理器(CPU)。命令串被存在电脑的内存里。虽然图灵机是一个简单的描述,但也却是对电脑设计的一个非常全面的描述。现在的计算机当然由更多部分组成,例如硬盘,键盘,音响,显卡,屏幕等等,但其运行原理皆在图灵机概念的之内。

图灵通过对机器的描述为计算机的发展奠定了基础。然而与此同时,我们更加不能忘了另外一位与图灵密切相关的计算机科学家,他的博士导师——阿隆佐.丘奇。丘奇发明了lambda算子,通过整套严谨的数学理论描述出了计算机运算的概念。所有能用图灵机解决的问题都能用lambda算子进行等价的计算。如果图灵机的思想代表了算法和机器的原型,那么lambda算子则是现在所有的编程逻辑和语言的基础

正如最开始说到的,在计算机理论中最基础的问题就是计算机是万能的吗?如果不是,它能做或不能做什么呢。这个问题直接在计算机理论这个分支中延伸出了一个领域——可计算性理论(Computability Theory)。可计算性理论是一个用来确定哪些问题能够用图灵机进行计算并得出最终结果的学科。有些问题是本身是不可能用计算机得出结果的,其中最著名的代表就是停机问题。总结来说,停机问题代表着一些无法确定计算机程序是否会无限运行的问题。图灵却巧妙地运用了自洽的概念证明了只要没有跳出图灵机的范畴,计算机都不是全能的。有些问题穷计算机的一生也是无法得到解决的。

在可以用计算机解决的问题中,也有很多问题需要花太长的时间来解决(甚至可能超过宇宙能存在的时间)。基于此,计算复杂度(Computational Complexity)理论便成为了计算机理论中另外一个重要的组成部分。复杂度理论基于解决一个问题所需时间随问题输入增大而增大的程度,将问题分类成P类问题(例如将数列从小到大排序),NP类问题(例如在指定城市内寻找一条能遍历所有城市且总路程小于N的路线)等等。虽然现实中有很多问题在理论上是不可以被解决的,但计算机科学家们可以通过一些技巧上的简化来得出大概的答案,然而没人可以确定这些答案是否是最佳答案。正如上述NP问题中我们能在多项式级时间内找到遍历所有城市且总路程小于N的路线,但却不能在多项式级时间内找到最短的路程。

计算机理论这一分支也包含了对算法(Alogorithm)和信息理论的研究。算法是独立于所有的编程语言以及计算机硬件的解决问题的套路。算法是创建程序的基础,很多计算机科学家都致力于通过研究算法而找到解决问题的最优解。比如不同的算法可能可以解决同样的问题并得到相同的结果,像是将杂乱无章的数字从小到大排序。但有些算法却比另一些更加快速有效。而这些都属于算法复杂度这一领域。

信息理论(Information Theory)通过研究信息的性质,研究信息如何被接受,储存,以及传播。例如如何在保留大多数甚至所有信息的基础上压缩信息,使得我们能用更少的内存来储存这些信息。编码理论(Coding Theory)和加密理论(Encryption Theory)也是信息理论中非常重要的一个部分。这两个理论使用复杂的数学作为辅助,将传输的信息进行重新的加密,使得信息在网络传输中的安全性得到了大大的增加。

以上就是计算机理论分支中非常重要的部分。当然除此之外,还有很多其他组成部分,包括逻辑学图形学计算几何学自动机理论量子计算并行处理数据结构等。

计算机工程

计算机科学的第二个大的分支是计算机工程。设计计算机是一个很大的挑战,因为要考虑到从底层硬件到上层软件很多不同的方面。设计者必须保证计算机能够以尽量优化的方式解决尽量多的问题。处理器(CPU)是计算机的中心,计算机执行的所有任务都经过处理器,并通过其进行调度。在单个处理器处理多个任务的时候,处理器需要在每项任务中来回执行,所有任务都能在用户可接受的时间里完成。

任务的调度(Scheduling)是一个复杂的过程,由处理器中的调度器完成。调度器决定什么时候执行什么任务,并尝试用最优化的方式调度所有任务。在这种情况下,使用多核处理多个任务可以提升计算机执行的速度,因为每个任务现在可以由一个单独的核执行。但与此同时多核执行也使得调度器的设计更加复杂。而这些设计都隶属于体系结构(Computer Architecture)的研究范畴。不同的体系结构适合完成不同的任务。处理器(CPU)适合执行通用程序例如我们所用的操作系统。图像处理器(GPU)适合图像处理,例如我们玩的高画质的游戏,而现场可编程门阵列(FPGA)适合高速执行一些范畴非常狭窄的任务,比如挖比特币等。

软件机编程语言(Software and Programming Languages)也是组成计算机工程的重要部分。在硬件之上有以各种编程语言写成的软件层。从底层的汇编语言到高层的Java语言,编程语言是程序员给计算机下达命令的语言,并以不同的语法特征编写不同特性的任务。例如我们汇编语言编写计算机底层的执行,用Java来编写网页应用。可想而知,越底层的编程语言越贴近计算机本身的结构,但越难让人们理解。然而无论多高层或底层的语言,最终都会被转化成处理器能执行的二进制码。这个转换机制由编译器通过一个或多个步骤完成。每个编程语言都会有它自己的编译器以便将程序翻译为可执行的二进制码并进行优化。编译器和编程语言的设计在计算机里非常重要,因为这些设计必须既简单适用,又灵活多变,使得程序员能够容易的将他们疯狂的想法付诸实践。

操作系统(Operating System)是计算机系统中最重要的软件,也是用户和计算机打交道必须通过的介质。操作系统在接受用户指令的同时控制着所有计算机的硬件。因此设计制造一款好的操作系统是一个很大的挑战。所以软件工程(Software Engineering)也因此成为了计算机工程分支的重要组成部分。软件工程师们通过设计软件,新的操作系统或和现有操作系统互动来告诉计算机在什么时候做什么。设计软件是一门艺术,需要工程师们将极富创造性的思维通过特定的编程语言转化成严谨的逻辑程序,并使得转化后的逻辑程序能够有效快速的在计算机上运行。因此,软件工程作为一项独立的学科也有很多设计思想和哲学供程序员们学习、使用以及研究。

当然,计算机工程还包含了许多其他的组成部分,例如实现多台计算机大规模协作的网络(例如淘宝的服务器),大数据存储(例如谷歌脸书中需要储存的个人信息),机器性能研究(例如编写大型软件作为测试计算机性能的基准)以及计算机图像处理(例如简单的美图秀秀)等。

计算机应用

接下来讲讲计算机科学的第三个分支——计算机应用。这个分支旨在使用计算机来解决现实生活中的各种问题。当你出门旅游的时候你希望找到最大的旅游性价比,这就涉及到了使用计算机解决最优解(Optimisation)的问题。最优解问题自古以来也是生意场上最重要的部分之一,因为正确的解答该问题能为公司省下巨额的资金。然而最优解的问题有时可能无法用计算机有效地得到答案,例如上述提到的在所有城市中找到能遍历所有且最短的一条路程。于是有些人开始指望新的科技(例如人工智能或量子计算机),看他们是否能够为这类问题的解决带来转机。

人工智能(Artificial Intelligence)在计算机应用这个分支中占有举足轻重的地位。计算机拓展了我们的大脑,数倍地提高了我们的认知能力。前沿的人工智能研究正试图让机器像人类一样思考。人工智能的研究有很多部分组成,其中发展最迅速的当属机器学习(Machine Learning),让机器通过事先定下的算法,以大数据为输入进行学习,最终达到能准确分辨实物或作出决定的目的。这里最成功的例子当属谷歌AlphaGo接连大败围棋冠军的事情。除此之外机器学习也分成有监督(通过现有的样本对未知的数据分类),无监督(没有任何样本,单从数据中的某一特性将数据分类)与增强学习(例如训练之前很有名的一款小游戏flappy bird 中的小鸟。如果小鸟撞到柱子了,那就获得-1的回报,否则获得0回报。通过这样的若干次训练,我们最终可以得到一只飞行技能高超的小鸟,知道在什么情况下采取什么动作来躲避柱子)三种。除此之外,计算机视觉(Computer Vision)和自然语言处理(Natural Language Processing)也是人工智能中很重要的组成部分。计算机视觉希望通过图像处理让计算机能和人类一样分辨事物。自然语言处理则旨在让计算机和人类能够通过人类的语言进行交流,或以文字为输入进行对文字的分析。

机器学习的成功大大受益于大数据(Big Data)的发展。于是大数据的研究也成为了计算机应用分支中很重要的领域。大数据的研究旨在总庞大的数据中找出有价值的信息。物联网(Internet of Things)更进一步为大数据的研究添砖加瓦,通过连接各种物体提供更庞大的数据。黑客(Hacking)技术不是一个正统的学术界领域,但在此也非常值得一提。黑客利用计算机系统及网络中的漏洞在不被别人发现的情况下在他人计算机系统中窃取他们所需要的信息,例如最近刚发生的针对windows操作系统漏洞的攻击。即便是如今的技术,对这些黑客的攻击也只能是一筹莫展。

除了上述的领域,计算机应用这一分支也利用计算机来研究科学问题,例如物理学神经学。这个领域通常使用超级计算机来解决大规模的模拟(Simulation)问题。与此同时计算机应用还包括人机交互(Human Computer Interaction)的研究,旨在设计让用户更加轻松使用的计算机系统。同时,虚拟现实(Virtual Reality,例如戴在头上的VR眼镜),增强现实(Augmented Reality,例如之前很流行的一款pokemon go 的游戏)以及混合现实(Mixed Reality, 例如用手机扫描实体书的时候能看到网上的书评)的研究将虚拟和现实世界渐渐联系在一起。机器人(Robotics)的研究也将机器在形态和运动方式上和人更加相似。