计算机科学概述

我们知道的历史比较悠久的学科有数学,哲学,物理学,二十世纪五六十年代随着计算机的发展产生了一门新的学科:计算机科学。

简单的说计算机科学就是研究与计算机相关的内容,我们可以把计算机科学研究的内容分为两大类:系统领域和应用领域。系统领域覆盖那些与硬件和软件构成直接相关的领域。如计算机体系结构,计算机网络,操作系统,算法,程序设计语言和软件工程。应用领域覆盖了与计算机使用相关的领域,如数据库和人工智能。我们采用广度优先的方式对这些领域做一下简单介绍。

体系结构

布尔代数为数字电路提供了数学基础,没有它就没有数字电路,也就不会有计算机,布尔代数是1847年由英国数学家乔治·布尔发明的,传统数学的运算都是加减乘除操作,而布尔代数上的运算被称为AND(与)、OR(或)和NOT(非)。

运算数字就是0和1,0代表假,1代表真,0 AND 0 = 0,0 OR 1 = 1。

此后布尔代数沉睡多年,直到1938年21岁的香农在他的硕士论文《A Symbolic Analysis of Relay and Switching Circuits》(继电器与开关电路的符号分析)中指出电子工程师可以用布尔代数的理论来设计电路,把布尔代数的“真”与“假”和电路系统的“开”与“关”对应起来,并用1和0表示。

看上图的电路,用1代表开关闭合,0代表开关断开,1代表灯亮,0代表灯灭,图1的串联电路正是布尔代数里与操作,图2的并联电路正是或操作,根据简单的与或非操作可以组合成图3或其他更复杂的电路。

布尔代数从此找到了用武之地,香农的论文也成了数字电路的理论基础,电子工程师根据香农的理论制造出了与门/或门/与非门/异或门等组成数字电路和计算机电路的基本单元,从这里也可以看出为什么计算机使用二进制。

香农的伟大之处远不至此,1948年香农发表了《A Mathematical Theory of Communication 》(通讯的数学原理)的论文,创造了信息论,奠定了通信原理的理论基础,他提出将一切信号都用0和1进行编码,没有香农的理论就没有现在的图片压缩,文件压缩,高清电影或数字通信。

1948年还有项重要发明-晶体管,晶体管终结了电子管,大大缩小了计算机的体积和开支,晶体管和信息论都诞生于贝尔实验室。

香农的理论指出了用布尔代数来设计数字电路,但并没有说明计算机应该设计成什么样子,1936年,年仅24岁的图灵发表一篇题为《On Computable Numbers, with an Application to the Entscheidungsproblem》(论数字计算在决断难题中的应用)的论文,论文中提出一种计算装置,后被称为“图灵机”,图灵机是一种抽象计算模型,即将人们使用纸笔进行数学运算的过程进行抽象,由一个虚拟的机器替代人们进行数学运算。

上图就是图灵机的概念图,它有一条无限长的纸带作为存储设备,纸带上有一个个方格,每个方格可以存储一个符号,有一个机器头在纸带上移来移去。机器头有一组内部状态,还有一些固定的程序。在每个时刻,机器头都要从当前纸带上读入一个符号,然后结合自己的内部状态查找程序表,根据程序输出信息到纸带方格上,并转换自己的内部状态,然后进行移动。

图灵机提出了程序的概念,相同的输入不同的程序会有不同的输出结果,相同的程序不同的输入也会有不同的输出,通过图灵机图灵向大家展示了一种用机器进行计算的简单方法,并且说明了任意复杂的计算都能用图灵机一个个简单的操作完成,从而从理论上证明了使用机器做复杂运算的可能性,直接给计算机的实现提供了理论基础。

1946年,冯诺依曼在香农和图灵的理论基础之上提出了冯.诺依曼计算机体系结构,并制造出世界上第一台通用计算机“ENIAC”。

