编码的本质及计算机的工作原理

作为非计算机专业的学生,我偶尔思考:编码的本质是什么?计算机的工作原理是什么?越想越迷糊,感觉计算机就像迷雾一样,平常只会用,但不清楚原理。

后来,从基本电路开始,搭建了复杂电路,并通过调节开关,控制电路。然后,利用存储中的高低电平控制电路,体会了机器语言编程的感觉,算是基本入门。

机器语言很繁琐,后来体会了汇编语言的好处,也控制了电路,最后又体会了高级语言的好处,也能控制电路。最近,又有一些新思考,所以简要地讲述一下。

一. 掌握原理的重要性

小时候,很喜欢骑自行车,试了很多次,一直不会骑,直到有一天,突然就会了,挺奇怪的。那个瞬间,至今难忘。那时,玩得不亦乐乎,此皆幼时闲情也。

图片

不需要读什么书,也不需要什么知识,我们就能大致悟出自行车的工作原理,其实就是常识。如下的描述,并不十分精准,但足够让人了解自行车的工作原理。

  • 用力踩呀踩,中间的铁齿轮开始转动。

  • 通过链条,带动后轮转动,准备向前。

  • 后轮推动前轮往前转,自行车走起来。

有的朋友要说,会骑自行车就行了,管它什么工作原理。这句话,听起来好有道理。林语堂先生却说:光知道用东西,却不知其所以然,实为遗憾。后来,台湾知名技术作家侯杰先生,在他的著作《深入浅出MFC》中,也提到了上述观点。

我个人的观点是: 我们使用工具,并不是一定要深究其原理,有时候,没有必要浪费精力和时间,沉迷于不重要的细节,自我陶醉,无法自拔。但是,如果能够了解一些原理,能帮助我们更好地使用工具,甚至有可能改进和创造工具。

二. 从硬到软层层抽象

如今,我们几乎所有的人,每天都在使用计算机(手机也是计算机)。对于大多数人而言, 没有必要深入了解计算机的工作原理。而对于从事计算机相关行业的人,或者对计算机有兴趣、有好奇心的人,也可以去了解一下。 

另外,了解计算机的工作原理,也能为装叉吹牛增加一些信心和谈资。说不定帮人修电脑或者安装系统时,侃侃而谈,还能成就一段美好姻缘。很多大二大三大四的师兄,特别擅长这些,那些大一的学妹,仰慕不已。

如果不了解自行车知识,不了解牛爵爷的力学,也能搞懂自行车的工作原理。 但是,如果不了解计算机知识,绝对不可能搞懂计算机的工作原理。因为,经历从硬件到软件的层层抽象后,计算机内部复杂得让人难以想象。

比如芯片,指甲那么大,却有几十亿个晶体管电子器件,每个晶体管电子器件的电流和电压,在1秒内,能变化几亿甚至几十亿次。学过排列组合的朋友,应该知道,芯片内部每时每刻的状态数量,是个巨大的天文数字。

图片

再比如操作系统,以谷歌公司的Android系统为例,少说点也有1亿行代码。假设一本书有500页,书的单面印50行代码,那么一本书就能印刷25000行代码。如果把操作系统的代码都印刷在书上,那就是4000本书,震惊。

图片

那么,当我们拿着手机,聊微信、逛淘宝、刷抖音时,我们是否意识到发生了什么呢?通过手机app、中间件、操作系统、驱动程序,我们在操纵着手机芯片中的电压和电流,操纵着芯片中的无数分子中的原子中的电子。

我们还利用了麦克斯韦电磁场理论,通过电磁波的方式,远程操纵着马化腾的服务器、马云的服务器、张一鸣的服务器的芯片中的无数电子。有点武侠小说的感觉,手指一滑,世界各地的计算机芯片中的电子便为之一振。

是的,从微观层面讲,那些电子在杂乱无章地“乱窜”,充满着不确定性。但是,通过抽象,我们拥有了宏观层面确定的欧姆定律、基尔霍夫定律等规律。然而,电流电压依然会存在上下轻微波动,并不准确,那怎么办?

通过再次抽象,我们拥有了确定的与或非门电路;通过再次抽象,我们拥有了确定的芯片;通过再次抽象,我们拥有了确定的驱动程序、操作系统;最后,拥有了带功能意义的app,  于是,我们能滑动手机,玩着,乐着。

图片

计算机,从顶层的应用程序往下看,处处都有抽象,处处都是编码和转换。我们没有办法,也没有必要弄清计算机的每个细节,但只要把握住了计算机的工作原理,弄清一些核心概念,还是能在一定抽象度上搞懂计算机。

