计算机学科漫谈
推荐博文:
PHP设计模式之观察者模式
在这篇博文里,我想和大家聊一聊自己对计算机学科的理解。当下本科阶段的计算机专业教学涉及计算机学科的方方面面,分类繁杂,有时可能令新人茫然不知所措。那么,对计算机专业的学者来说,什么是最重要的呢?我相信,一千个读者,一千个哈姆雷特,同样的,每个计算机的学习者都有自己对专业的一番认识。如果说本科四年的计算机专业课程是对专业知识的横向积累,那么把握计算机专业的本质的内容则需要纵向的思考。因此我个人的观点是:对计算机系统整体概念的理解在计算机专业学习中尤其关键。于是我把自己对专业的理解和认识总结出来,希望对想了解这方面的读者有所帮助,当然也欢迎大家提出自己的观点和建议。
说起计算机,一般都会按照软件和硬件的两个大方向考虑。确实,如果硬件是计算机的经济基础,那么软件自然就是计算机的上层建筑。这里我们也按照这个分类进行讨论。不过我自己插入了第三个分类——基础学科,我们都知道计算机学科是数学学科延伸而来,数学理论在计算机学科的地位自然不用多说。
一、硬件
首先,我们谈一谈计算机的硬件知识。我们都知道传统的计算机是冯·诺依曼结构的,即满足存储程序原理。这也恰好反应了计算机硬件的两个最重要的方面——计算和存储,对应硬件就是CPU和内存。CPU负责代码的运算和控制,内存负责存储计算机程序的数据和代码。而计算机的其他部分,比如磁盘、鼠标、键盘、网卡等,统统是计算机的外设部分。
作为计算机的核心——CPU,有三个关键的部分:运算器、控制器和寄存器。运算器负责执行算术、逻辑等运算,是计算机计算的灵魂;控制器负责控制执行代码指令,一般包括提取、解码、执行、写回四个大的步骤;而寄存器用于缓存计算数据(通用寄存器)和控制数据(指令寄存器、程序计数器)。不过这其实是对CPU的逻辑的分类,实际工作由CPU内部相应的运算电路、控制电路等集成电路完成。
计算机的核心存储部件其实逻辑上分为两类:内存和高速缓存。不过在物理上,目前的主流CPU一般都把高速缓存集成到CPU内部了。内存一般使用DRAM存储部件,这类部件可集成度高,价格低廉,不过速度较慢。而高速缓存一般使用SRAM存储部件,其特性与DRAM恰恰相反,可集成度低,价格昂贵,不过速度快于DRAM,因此用于缓存CPU和内存之间的临时数据,增大内存数据的访问效率。
计算机学科与以上知识相关度最高的课程分为两大类。一类是电子技术类,另一类是组成与体系结构类。
《电路分析》是电子技术的理论基础,它提供了电子电路特性分析的理论和方法。而和计算机相关度最高的电子技术课程便是《模电》和《数电》了。模电关心三极管的放大特性,常用于计算机外设部分的信号处理、放大电路等功能实现。而数电关心三极管的逻辑特性,是计算机二进制的基石,它提供逻辑电路、集成电路、数字逻辑等相关理论。为CPU和内存的构建提供了理论基础。
在组成和体系结构类的课程中,《计算机组成原理》提供了CPU、内存、IO等计算机子系统的构造原理,尤其是指令系统,是对计算机底层硬件的第一次抽象,也是软件访问计算机硬件的根基。《计算机体系结构》和组成原理的描述角度截然不同,如果说组成原理着重讲述计算机的每个细节,那么体系结构则是从宏观的角度描述计算机的设计和架构。不过它们和计算机的硬件内容贴合紧密,比如指令流水等内容涉及到CPU具体功能部件的设计,因此这里把它们归为一类。
以上便是本科计算机课程内和计算机硬件相关的课程,不知大家是否和我有同感,本科计算机课程中硬件部分的内容只是占据了整个专业课程的小部分,更多的空间留给了软件部分(当然,这和不同高校的教学计划相关)。
二、软件
对于计算机的软件方向,我们从三个角度来谈:底层、系统和应用。
软件底层方向主要介绍对计算机硬件的直接操纵,前边提到,指令系统是对计算机硬件的第一次抽象。因此底层编程便是利用这层抽象,间接控制计算机的工作,其中最重要的便是汇编语言。
在《汇编语言》课程内,一般都会把汇编描述为计算机指令的助记符。事实上我们也能发现这层关系,比如汇编语言最关键的两个方面:指令和寄存器就是对CPU内部结构的直接抽象。汇编指令中的算术运算指令和逻辑运算指令的内容,对应着CPU的运算电路的功能,而整个汇编指令的解释执行都是由CPU的控制电路完成。同样的,CPU内的大部分寄存器都可以在汇编语言中直接访问,内存的数据以内存地址访问的形式表示在汇编语言内部。
如果说汇编为计算机硬件提供了抽象层次的通用访问,那么《接口技术》课程将重点放在如何使用汇编对计算机的外设进行细节的访问,它给出了如何控制外设的具体信息和方法。
而真正全面利用汇编知识对计算机访问的内容在《单片机原理》课程中体现的更明确。虽然单片机只是一个微型的计算机系统,但正是“麻雀虽小,五脏俱全”,使用单片机提供的汇编语言控制单片机的工作不仅要考虑单片机的核心芯片的设计结构和接口资源,还要考虑单片机的外接设备的控制和访问细节。
虽然以上三门课程提供的内容基本上可以对计算机进行低层级的全面控制,但是事实人们的要求远不止于此。由于原始的汇编编程很难满足对计算机的资源进行动态调度,充分发挥计算机的性能。比如内存的动态申请与释放,比如IO任务等待时,让CPU去计算其他的任务等。这些需求需要人们提供一个负责资源管理的程序帮助完成,这便产生了操作系统。另外,当面临大量的汇编语言编程工作时,人们需要更高效的方式去和计算机交互,这样高级语言便诞生了。而把高级语言翻译为底层汇编的任务就落在了编译器的身上。
《操作系统原理》课程详细描述了操作系统对CPU、内存、设备、磁盘的管理细节,而将这些理论只是付诸实践,便有了更多的相关课程。《Windows编程》、《Linux环境编程》等类似的课程提供了熟悉操作系统原理和操作系统API(系统调用)的手段,《嵌入式》的课程将这种锻炼更近一步,通过交叉编译、内核裁剪的学习对操作系统的内核的细节了解得更加透彻。而真正清晰了解操作系统的细节则是通过《内核源码分析》这样的课程完成的,通过对内核源码的解读,以开发者的角度去学习操作系统。另外,关于操作系统的安全的《计算机安全》课程又从另一种非常规的思维模式去控制操作系统,间接地操作操纵硬件,继而操纵计算机。而从学习病毒、木马、蠕虫、漏洞等知识的学习中反过来进一步加深了对操作系统的了解。
《编译原理》课程从另一个角度描述计算机的控制——编程语言。相比于操作系统作为计算机管理程序的形态,编译器则是作为转换程序的形态出现。虽然真正在计算机上执行的是应用程序提供的控制逻辑,但是操作系统是把计算机的资源充分地利用去完成既定的控制逻辑,而编译器则是将应用程序提供的控制逻辑更好的转换到计算机底层,这包括代码的翻译和优化。代码的翻译并非像汇编语言那样是一个简单的直接映射,随着高级语言的复杂度的变化,编译器的分析工作难度也会不同,而《形式语言与自动机》提供了代码分析的理论基础。
如前所述,操作系统和编译器并非计算机真正的工作内容。真正使用计算机服务于人们的是应用程序提供的功能,是应用程序发挥了计算机的价值。不过应用程序是建立在操作系统之上的,因为操作系统是对计算机系统的抽象。
我把计算机关于计算机应用的课程划分以上六个方面(极可能不完全,欢迎补充建议),我们先从计算机应用最核心的工具开始——编程语言。
每个人都学习了各种各样的编程语言,每个人擅长的编程语言可能也不尽相同。我是C++的爱好者,因此用C++作为讨论的例子。C++是一个多范式的编程语言,面向过程、基于对象、面向对象、泛型编程、函数式编程等等。每种编程都有自己的特点和优势,不过每个学习编程语言的人都有自己的选择和爱好。《C++程序设计》应该是计算机学科的必修课了,不过只要谈到编程语言,就甩不掉《数据结构》和《算法》。不同的编程语言对数据结构和算法的支持库不尽相同,这些都是编程语言的基石。无论是非可视化编程,还是可视化编程(MFC、QT),都离不开数据结构和算法的支持。Java作为目前另一主流的(目前使用最广泛的)编程语言,也有同样的特征。不论是《Java程序设计》学习的基本的Java桌面编程,还是提供更多学习空间的《Java Web程序设计》。从JavaSE、JavaEE到SSH、Android、Hadoop,都能看到编程语言构造的千变万化的应用程序。
计算机图形是计算机程序可视化的核心。《计算机图形学》描述了基本图形的显示和变换算法,三维环境的构造方法,包括相机、光找、阴影、纹理、贴图、粒子系统等等。而《计算机图形图像处理》更偏重于图像的采集和处理,《多媒体技术》也是类似。它们都是特定领域的应用,运用了大量的数学理论基础,也正是它们,让计算机的世界变得色彩斑斓。
数据处理方向课程是计算机背后的无名功臣,无论是老生常谈的《人工智能》、《数据仓库》、《数据挖掘》,还是目前大放光彩的《机器学习》、《大数据处理》,我们在屏幕上无法直接看到这些课程的身影。然而这些课程描述了计算机如何思考问题,如何更好更快地处理计算机的数据,满足人们的实际需要。这些课程背后,仍是靠数学理论和信息理论作为强力支撑的。
不管实现什么样的应用程序,当软件达到足够大规模时,软件设计的理论支持就显得愈来愈重要。《软件工程》提供了软件开发流程的模型和相关理论,《面向对象方法学》更是专注于面向对象设计领域。学生时代觉得这些理论过于遥不可及,只有经过大型多人合作项目的历练,才能深刻理解前人留下的这些珍贵的经验财富。
这里把《计算机网络》划分为软件应用其实稍有不妥。计算机网络是多个计算机的互联集合,它拥有自身的硬件和软件。不过我们从操作系统的支持角度来看的话,计算机网络的协议和通信都是建立在系统之上的。这其实并不重要,重要的是计算机网络改变了计算机的世界,将原本孤立的计算机联系起来,形成了一个新的计算机世界——网络环境。《TCP/IP协议分析》详尽描述了计算机网络原理实现的细节,《思科网络技术》让我们学习到如何控制计算机里的每个设备,从独立的计算机到网关,从局域网到Internet。
当然,说起计算机网络,就无法不谈起网络编程,而这些网络编程的接口是由操作系统提供的。网络协议本身就是一个规模巨大的算法,它是有成千上万的程序分布式构成的。既然是程序就避免不了缺陷和bug,这就为网络安全埋下了“祸根”。如何利用系统提供的功能和已有的计算机应用、策略防范网络安全威胁也成了人们研究的话题。
《数据库》学科的诞生也是来源于人们的实际需求。当然机械的信息检索无法满足实际需的要时,人们想到使用更好的数据结构存储、组织数据。针对磁盘数据的管理,当文件系统已经不能满足频繁快速查询的需求时,数据库的数据管理方式则变得尤其重要。数据库学科描述了数据的关系模型,结构化查询语言SQL,以及在和应用程序结合时如何设计数据库的方法。传统数据库是建立在操作系统的文件系统之上的,当然这里不考虑内存数据库的形式,它们都有自身特点的内部实现形式,比如B+树等。数据库种类繁多,有满足中小型应用的SQL Server,有满足大型应用的Oracle,有开源的MySQL,也有在Android移动设备上的SQLite。另外,数据库也是传统的数据挖掘、机器学习、人工智能算法的数据来源。
通过对不同计算机应用学科的学习,处理掌握不同学科自身领域的知识、理论、算法外,同样能加深对计算机系统的理解。比如一个应用如何设计、如何提供用户接口、如何转化为机器语言、如何运行在计算机硬件上,直到应用运行时改变的计算机硬件的每一个门电路的状态等。
三、基础学科
我们常常在学习专业知识的时候,忽略非专业领域学科的重要性。饮水思源,若非基础学科强大的基础能力,是无法构建计算机世界的千姿百态的。
前边提到,计算机是数学的延伸。数学理论构建了计算机学科的基石。《高等数学》的重要性不必多说,微积分、无穷级数、傅里叶变换等内容在计算机硬件电路设计、图像处理算法、关系理论等领域随处可见。《离散数学》的图论、数理逻辑理论更是体现在计算机的各个方面,无论是硬件逻辑门设计、算法的NP问题还是操作系统任务调度、编译优化等,都提供了理论支持。《线性代数》在图形学的表现尤为突出,比如图形的变换矩阵、三维世界的模拟等。《计算方法》是工程数学,计算机程序的科学计算、线性方程组求解、程序库设计等都有它的身影。《概率论与数理统计》的内容也应用到计算机随机数算法、动态规划算法的移步转移方程、样本分类等领域。最后需要提及的一个非数学学科《唯物主义与辩证法》的重要性,辩证法内提及的事物之间的联系和矛盾的对立统一性等思想在软件设计领域、操作系统设计、计算机体系结构设计领域都有体现。
正所谓“磨刀不误砍柴工”,将学科的基础打扎实,其实能帮助我们更好地学习专业的理论,加深对专业学科本质的理解。
四、总结
综上所述,我们从计算机硬件组成的基本细节,逐渐向上扩展,了解了计算机硬件的抽象,继而了解如何利用这层抽象直接操纵计算机。然后根据计算机发展的需要,引出操作系统和编译器的在计算机内的地位,并认识到操作系是计算机的资源管理者,而编译器是高级语言与计算机硬件的传递者。接着我们描述了每个应用学科涉及的理论和内容,并泛谈了一下它们和计算机系统的关系。最后,我们将基础学科在计算机系统中的地位重新审视了一番,重申了基础学科的重要性。相信通过以上的描述,或许我们对计算机专业有了一个别样的认识。
已有 0 人发表留言,猛击->> 这里<<-参与讨论
ITeye推荐