冯·诺依曼对图灵机模型进行了改进,提出存储程序原理,程序和数据有相同的逻辑都是二进制数,所以他把程序本身也当作数据来对待,程序和该程序处理的数据用同样的方式存储,冯.诺依曼体系结构是现代计算机的基础,现在大多计算机仍是冯.诺依曼计算机的组织结构,只是作了一些改进而已。

冯诺依曼体系结构主要由五大部件组成:存储器,运算器,控制器,输入设备,输出设备(如上图)

存储器用来存放数据和程序,运算器主要运行算数运算和逻辑运算,并将中间结果暂存到寄存器中,控制器主要用来控制和指挥程序和数据的输入运行,以及处理运算结果,输入设备用来将人们熟悉的信息形式转换为机器能够识别的信息形式,常见的有键盘,鼠标等,输出设备可以将机器运算结果转换为人们熟悉的信息形式,如打印机输出,显示器输出等。

计算机的每条程序指令使用一个指令周期,如一个程序有5条指令,就有5个指令周期,每个周期通常有3个步骤组成:取指,译码,执行。

我们结合下图和1+1=2的例子简单描述下计算机的工作方式:

周期1:PC指向程序的第一条指令,他在内存单元(00)中,控制单元取出(00)中的指令,放入IR中,PC的值加1,控制单元译码指令的内容为R0<--M40,然后控制单元执行指令把内存单元(40)中的数字1装入寄存器R0中。

周期2:PC指向程序的第二条指令,他在内存单元(01)中,控制单元取出(01)中的指令,放入IR中,PC的值加1,控制单元译码指令的内容为R1<--M41,然后控制单元执行指令把内存单元(41)中的数字1装入寄存器R1中。

周期3:PC指向程序的第三条指令,他在内存单元(02)中,控制单元取出(02)中的指令,放入IR中,PC的值加1,控制单元译码指令的内容为R2<--R0+R1,然后控制单元执行指令调用运算器ALU把R0的内容加上R1的内容,结果放在R2中。

周期4:PC指向程序的第四条指令,他在内存单元(03)中,控制单元取出(03)中的指令,放入IR中,PC的值加1,控制单元译码指令的内容为M42<--R2,然后控制单元执行指令把R2的数字2存储到内存单元(42)中

周期5:PC指向程序的第五条指令,他在内存单元(04)中,控制单元取出(04)中的指令,放入IR中,PC的值加1,控制单元译码指令的内容为Halt,然后控制单元执行指令停止计算机。

算法

程序=算法+数据结构,算法是分步骤解决问题或完成任务的的方法,它接受一组输入数据并在有限时间内获得所要求的输出,

程序就是把算法用机器兼容的形式表示出来,程序的执行过程就是执行该程序所表示的算法,算法的实现常常需要用到数据结构,讲算法的书会讲到数据结构,讲数据结构的书会讲到算法,可以把数据结构当做算法的一部分。

算法的优劣可以用时间复杂度和空间复杂度来衡量,即算法运行的时间和占用的内存空间,同一个问题可用不同的算法解决,而一个算法的优劣将影响到算法乃至程序的效率。

举个例子:假如我心中想了一个数字(98),这个数字在1到100之间,大家猜这个数字是几?如果用顺序查找的方法从1到100一个个试平均需要对比100次,如果是1到100w之间的数字就要对比100w次,时间复杂度是O(n),这个时间自然是无法接受的。我们也可以用二分查找的方法,这样折半猜,是50吗?如果不是是小于50还是大于50,如果大于50再折半猜是不是75,如果大于75再折半猜是否是97,如果大于97在折半是否是98,这样平均查找次数是7次,因为2^7=128,如果是100w平均只需要查找20次,因为2^20=100w,时间复杂度是O(log2n)。由此可以看出算法对程序效益的影响是巨大的。

常见的算法有查找,排序,加密,图算法,字符串查找等

计算机设计的目的就是用机器代替人类运行算法以便快速的输出结果,算法是计算机最基础的概念,对算法的研究是计算机科学的核心。

程序设计语言