抽象,是计算机科学和技术中最重要的思想,没有之一。抽象的重要性,在操作系统中的体现尤为明显。通过层层抽象,我们才可以轻松地聊微信、逛淘宝、刷抖音,而最背后的最底层,不过是芯片中电子在“乱窜”而已。

图片

三. 编码和解码的本质

到此为止,我们似乎了解了一点计算机的工作原理,但略感模糊,所以还需要继续探索与追问,那就来一起看看吧。

计算机中一切的行为,都可以归结于计算。当我们在聊微信、逛淘宝、刷抖音时,都是手机芯片的计算来实现的。

既然都是通过计算来实现的,那就要弄清计算机的计算原理。先来看看计算机中最简单的加法,这还得从编码说起。

编码的本质是什么呢?对通信专业同学而言,第一反应是信号编码,而对计算机专业同学而言,第一反应是写代码。

这两种理解,都局限在特定专业领域内。事实上,编码是广义的,无处不在,我们的工作和生活中,到处都是编码。

在战争中联络的暗号,是一种编码。如果不懂之前的约定,就无法知道暗号的意思,这个“知道”的过程,就是解码。

瞪你一眼,也是编码,把想法用瞪眼来表示。我们经常说:我不懂你说的意思。本质就是:我无法解码你说的东西。

很多场景,都是编码与解码的过程。来看图,一图胜千言:

图片

可见,对于同一事物,如果编码方式不同,那么得到的结果也不同。对于不同事物,编码后可能得到相同的结果, 但他们的含义是不一样的。

要正确解码,必须知道它曾经采用了哪种编码方式,否则无法解码。编码的本质,就是映射。解码的本质,就是去“理解”。要配套使用才行。

四. 二进制的加法示例

为什么我们费尽心思去讲编码的本质呢?因为通信的本质,就是编码并传输,计算机的本质,就是编码并处理。我们先来看一幅图:计算1+2.

我们可以看到,从苹果到数字,是一种编码方式,从数字到苹果,是对应的解码。而且,上述的编码,是我们很熟悉的阿拉伯十进制编码。

图片

以“109个苹果”为例,我们用十进制和二进制分别对其进行编码,具体的过程如下:

图片

可以看到,十进制编码后,数字都是由0, 1, 2, 3, 4, 5, 6, 7, 8, 9这十个数字组成的。而二进制编码后,数字都是由0, 1这两个数字组成的。这里,再次看到编码和解码的特点:

对于“109个苹果”,当编码方式不同时,其编码后的结果自然不相同。对于1101101,如果不知道编码方式,就没法理解它。如果是二进制编码,就会被理解为是“109个苹果”。

万一按照十进制去理解,那就是“一百一十万一千一百零一”个苹果,这显然是不对的,究其原因,就是编码的时候,用了二进制编码,但解码的时候,用了十进制解码,自然不行。

对于1101101,为了不错误理解,常用1101101B表示是用二进制编码,这个B是binary digit的缩写,意思是二进制,解码后是“109个苹果”。对于不标注B的109, 默认是十进制。

下面,我们来看下二进制的加法计算:

图片

可以看到,二进制数字只有0,1两个数位,做加法时,满二进一。无论是十进制编码,还是二进制编码,他们都是等效的。

实际上,还可以编码为三进制、四进制、...、十五进制、十六进制、十七进制等其他进制,本质思路是一样,相同的玩法。   

五. 二进制的发展由来

众所周知,现代计算机采用的是二进制逻辑,但是,为什么计算机要采用如此反人性的二进制呢?我们来慢慢说,往下看。

先来看“14个苹果”加“38个苹果”这件看似简单的事情, 我们该怎样用电路来完成计算呢?思路是编码后再计算,然后解码。

  • 首先,需要把苹果编码成具体数字,即14和38这两个值。

  • 然后,需要把14和18编码成14v和18v, 即用电压表示数。

  • 最后,把结果52v解码理解成数字52,即为“52个苹果”。

先来看看,用电来表示数,并实现加法,以14加38为例,输入14v的电压和38v的电压,设计电路,实现电压相加,得到52v,完全可以。可如果是9999加8888呢?用9999v和8888v的电压?估计早就被烧糊了,器毁人亡。

图片

我们来改进设计方案,下面这个设计就靠谱很多了,一根电线上的最低电压是0v, 最高电压是9v, 不至于把器件烧毁,人也安全。下面这个十进制加法器,貌似很完美了。事实上,最初,人们造计算机的时候,用的就是十进制。

图片

