计算机导论课后总结(第十五周)

这周的计算机导论学习的内容比较多,以下就与我们目前的学习安排联系最密切的程序设计语言及编程模式、数据结构与算法等内容来作相关总结。

程序设计语言及编程模式

机器语言:我们知道,计算机处理信息的机制是基于二进制的,它只“认识”“0”和“1”,即计算机只能识别和接受由0和1组成的指令。这些指令的集合就是该计算机的机器语言。显然,将人们想要传递给机器的指令转换为二进制信息,即使用机器语言,有许多缺点:难学、难写、难记、难检查、难修改,难以推广使用。在这种情况下,只有少数极少数的计算机专业人员会直接编写机器语言。

汇编语言:直接使用机器语言编写程序很不方便,有没有一种方法让我们的指令不必直接使用二进制的方式输入给机器呢?仔细一想,这是不是和我们的“翻译”这一职业有点相像?那么,自然地,我们就是要寻找这样一个“中间人”,我们可以不必直接使用二进制指令来和它交流,而只使用较为易懂的“类人类语言”即可,这个“中间人”再把我们输入的指令转换为二进制的信息传递给机器底层。由此,汇编语言诞生了。如图为汇编语言示例:
计算机导论课后总结(第十五周)_第1张图片
它采用助记符来编写程序,是机器语言的符号化,也即:用指令助记符代替指令的二进制操作码;用符号代替二进制的地址码。可以看出,汇编语言的代码已经脱离了“0”和“1”的束缚,相比机器语言显得更加灵活、更易编写和使用。不过由于汇编语言还只是向机器语言一样,是面向硬件的语言,使用起来比较繁琐,但是这种“翻译”、“中间人”的思想,却为后来的高级语言的产生作了必要的铺垫。

高级语言:具象化来讲,就是我们最常接触到的,能够使我们比较轻松地和机器打交道的,给它指令并令其完成我们下达的任务的编程语言,如C、JAVA、Python等等。这些语言,就有着很友好的人机交互,我们不必关心底层的机器语言如何实现,而只需在高层使用我们更为熟悉的“类人类语言”来描述我们希望机器要做的事情,极大地提高了人机交互的效率。回到上面提到的“翻译”的概念,从某种意义上来说,一个编程语言的“翻译”能力,即帮助我们提高人与机器的沟通效率的能力,也在一定程度上影响着这门语言的生命力,特别是在这样一个以“快”为特征的时代。近年来Python语言的迅猛发展,除了由于其在算法、机器学习、人工智能等领域的独特的优越性之外,和其语法清晰简单、容易上手的特点也是分不开的,据悉,一些学校的非计算机专业已经陆续将C或JAVA编程课替换成了Python……我们似乎可以预见,编程语言的发展要注重其简单实用、简明易懂的特性,已经逐渐成为了一个大的趋势。

编程模式:可分为面向过程编程、面向对象编程、函数式编程、说明式编程等模式。以下讨论面向过程的编程和面向对象的编程之间的一些区别。
我听过这样一个对比,用面向过程的方法写出来的程序是一份蛋炒饭,而用面向对象写出来的程序则是一份盖浇饭,我们抛开色香味等这些美食层面上的差异,用程序设计模式的观点来看,蛋炒饭和盖浇饭最大的区别就在于,前者制作时是“做完一步再做下一步”,在这个过程中,米和蛋是一起炒的;而后者则更像是同时开工,炒菜归炒菜,米饭归米饭,将它们分开完成,最后再合在一起完成一个完整的盖浇饭。后者相较于前者的区别在哪里呢?不妨设想,我们在做这两道菜时,不小心使用了不合格的米饭,这时候,蛋炒饭是没法补救了,而盖浇饭完全可以把米饭换掉,再将并没有出问题的菜重新浇盖到新的米饭上即可。如此看来,面向对象编程相较于面向过程编程,就显现出优势了。现今,时代发展太快,我们的程序不可能一贯而终,如果使用面向过程的模式来写程序,若程序内部的某个小模块不再适合新的使用环境或条件、或继续使用它将导致巨大的维护成本了,整个程序就得推倒重来;而使用面向过程的程序设计模式,则可以针对于出问题的模块,只对其进行修改而不会牵涉到程序的其他部分的修改,就可以极大地减轻工作量,并减少了程序维护的成本。综上,在科学技术日新月异的今天,面向过程的编程模式显然不再适用,面向对象的编程将慢慢将其取代。

数据结构与算法

什么是数据结构?一般认为,一个数据结构是由数据元素依据某种逻辑联系组织起来的。那什么是逻辑联系?由离散数学的知识,不同元素之间的关系可以简单概括为集合、线性结构、树形结构和图状结构。这里由于集合中的任意两个元素之间不存在逻辑关系,故而在数据结构中,我们一般只考虑后面三种逻辑结构,其中,树形结构和图状结构又可统称为非线性结构。当然了,单纯仅考虑数据的逻辑关系还不足以将数据结构从数学中独立出来放到计算机科学中,还缺点什么?我们知道,计算机要处理的信息量非常之大,一块内存不可能既在处理底层命令的同时,还要兼顾存储海量的、暂未用到的外部数据的任务,因此,“数据”一词,在计算机领域必然要涉及到“存储”。所以,除了在逻辑上对数据结构进行描述,我们还要描述数据的存储结构,对此,人们也常有“逻辑上的数据结构”和“物理上的数据结构”两种不同的说法,从逻辑和物理两个层面描述对数据结构进行定义。有了结构,有什么用呢?这就好比我们做出了一项发明,却没有告诉别人怎么样去使用这项发明,那也是毫无意义的。所以,对数据结构的研究,还要加上“对数据的操作方法”的研究,例如C中的整数类型和浮点数类型,前者整除的整除操作和后者是不一样的,它们是两种不同的数据类型,有着不同的操作方法,这其实也是不同数据结构相互区分的一个体现。因此,数据结构主要有三个方面的研究内容:数据的逻辑结构、数据的存储结构和对数据的基本操作。图示为图论部分的经典问题,七桥问题:
计算机导论课后总结(第十五周)_第2张图片
谈到数据结构,就免不了要谈算法。由于我们已经在《数据结构》课程中学习了各种多样的算法,老师在谈到这部分的内容的时候,是让我们做一个小的算法题,并抽同学谈论自己的算法。这却让我有一种启迪,算法,真的只是学了就过了,不用了吗?我听闻MIT的一个教授说过这么一句直接的话,“If you want to become a good programmer, you can spend 10 years programming, or spend 2 years programming and learning algorithms.”就我目前的学习来看,很多时间我们确实没有用到太多关于算法的知识,我们只是在写着一些已经存在的程序,用着一些已经成熟的框架,换着不同的编程语言输出一句“hello world”……这不是我希望看到的。老师的课上的算法题,是蛮简单的一个求一组数据最小值的算法,让我去编程实现,我可能很快就可以做出来,但是让我把编程中用到的算法思想描述出来,我还真不一定能说得很清楚。这一点在写实验报告的时候我也发觉到,我只是在”按照程序写算法”,而不是“依据算法写程序”……我前面的总结不断在强调数学的重要性,算法又何尝不是数学?计算机科学的根基要牢,数学不可少、算法亦不能丢!这周的导论课,再次让我警醒,意义莫大于此!

总结至此,共勉!

你可能感兴趣的:(计算机导论课后总结(第十五周))