计算机的数据采用二进制表示,所以计算机能执行的程序就是类似000001111010这样的二进制数字,被称为机器语言,早期的程序设计就使用的机器语言,用机器语言编程是一件十分枯燥繁琐的工作,编写程序花费的时间往往是实际运行时间的几十倍或几百倍,而且编出的程序全是些0和1的指令代码,直观性差,容易出错,并且调试困难,用机器语言无法编写大型的程序。
然后就有了汇编语言,汇编语言采用助记符的形式,一条机器指令与一条方便记忆的汇编符号对应,然后通过一个叫汇编器的工具把汇编语言翻译成机器能识别的机器指令,
汇编语言虽然有很大的改进,但依然有很大的缺点,没有可移植性,难看懂程序表示的算法,开发依然很复杂,就像建筑师设计房子用钉子,木板,砖这些零部件做工具,而不是门,房间和窗户。
于是后来又出现了高级语言,与低级语言相对,它是以人类的日常语言为基础的一种编程语言,如常用的c/c++/java/python这些高级语言都用的英文表示,高级语言更接近人类的思维,这样可以更方便地表示数据的运算和程序的控制结构,能更好的描述各种算法,而且更容易学习掌握,有了高级语言程序员就可以把注意力放在算法和程序逻辑的设计上,而不必关注机器复杂繁琐的执行细节,就好像建筑师可以把注意力放在房屋的风格美观设计上,而不必去关注门的制造细节。
计算机能执行的最终还是机器语言,这样就需要一个叫做编译器的工具把高级语言翻译成机器语言,用高级语言编程方便了,编译器的工作就复杂了,编写优秀的编译器不仅需要熟悉编译理论,还需要熟悉汇编,熟悉各种CPU的体系结构,熟悉CPU众多的指令集,早期的编译器开发异常艰难,经过几十年的发展编译理论和编译器设计才趋向成熟。

操作系统

现代的计算机是一个复杂的系统,由处理器,内存,硬盘,键盘,鼠标,显示器,打印机,网络接口及其他输入输出设备组成,每个设备的管理和优化也十分复杂,如果要使用这些设备进行输入输出就需要编写程序去驱动这些设备,这样就需要熟悉每个设备的操作细节,如果每个程序员都要熟悉众多设备的操作细节,编程将十分困难,严重影响程序员的开发效率,于是就有了操作系统。
操作系统是一个系统软件,它作为计算机设备和程序员的一个接口,对设备的管理操作都交给操作系统来处理,程序员通过调用操作系统提供的接口就可以方便地对计算机硬件和软件资源进行访问,不用去了解每个设备的细节,大大提高了开发效率。


一般操作系统都包含以下功能:
进程管理:操作系统创造进程的概念,一个cpu只能执行一个程序,一台计算机cpu的数量有限,我们却能同时看电影,听音乐,浏览网页/文档,这就是操作系统进程管理的结果,操作系统给每个程序分配一定的执行时间,到时间后就切换到另一个程序去执行,这个时间往往很短,这样就达到了多个程序同时运行的效果。
内存管理:程序员总是希望系统给他无限量和无限速的内存空间,借助操作系统虚拟内存的功能,一个程序可以分配32G或更大的内存而不管实际物理内存大小。每个程序的代码和数据都存储在内存的不同位置,操作系统还要保证一个程序不会非法访问和修改另一个程序的数据,并且在程序不使用时释放该程序占用的内存。
文件管理:磁盘上的数据都是二进制的,操作系统实现文件系统的概念,把磁盘上的数据以文件和文件夹的形式呈现,简化了对磁盘上数据的操作。
设备管理:提供对硬件设备的管理和优化功能,使程序可以更方便使用硬件,保证一个设备同时只能被一个程序使用,不然打印机会出现打印一半程序A的内容又打印了一半程序B的内容。
用户界面:提供用户与系统交互的窗口,接收用户的输入传给操作系统,并将操作系统结果显示出来。

计算机网络

