对计算机的认识与感想
我们在大学中学了很多门课程,但是这门课程到底有什么有,以后的工作中绝大部分基本也用不到,我们为什么要学。这篇文章想将我学过的知识串起来,虽然都很基础,但是希望能给读者一点启发。
现代社会几乎离不开手机电脑,但是手机电脑软件能为我们提供丰富多彩生活的基础是什么呢?计算机是如何运行起来的?我们能从中得到什么启示?
我们都知道现代计算机都是基于半导体,往往用芯片中晶体管的数量作为CPU性能的指标之一,为什么呢?为什么是基于半导体,这得从半导体的特性说起。
半导体是指常温下导电性介于导体和绝缘体之间的材料,硅和锗是最常用的半导体元素。在硅晶体中惨入少量杂质磷元素,磷原子外层的五个外层电子的其中四个与周围的半导体原子形成共价键,多出的一个电子几乎不受束缚,较为容易地成为自由电子。称为N型半导体。在硅中惨入少量杂质硼元素,由于半导体原子(如硅原子)被杂质原子取代,硼原子外层的三个外层电子与周围的半导体原子形成共价键的时候,会产生一个“空穴”,这个空穴可能吸引束缚电子来“填充”,使得硼原子成为带负电的离子。称为P型半导体。在一块完整的硅片上,用不同的掺杂工艺使其一边形成N型半导体,另一边形成P型半导体,我们称两种半导体的交界面附近的区域为PN结(摘自百度百科,不清楚的自补)。PN结具有单向导电性,这是集成电路最重要的基本原理。一个PN结可以组成二极管,如我们常见的发光二极管也是二极管,单向导通发光的。两个PN结则可以形成一个三极管(也叫晶体管)。
PN结可以组成二极管和三极管,二极管的用处很大,例如稳压电源离不开二极管;三极管具有放大、饱和、截止三种工作状态,我们现代3、4G、wifi的无线电信号,能够在手机中得以接收使用,离不开三极管对信号的放大作用,因为空气中的磁场是极其微弱的,手机接收到的原始感应电流也是极其微弱的,信号不进行放大则无法处理,当然信号不能无限制放大,因为放大后信号易失真。三极管的另外两种状态饱和、截止,则可对应到布尔逻辑中的1和0,将物理现象和数学对应起来是一大创举,数学是可以建模和理论分析的!既然一个三极管可以产生1和0两种状态,理论上如果是8个三极管不就可以表示8个1和0状态了,可以对应8个位,一个字节。这样就将物理与计算机中的字节的概念联系起来了。
以上都是电子技术中的基本概念,相信对于学过模拟电子技术这门课的大一学生都不难。这里有两个问题:
(1)、三极管只能产生饱和或截止两种状态,但是这个状态只能在当时知道,无法知道之前是什么状态,即之前信息如何记忆存储的?
(2)、计算机为什么要基于0、1的二进制模式,基于六进制或十进制行不行?
第一个问题不难回答,模拟电子技术之后的数字电子技术课程就可以解释状态如何存储的,模拟电子器件搭建的各种触发器就可以解决这个问题。
另外一个问题,计算机基于十进制行不行?从数学和理论上来说,实现多少进制的电路都没问题,例如三极管的饱和与截止可以对应1和0,如果将5V电压定义为数字5,4V对应数字4,依次类推,0V对应数字0,这样不就组成了六进制电路吗,表示的状态与计算的效率不比二进制高很多吗为什么没有出现六进制电路呢?要解释这个问题,一句话可以解释“理想很丰满,现实很骨感”。5V对应5,那4.5V对应几,4.4V呢?这里涉及到电路稳定的问题,以5V的单片机为例,并不是只有0V才对应0,或者是以5/2为分界线对应1和0,其中涉及到一个概念就是判别电路。需要判断输入的信号到底是0还是1,如果5V的电路设计为二进制,两种状态判别起来相对容易,出差错少,但是用5V电路设计为6进制,6种状态,参与判别的时候,稍有干扰就有可能判断错误,导致整个电路信号出错,稳定性没有二进制好,而且电路复杂性及成本远远高于二进制。有人可能会说,我把电压提高啊,之前是5V/2,我要达到相同判别水平,设计成5V/2*6=15V的六进制,不就和5V的二进制电路抗干扰效果一样了吗。首选六进制电路肯定比二进制复杂很多,其次电压越高功耗越大,你不想你的手机烫手,每天冲10+次电吧;当然也不是电压越低越好,太低了,功耗是下降了,性能也会下降,抗干扰能力下降,所有基本单元还是越简单越好。任何事物都不是绝对的,好坏之间此消彼长,肯定有一个平衡点。
电路状态可以用0、1表示,8位二进制的ASCII可以表示0-9及大小写各26个英文字母和常用符号,通过ASCII就可以表示我们日常需要的所有信息了,这里将物理与半导体器件联系,半导体器件与二进制0、1联系,二进制0、1编码与数学联系,转化为理论之后与世间万物信息联系。由具体到抽象再具体,将自然现象提炼为知识,再转化为技术,服务于社会。数学有用还是没用?
上面粗略的解释了物理数学与信息表示的关系,那么信息是如何处理的呢?我们可以将信息转为为0、1数字,即将信息与数学联系上了,利用数学理论可以处理信息。通过模拟电子技术,可以设计出加法电路,通过模拟电路封装之后的数字电路可以设计出移位电路。有加法电路和移位电路就可以进行数学计算处理信息了。这里只是浅显的一笔带过,没有深入介绍,因为每一个部分都是一门学问,详情见《模拟电子技术》《数字电子技术》《信息论与编码》《微机原理》,这里的浅显介绍只是将知识串起来,跳出某一门具体的课程看待问题。
另一个问题,计算机组成之后是如何工作的,如何实现现在的强大功能。早期的计算机只能进行简单的基本运行,并不能像现在这样处理复杂信息,聊天看新闻。上面说到计算机电路处理的是0、1信号,如果我们将各种0、1组合成各种有实际意义的符号,不就可以指示计算机帮我们干活了吗,例如将0110 11010011 0111(随便写的编码,仅做示例)表示为“+”,我们就可以进行加法运算了,但是记这些0、1字符串会很吃力,特别是随着运算复杂后,需要记忆的东西太多了,离我们的实际理解也很远。为解决0、1字符串与我们常用的理解语言相差太远,不便于表示与记忆的问题,人们发明了汇编语言。汇编语言的发明就是为了解决符号表示与记忆的问题,例如使用add符号表示加法字符串0110 1101 0011 0111,汇编编译器编译之后自动将add符号替换为计算机能识别的0、1字符串。而我们记忆add比记忆字符串更容易,也方便交流。这里体现一种思想,就是映射,将复杂枯燥的东西,转化为简单易于人类识别的东西,我们只负责抽象复杂的事,简单具体的机械性事务就交给机器自动处理。未来社会,很具体机械性的工作肯定会被机器取代,人们介入的只是抽象复杂机器无法认知的问题。抢票插件就是很好的例子。
汇编语言虽然比机器码方便很多,但是有个问题是,需要程序员非常熟悉计算机结构,而且汇编语言跟具体的机器相关,代码不好复用移植。为了解决代码移植复用的问题,也就是常说的跨平台,大神们发明了C语言,它是一种通用的计算机语言,任何计算机都可以用C语言运行,只需要更改与机器相关的少部分代码就可以将程序移植到其他机器上。但是C语言还是比较底层,还离我们所认知的现象比较远,人们在C语言的基础上发明了C++和Java等面向对象的语言,其封装、继承、多态的特性很好的与现实现象中的整体性、遗传性、和多样性相联系,使之更表示更复杂的情景。复杂的计算机软件都是基于面向对象的语言设计的,C语言则主要负责底层的硬件驱动和操作系统部分(当然这才是计算机的基石,核心技术之一)。随着问题的复杂化,为了解决计算机资源分配与管理的问题,发明了操作系统;为了将孤立的机器相互联系起来,发明了计算机网络,才有今天的互联网。这里体现一种思想,高生产力的表现一定是,分工细化,万物相连。
这里还有个现象,计算机随时都要处理大量是数据,甚至满载CPU为什么还是能够井然有序高效执行?这里的思想是,共同遵守规范和协议,不搞特殊才是有效的方法。即使不得已搞特殊(计算机中断程序),也要速战速决,尽可能减小影响。如果我们所有人都能守交规,交通阻塞问题会好很多,那时的瓶颈不在于CPU和总线,而在于机械硬盘(收费站)了。
我们应该认识到《模拟电路》、《数字电路》、《高频电路》、《同学额原理》、《信息论与编码》对应电子、通信、自动化专业;《计算机组成原理》、《操作系统》、《计算机网络》、《数据结构》对于计算机专业的重要性了,因为这些课程是你日后工作发力的基石。这些是精华是武学中的内功心法,什么web前端开发、iOS/android客户端开发、java/php后台开发都是具体的招式,内功扎实了,不怕招式学不好,如果内功不扎实,招式玩得再溜,换个语言或平台你就一面懵逼了,因为没有掌握事情的本质,知其然不知所以然,专业基础才是你的核心竞争力所在,以不变应万变。与君共勉!