正式版计算思维导论Word文件下载.docx
《正式版计算思维导论Word文件下载.docx》由会员分享,可在线阅读,更多相关《正式版计算思维导论Word文件下载.docx(33页珍藏版)》请在冰豆网上搜索。
是否正确?
类似的上述问题,促进了计算机科学和计算科学的诞生和发展,促进了人们思考:
◆什么能够被有效地自动计算?
现实世界需要计算的问题是很多的,哪些问题是可以自动计算的,哪些问题是可以在有限时间有限空间内自动计算的?
这就出现了计算及计算复杂性问题。
以现实世界的各种思维模式为启发,寻找求解复杂问题的有效规则,就出现了算法及算法设计与分析问题。
例如观察人的思维模式而提出的遗传算法、观察蚂蚁行动的规律而提出的蚁群算法等。
◆如何低成本、高效地实现自动计算?
如何构建一个高效的计算系统:
计算机器的构建问题和软件系统的构建问题。
◆如何方便有效地利用计算系统进行计算?
利用已有计算系统,面向各行各业的计算问题求解。
什么能、且如何被有效地自动计算问题就是计算学科的科学家不断在研究和解决的问题。
1.2计算机科学与计算科学
一般而言,“计算机科学”是研究计算机和可计算系统的理论方面的学科[1],包括软件、硬件等计算系统的设计和建造,发现并提出新的问题求解策略、新的问题求解算法,在硬件、软件、互联网方面发现并设计使用计算机的新方式和新方法等。
简单而言,计算机科学围绕着“构造各种计算机器”和“应用各种计算机器”进行研究。
当前,计算手段已发展为与理论手段和实验手段并存的科学研究的第三种手段[2]。
理论手段是指以数学学科为代表,以推理和演绎为特征的手段,科学家通过构建分析模型和理论推导进行规律预测和发现。
实验手段是指以物理学科为代表,以实验、观察和总结为特征的手段,科学家通过直接的观察获取数据,对数据进行分析进行规律的发现。
计算手段则是以计算机学科为代表,以设计和构造为特征的手段,科学家通过建立仿真的分析模型和有效的算法,利用计算工具来进行规律预测和发现。
技术进步已经使得现实世界的各种事物都可感知可度量,进而形成数量庞大的数据或数据群,使得基于庞大数据形成仿真系统成为可能,因此依靠计算手段发现和预测规律成为不同学科的科学家进行研究的重要手段。
例如生物学家利用计算手段研究生命体的特性,化学家利用计算手段研究化学反应的机理,建筑学家利用计算手段来研究建筑结构的抗震性,经济学家社会学家利用计算手段研究社会群体网络的各种特性等。
由此计算手段与各学科结合形成了所谓的计算科学,如计算物理学、计算化学、计算生物学、计算经济学等。
著名的计算机科学家、1972年图灵奖得主EdsgerDijkstra[3]说:
“我们所使用的工具影响着我们的思维方式和思维习惯,从而也将深刻地影响着我们的思维能力”。
各学科人员在利用计算手段进行创新研究的同时,也在不断地研究新型的计算手段。
这种结合不同专业的新型计算手段的研究需要专业知识与计算思维的结合,1998年JohnPople便因成功地研究出量子化学综合软件包Gaussian[4]而获得诺贝尔奖,Gaussian已成为研究化学领域许多课题的重要的计算手段。
另一个典型的计算手段如求解应力或疲劳等结构力学、多物理场耦合的有限元分析手段。
以电影《阿凡达》为代表的影视创作平台也在不断利用先进的计算手段(如捕捉虚拟合成扣像手段)创造意想不到的视觉效果。
周以真(JeannetteM.Wing)教授指出计算思维(ComputationalThinking)是运用计算机科学的基础概念去求解问题、设计系统和理解人类行为的一系列思维活动的统称[5]。
它是如同所有人都具备“读、写、算”能力一样,都必须具备的思维能力,计算思维建立在计算过程的能力和限制之上,由人由机器执行。
因此,理解“计算机”的思维,即理解计算系统是如何工作的?
计算系统的功能是如何越来越强大的,以及利用计算机的思维,即理解现实世界的各种事物如何利用计算系统来进行控制和处理,理解计算系统的一些核心概念,培养一些计算思维模式,对于所有学科的人员建立复合型的知识结构,进行各种新型计算手段研究以及基于新型计算手段的学科创新都有重要的意义。
技术与知识是创新的支撑,然而思维是创新的源头。
1.3来自计算机发展史的启示
的回顾,不只是要记住事件及人物,而是要观察技术的发展路线,观察其带给我们的思想性的启示,这对于创新及创新性思维培养是非常有用的!
来自计算工具发展的启示
一般而言,计算与自动计算要解决以下四个问题:
(1)
【数据】的表示;
(2)数据的【存储】及自动存储;
(3)【计算规则】的表示和(4)【计算规则执行】及自动执行。
图1.1计算工具的发展与演变
我们首先看算盘。
算盘上的珠子可以表示和【存储】数,【计算规则】是一套口诀,按照口诀拨动珠子可以进行四则运算。
然而所有的操作都要靠人的大脑和手完成,因此算盘被认为是一种计算辅助工具,不能被归入自动计算工具范畴。
若要进行自动计算,需要由机器来自动执行规则、自动存储和获取数据。
1642年法国科学家帕斯卡(BlaisePascal,1623~1662)发明了著名的帕斯卡机械计算机,首次确立了计算机器的概念。
该机器用齿轮来表示与【存储】十进制各个数位上的【数字】,通过齿轮的比来解决进位问题。
低位的齿轮每转动10圈,高位上的齿轮只转动1圈。
机器可【自动执行】一些【计算规则】,“数”在计算过程中自动存储。
德国数学家莱布尼茨(GottfriedWilhelmLeibniz,1646~1716)随后对此进行了改进,设计了“步进轮”实现了计算规则的自动连续重复的执行。
帕斯卡机的意义:
它告诉人们“用纯机械装置可代替人的思维和记忆”,开辟了自动计算的道路。
1822年,30岁的巴贝奇(C.Babbage)受前人杰卡德()编织机的启迪,花费10年的时间,设计并制作出了差分机。
这台差分机能够按照设计者的旨意,自动处理不同函数的计算过程。
1834年,巴贝奇设计出具有堆栈、运算器、控制器的分析机,英国著名诗人拜伦的独生女阿达.奥古斯塔(AdaAugusta)为分析机编制了人类上第一批程序,即一套可预先变化的有限有序的【计算规则】。
巴贝奇用了50年时间不断研究如何制造差分机,但限于当时科技发展水平,其第二个差分机和分析机均未能制造出来。
在巴贝奇去世70多年之后,MarkⅠ在IBM的实验室制作成功,巴贝奇的夙愿才得以实现。
巴贝奇用一生进行科学探索和研究,这种精神永远地流传了下来。
正是由于前人对机械计算机的不断探索与研究,不断追求计算的机械化、自动化、智能化:
如何能够自动存取数据?
如何能够让机器识别可变化的计算规则并按照规则执行?
如何能够让机器像人一样地思考?
这些问题促进了机械技术和电子技术的结合,最终导致了现代计算机的出现。
现代计算机,在借鉴了前人的机械化自动化思想后,设计了能够理解和执行任意复杂程序的机器,可以进行任意形式的计算,如数学计算、逻辑推理、图形图像变换、数理统计、人工智能与问题求解等,计算机的能力在不断提高之中。
来自元器件发展的启示
自动计算要解决数据的自动存、自动取以及随规则自动变化的问题,如何找到能够满足这种特性的元器件便成为电子时代研究者不断追求的目标。
图1.2元器件的发展与演变
1883年,爱迪生在为电灯泡寻找最佳灯丝材料的时候,发现了一个奇怪的现象:
在真空电灯泡内部碳丝附近安装一截铜丝,结果在碳丝和铜板之间产生了微弱的电流。
1895年,英国的电器工程师弗莱明(J.Fleming)博士对这个“爱迪生效应”进行了深入的研究,最终发明了人类第一只电子管(真空二极管):
一种使电子单向流动的元器件。
1907年,人德福雷斯发明了真空三极管,他的这一发明为他赢得“无线电之父”的称号。
其实,德福雷斯所做的就是在二极管的灯丝和板极之间加了一块栅板,使电子流动可以受到控制,从而使电子管进入到普及和应用阶段。
电子管是可存储和控制二进制数的电子元器件。
在随后几十年中,人们开始用电子管制作自动计算的机器。
标志性的成果是1946年宾夕法尼亚大学的ENIAC,ENIAC[6]是世界上公认的第一台电子计算机。
ENIAC的成功奠定了“二进制”“电子技术”作为计算机核心技术的地位。
然而电子管有很多缺陷,比如体积庞大、可靠性低、功耗大等等,对于如何克服这些问题的思考促使了人们寻找性能比电子管更加优秀的替代品。
1947年,贝尔实验室的肖克莱和巴丁、布拉顿发明了点接触晶体管,两年后肖克莱进一步发明了可以批量生产的结型晶体管(1956年他们三人因为发明晶体管共同获得了诺贝尔奖),1954年德州仪器公司的迪尔发明了制造硅晶体管的方法。
1955年之后,制造晶体管的成本以每年30%的速度下降,到50年代末,这种廉价的器件已经风靡世界,以晶体管为主要器件的计算机也迈入了新的时代。
尽管晶体管代替电子管有很多优点,但还是需要使用电线将各个元件逐个连接起来,对于电路设计人员来说,能够用电线连接起来的单个电子元件的数量不能超过一定的限度。
而当时一台计算机可能就需要25000个晶体管、10万个二极管、成千上万个电阻和电容,其错综复杂的结构使其可靠性大为降低。
如何解决呢?
1958年,费尔柴尔德半导体公司的诺伊斯和德州仪器公司的基尔比提出了集成电路的构想:
在一层保护性的氧化硅薄片下面,用同一种材料(硅)制造晶体管、二极管、电阻、电容,再采用氧化硅绝缘层的平面渗透技术,以及将细小的金属线直接蚀刻在这些薄片表面上的方法把这些元件互相连接起来,这样几千个元件就可以紧密地排列在一小块薄片上。
将成千上万个元件封装成集成电路,自动实现一些复杂的变换,集成电路成为了功能更为强大的元件,人们可以通过连接不同的集成电路,制造自动计算的机器,人类由此进入了微电子时代。
随后人们不断研究集成电路的制造工艺,光刻技术、微刻技术到现在的纳刻技术使得集成电路的规模越来越大,形成了超大规模集成电路。
自那时起,集成电路的发展就像Intel创始人戈登.摩尔(GordonMoore)提出的被称之为摩尔定律[7]一样:
当价格不变时,集成电路上可容纳的晶体管数目,约每隔18个月便会增加一倍,其性能也将提升一倍。
截至2020年,一个超大规模集成电路芯片的晶体管数量可达14亿颗以上。
电子计算机的计算能力应该说已经很强大了,但为什么仍无法达到或者超越人类大脑的计算能力呢?
人类的计算模式又是怎样的呢?
这些问题促进着科学家不断追求新形式的元器件的研究,比如生物体芯片,科学家发现蛋白质具有0/1控制的特性,能否被用于制作芯片呢?
而这种生物芯片在解决一些复杂的计算时是否会有与人一样的计算模式呢?
目前已经取得了很多的成果,这里不予赘述。
来自计算机硬件发展的启示
所谓的计算机硬件是指制造完成后基本不能改变的部件,包括核心的微处理器(又被称为中央处理单元CentralProcessingUnit,简称CPU)、存储设备、输入设备和输出设备。
负责解释和执行程序的部件被称为微处理器,负责存储数据的部件被称为存储设备,负责将外界信息送入计算机系统的部件被称为输入设备,负责将计算机系统内部数据使外界感知的部件被称为输出设备。
图1.3计算机硬件的发展与演变
我们先看输入设备的发展。
如何使外界信息被机器感知呢?
1725年,法国纺织机械师布乔(B.Bouchon)发明了“穿孔纸带”的构想,1805年,法国机械师杰卡德(J.Jacquard)据其完成了“自动提花编织机”的设计制作。
纸带上穿孔为1,无孔为0,有一穿孔机制作纸带,制作好的纸带被机器阅读并识别,实现了以0、1编码的信息的输入;
如何将英文字母直接输入到机器中呢?
1868年,克里斯托夫.肖尔斯(C.Sholes)发明了沿用至今的QWERTY键盘,将英文字母符号按位置排列,当按下不同字母按键时,机器识别出其位置,据位置信息进而识别出输入的是哪一个字母,从而实现了符号输入。
如何实现对由一系列点构成的图形的控制呢?
1968年,恩格巴特(DouglasEnglebart)发明了鼠标,实现了点输入,促进了图形化计算机的发展。
目前各种输入手段不断创新,输入设备层出不求。
例如为实现纸质文档/图象的输入,出现了扫描仪;
为实现人对屏幕上图形的直接控制,出现了基于电阻/电容的触摸感应式输入设备,可以感应手指的接触或压力实现信息的输入;
为使人更方便地输入信息,出现了语音输入设备,自动识别人的语音;
出现了随人眼、手变动的感知输入设备如微软公司推出的Kinect体感设备等,各种各样的感知设备,包括接触式感知,也包括非接触式感知,目前的物联网技术(InternetofThings)目的是使计算机感知现实世界万事万物。
再看输出设备的发展。
如何使机器处理的结果被外界感知呢?
最基本的是通过屏幕显示计算的结果。
1908年,英国CampbellSwinton叙述了电子扫描方法并预示用阴极射线管制造电视,1960年,DEC的PDP-1计算机使用了CRT(阴极射线管,cathoderaytube)式显示器,它利用显像管内的点子枪发出电子光束,打在一个内层玻璃涂满了无数三原色的荧光粉层上,荧光粉层上的布满的三原色点的数目(被称为像素),电子枪周期性的发出电子束,循环激发像素点,会使得荧光粉发光,就显示出了不同颜色的点。
而如何控制电子束的扫描以使其按希望的点的颜色进行显示?
如何提高屏幕显示的清晰度和色彩准确度?
如何使屏幕在计算机的控制下显示希望的图形或符号?
这些问题促进了人们对显示设备的深入研究。
1963年,IvanSutherland研发出了笔迹或向量式的模拟显示器,即第一台使用计算机产生画面的显示器。
上世纪60年代末期,Tektronix公司基于示波器原理研究了字符发生器,这是一种光栅扫描显示器,它有小量的内存,大概可以容纳一个字符,当它扫描映像管的表面时做开关的动作。
1972年,Ramtek开发出了采用帧缓冲技术的数字光栅扫描显示器--一种基于内存的显示器技术。
目前显示设备的研究向数字高清显示器、三维显示器、触控显示器等方向发展。
概括来讲,显示技术的发展趋势为:
分辨率越来越高,颜色越来越逼真,显示速度越来越快(屏幕刷新速度和图形处理速度),体积越来越薄,视觉效果越来越清晰,可视角度越来越接近平角等。
其他类型的输出设备,如打印机等也以类似的思维不断地发展着,在此不再赘述。
接着再看存储设备的发展。
1950年,基于汞在室温时是液体同时又是导体特性,并结合机械与电子技术开发了汞延迟线实现0和1的存储。
1953,利用磁性材料及其磁化翻转特性而实现永久性的存储,发明了磁芯、磁带、磁鼓,进一步IBM于1956年首次实现“温彻斯特(Winchester)”硬盘技术。
1973年,IBM公司研制成功第一片软磁盘。
1983年,IBM推出了IBMPC的改进型号IBMPC/XT,并为其内置了硬盘。
2002年2月26日,西捷公司推出了全球首款SerialATA接口硬盘。
1985,Philips和Sony合作推出CD-ROM光盘驱动器。
1994年,索尼/飞利浦发布了高密度CD碟片(HIGH-DENSITYCD),即现在的DVD-9(DS-SL)和DVD-18(DS-SL)格式碟片的始祖。
1995年,欧、美、日10家制造公司达成协议,DVD光盘将包括视频和音频、只读和可写等全面解决方案。
目前一些新型的存储介质如FlashRAM、MultiMediaCard(MMC)、USBremovabledisk(U-Disk)、固态硬盘、纳米存储(用磁性纳米棒研制量子存储系统)层出不穷。
概括来讲,存储设备的发展趋势为:
体积越来越小,容量越来越大,访问速度越来越快,可靠性越来越高,功耗越来越低,持久性越来越好等。
自1974年Intel推出第一款8位微处理芯片8080及随后推出的16位微处理器8086以来,微处理器便依摩尔定律在发展着。
微处理器是计算机内部执行指令和进行运算的核心部件。
通常有几个指标来衡量微处理器,
(1)字长,字是CPU内部进行数据处理、信息传输等的基本单位,每一个字所包含的二进制位数称为字长。
字长也即一次CPU操作所能处理数据的位数。
微处理器字长从4位,发展为8位、16位、32位和64位。
(2)主频,主频是指CPU每秒钟所能完成操作的次数,也称时钟频率。
微处理器的主频由几MHz发展为几十MHz、几百MHz、几GHz、几十GHz。
(3)功能/规模,早期的微处理器仅仅以定点数运算为基础,当进行浮点数运算时速度较慢,为此开发了单独的协处理器进行浮点元算,一台计算机上安装两个处理器;
随后发展便将微处理器和协处理器集成为一个芯片,形成新的微处理器;
为提高图形的处理速度,又开发了图形处理单元GPU,随后又将图形处理单元与微处理器集成,形成新的多核处理器,再进一步集成了多媒体处理器、3D多媒体处理器,形成了现在的多核处理器,目前Intel公司已开发出了八核、十核及更多核心的处理器,功能规模越来越大。
(4)晶体管数量,正是由于微处理器不断集成更多的处理单元,使其内部集成的晶体管由早期的几万颗发展为几十万颗、几百万颗、几千万颗、几亿颗,目前达到14亿颗以上,当然这一切离不开集成电路的微刻、纳刻制造工艺的发展。
来自计算机软件发展的启示
尽管计算机硬件功能很强,但真正控制计算机运行的还是软件,计算机技术的发展也是伴随着软件技术的发展而发展的。
所谓软件可看作是程序系统或者说程序集合,是计算机系统中与硬件相互依存的另一部分,而所谓程序是可按事先设计好的功能和性能要求进行执行的指令序列。
硬件一旦设计好,其功能就确定了,而其功能的扩展和延伸是通过软件来实现的。
当程序系统稳定后,人们可将固定不变的程序再做成硬件,扩大了硬件功能,进而在新的硬件基础上再设计功能更为强大的软件,如此相互促进,计算机功能越来越强大。
图1.4计算机软件的发展与演变
怎样编写程序和软件呢?
最初人们是以硬件所能直接执行的“指令”编写程序,即用机器语言编写程序。
机器语言是指硬件能够直接识别和执行的语言,包括由0,1编码的指令及其指令的书写规则。
20世纪50年代初期,出现了汇编语言,用若干个英文字母构成的助记符号来表示指令,人们可以用更为容易记忆的字母符号来编写程序,由于不同机器有不同的指令,所以汇编语言是面向机器的语言。
如何使语言不依赖于具体的机器呢?
如何使语言能像自然语言一样进行表达呢?
1951年IBM开始研发高级语言,意在创建一种独立于机器、能在不同的计算机上兼容执行的语言,1956年10月IBM推出了FORTRANⅠ语言,标志着高级语言的诞生。
FORTRAN语言的名称来自formula和translator两个词,意思是公式转换器,它类似自然语言,使用数学公式和英文来表达让机器自动执行的计算规则,但因为是在跟机器交流,所以在语法上要遵循严格的规定,毕竟机器是不能像人那样识别模糊表达的。
为使人更容易理解和编写更复杂的程序,出现了众多的计算机语言,如BASIC语言,全称是Beginner’sAllpurposeSymbolicInstructionCode,意为“初学者通用符号指令代码”,如1960年1月,图灵奖获得者AlanJ.Perlis发表了“演算法语言ALGOL60报告”,推出了程序设计语言ALGOL60,随后不断演化形成了现在广为使用的C语言等。
20世纪80年代及其以前都是使用高级语言如C语言、FORTRAN语言,来开发程序。
用高级语言开发的程序被称为结构化程序,结构化程序是由一个个函数构成的,而函数,又被称作子程序,是由一个个常量和变量等定义的数据结构及由一行行各种表达式和语句所表达的算法构成的,算法是完成问题求解的一系列步骤。
简单而言,结构化程序就是用“函数”来表达数据结构和算法,通过“函数调用”来实现不同程序之间的交互。
结构化程序设计就好比建平房,但也可用建造平房的技术来建造复杂的建筑,如典型的操作系统软件Unix,就是用C语言编写的。
20世纪80年代后期,程序开发方式发生了变化。
如何构造复杂的程序呢?
人们提出了用“对象”和“类”来构造程序。
对象的概念模拟的是现实世界中的各种各样的对象,每个对象具有相对独立的特性(数据和功能),可以独立的运行,如何模拟这种可相互独立运行的对象呢?
此时人们将一个对象相关的若干数据和函数封装起来,形成可执行体,被称为对象,对象的类型被称作“类”,由类产生的一个运行体就是一个“对象”,对象和对象之间通过消息(数据)进行交互,由此实现了人们期待已久的软件体的自动生成,出现了面向对象的程序设计语言,如C++(1983),Java(1995),Visual系列语言(1990)等。
面向对象的程序设计语言极大地提高了人们程序设计的能力,也使人们从“编”程序向“构造”程序转变,使得构造特色的复杂的程序成为可能。
面向对象程序设计好比建高楼,可以更为方便地构造具有特色的相当复杂性的建筑。
典型的Windows图形界面操作系统及基于图形界面的可视化系统都是面向对象程序设计的结果示例。
如何快速地批量化地构造复杂的程序呢?
人们在上世纪90年代后,提出了将若干系统中都经常使用的对象做成“构件”,通过重复使用一些构件来构造程序进而提高软件开发效率的思想。
所谓构件是将若干对象的相对复杂的特性封装起来,而只将其与外部的交互性的特性(被称为接口)暴露给开发者。
进而,开发者只需考虑如何利用接口来利用构件,而无需考虑构件内部的复杂特性。
这样,构件就可以被很多系统所使用。
然而构件和构件如何连接,连接构件的连接件如何制作,如何连接构件使形成的系统具有更好的性能?
这些问题就是软件系统的架构问题。
因此说,此阶段是以“构件”及“软件结构”为单位进行复杂程序的构造。
目前典型的软件架构为J2EE,.Net和CORBA。
软件架构的研究也促进了中间件技术的发展,如BEA公司的WebLogic,IBM公司的WebSphere和开源软件的Tomcat等。
在J2EE架构和中间件的支持下人们又提出了很多具有不同特色的开发框架(Framework),如Spring框架、RubyonRails框架等,极大地提高了批量化构造程序的效率。
构件化系统开发就好比堆积木一样可以批量地、快速地构造更为复杂的建筑。
进入21世纪后,随着互联网技术的深入发展,如何支持一个信息系统可以和外部的任何其他系统进行互联互通成为软件开发的重要问题。
构件之间可以通过构件的接口实现相互调用,但调用的前提是构件双方能够知道对方的接口,已知对方的接口,便可在己方程序中写入调用语句来实现调用。
然而互联网环境,如何能知道对方的接口,如何能够不改变已编写的程序实现和新增系统的交互呢?
人们提出用“服务”与“服务总线”的概念来构造系统。
所谓服务是将构件的接口重新按公共标准接口进行封装,可以随时接入到服务总线上。
任何一个系统都可通过服务总线发现该服务,也可在服务总线的支持下调用该服务。
通过服务总线可实现任何两个信息系统之间的互联互通。
目前出现的面向服务的体系结构(Servi