目前世界上计算机的数量达到了几十亿台,它们通过因特网相互连接起来,组成了一张巨大的通信网络,因特网的框图如下:


骨干网和供应商网络叫做网络服务供应商(ISP),骨干网面向国际,供应商网络面向国内或地域,客户网络向供应商付费获取网络服务,客户网包括企业网,校园网,个人PC网络等。
只将计算机连接在一起不会发生任何事情,设备之间通信需要软件和硬件的相互协作,因特网通过tcp/ip协议进行通信,协议规定了设备间通信应该遵守的规则。


tcp/ip协议分为应用层,传输层,网络层,链路层,物理层,每一层都有各自的作用,就像寄快递一样,客户负责把快递送到快递员手里,快递员负责把快递送到运输员手里,运输员负责运送货物,到达另一个城市后,运输员再把快递交到快递员手里,快递员再把快递送给收件人,各司其职完成通信工作。
以前网络内容并没有这么丰富,可以浏览网页,观看视频,播放音乐,以前只能简单的传递信息。
后来出现了万维网,它把世界各地存储在计算机上的文档通过网页链接起来,形成错综复杂的信息网,用户点链接就可以检索到链接的网页内容,万维网主要通过URL,http协议,客户端浏览器和Web服务器运作起来,Web服务器存放世界各地的文档信息,浏览器通过URL访问Web服务器上指定的文档,http协议则定义了怎样编写客户端和服务端程序,以便正确便捷的从网络中检索文档。

数据库

数据库即用来存储数据的仓库,数据库设计的目的就是让用户可以简单高效的检索提取数据。
数据可以存在文本中,例如音乐网站,可以按音乐名-歌手名-音乐类型-年份这个的格式存储,显示的时候就直接读取文本显示出来,但如果我想显示指定歌手的歌曲,或指定年份的歌曲,这个查找过程就十分麻烦和低效了,
借助数据库我们可以轻松的达到这些需求,可以按歌手,音乐类型检索歌曲,可以快速查询某年或小于某年的歌曲,
数据模型是数据库的核心,他描述了数据是按照什么样的格式存储的,数据之间是怎样产生联系的,关系模型是目前最常用的数据库设计模型,
它采用表来存储数据,不同的表之间产生联系,关系模型的理论基础是关系代数,主要包括选择,投影,连接等操作,关系数据库把关系代数对数字的操作运用到对表的操作上面。

软件工程

软件工程主要研究大型复杂软件系统的开发原则,解决大型软件开发中可能遇到的问题,大型软件开发过程中遇到的问题可能比编写小程序复杂的多,比如开发大型系统的时候需要许多人工作很长时间,在此期间预期的需求可能会变化,参与开发的人员也可能会变动等,软件工程的目标就是解决这些问题,保证在给定成本、进度的前提下,开发出具有可修改性、有效性、可靠性、可理解性、可维护性、可重用性、可适应性、可移植性、可追踪性和可互操作性并且满足用户需求的软件产品。

人工智能/图形学

人工智能(Artificical Intelligence)使用计算机来模拟人的思维过程和智能行为(如学习、推理、思考、规划等),人工智能应用广泛,如语音识别,机器翻译,人脸识别,机器博弈,智能汽车等。

计算机视觉(Computer Vision)是人工智能的一个分支,输入的是相机拍摄的图片或视频文件,输出的是计算机对图像的理解,如人脸识别,花朵/汽车的识别等。

计算机图形学(Computer Graphics)输入的是对图像的描述,如一个圆形的圆心坐标,半径,圆的颜色,输出的是图像即二维像素数组,应用的领域有游戏制作,电影特效制作等。

数字图像处理(Digital Image Processing)输入的是图像,输出的也是图像,典型应用就是Photoshop里的图像处理,想要开发一款像Photoshop这样的软件就要学习数字图像处理了。

这几个领域有一个共同特点就是对数学知识要求比较搞,如高等数学,线性代数,概率论与数理统计。

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值