可是,现在有三个必须要面对和解决的问题:

  • 怎么实现4v+8v=12v呢?把两个电压串联起来,结果不就是电压之和吗?可是,这毕竟不是两个电池啊,貌似不太好串联。想了很久,也没找到好办法。

  • 从0v到9v, 总共有10个电压位,由于电子线路器件的复杂性,如果一根电线的电压值是7.49v,  那么请问,它表示的是数字7还是数字8呢?很尴尬很难办。

  • 如果要去计算14.001加上38.002, 用电路该如何表示呢?如何计算出准确无误的52.003 ? 要知道,任何一点电压的波动,都可能让最后结果产生偏差。

有没有更好的设计方式呢? 各路先驱,苦苦探索,最后探索出了解决之道:使用二进制来计算,用电路来实现二进制计算。

用电路来实现二进制表示和二进制计算,我们今天看起来似乎很简单,但探索出这条路,并不容易,也是坎坷挺多的哈。

莱布尼茨发明了二进制,但他在做乘法器时,没意识到二进制的重要性。终生未婚的他,在科学和哲学史上,是百科全书。

图片

布尔创建了逻辑代数,也称布尔代数,在很大程度上, 为后来的电路设计及其简化,做出了很大的贡献。现在很多编程语言中都内部了布尔类型,以纪念这位先驱。

1864年,在暴风雨中,布尔淋湿了,还坚持去上课,然后肺炎复发,一命呜呼了,真是可惜啊。希望大家注意身体,生病了,要休息。累了,要休息,别扛着。

图片

香农,最先洞察到了开关系统和布尔逻辑的关系,并发表论文《继电器和开关电路的符号化分析》,可以说,这篇文论让人们意识到,可以用电路来实现二进制表示和二进制计算。

香农活到了二十一世纪,当他看着这个世界,因为他的贡献而变得如此美好时,内心一定是很欣慰的。作为电子通信专业的学生(现在不搞这块了),我对香农真是佩服得五体投地。

香农更有名的一篇论文是《通信的数学原理》,学过通信的人,不能不知道这篇论文。作为信息论的创始人,香农当之无愧。来思考一个有趣问题:香农为什么没有拿图灵奖呢?

图片

六. 二进制计算的实现

继续回到正题,反思一下上面的设计,问题就在于电压位太多了,导致0v和9v中间插入了太多的电压位,相邻电压位容易错乱干扰,不准确。

联想一下前面提到的二进制,能不能用二进制来计算呢?把0编码成0v, 把1编码成9v, 也就是用0v标志0,用9v表示1,完全可以,看设计图:

图片

这样,即使电压出现偏差,比如8.4v, 也认为它是9v产生的偏差,所以判定它是9v,对应二进制的1. 如果出现1.6v, 知道这是0v出现了偏差,所以可以判定它是0v, 对应二进制的0.

由此可见,引入只有0v,9v这两个电压位后,系统会更稳定可靠,出错的可能更小。两个电压位的加法,其实就是二进制加法。二进制中的0用0v来表示,二进制中的1用9v来表示。

至于14.001加38.002,要实现准确计算也很简单,无非就是多加几根电线,专门表示001和002,跟整数加法的逻辑类似。这样一来,0.001和0.002就是准确值,不怕电压波动。

上面是6位二进制数字和6位二进制数字加法器,如果用电路实现它,首先就要实现1位二进制和1位二进制相加的加法器,即我们需要做一个下图中的“神秘电路”,其实就是“半加器”:

图片

到此为止,虽然没有完整地设计出加法器的具体电路,但对计算机的计算原理,有比较深刻的认识。计算机的计算本质,就是将要计算的数字,进行二进制编码。

然后,用对应的电路的高低电压(如9v和0v)来表示,通过电路的逻辑功能,从电路的输出中得到高低电压,进而理解为二进制,并最后转化为数字,作为结果值。

需要注意,高低电压(如9v和0v),在数字电路中,经常被称为高电平和低电平。下次我们提到高电平时,表示二进制数字1, 而提到低电平时,表示二进制数字0.

那么,高电平和低电平一定是9v和0v吗?显然不一定。也可以把高低电平分别定义为5v和0v,在proteus仿真时,我用5v表示高电平),而用0v表示低电平。 

这样,就实现了用电路来计算二进制。有了编码和计算,我们才能让计算机,呈现出丰富多彩的功能,这就是计算机的工作原理。粗略说起来,也是挺简单明了的。

图片

写到这里,快接近尾声。我们介绍了计算机的工作原理,又讲了编码的本质和二进制编码,然后讲了二进制编码的好处,最后从设计图的角度,实现了二进制加法。

  • 9
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值