由低向上的学习计算机是一条比较漫长的道路。但是,得来的知识却是体系化的。而且越到上边,学习的理解的效率是越高的(暂且自我欺骗,毕竟还没达到那高度)
下面就最近研究和学习做一个复盘。以问题出发为脉络。
1、计算机是怎么做运算的?
关键字:二进制、逻辑门
2、在问题1的基础上又问:为什么是二进制?
3、CPU是如何工作?
回答这个问题,要先弄懂人类在使用10进制做计算时的方法,不赘述。
10进制方法迁移到二进制。基本的加法、乘法(可转成进位的加法),减法转成加法实现,除法转成乘法实现(这个我还没深究)。
进制之间可以平滑的换算。
(这是我独立思考得出的,未见有人说过,或者有但我不了解)。
位和进制大小、进位。是三个基本元素。
位是进位中的位,是进制数的承载单元。位只能承载(0到进制-1)的数。比如:10进制中,一个位可以放0-9的数字,到10的时候就需要进位。二进制,最大放1,到2就要进位。
进制大小:就是所谓的2、10、16。
进位:位中承载的数等于进制大小时,发生的高位+1行为。
所以,可以有5进制。甚至可以有100进制,当然如果能够找到这么多数字的象征,恐怕人类的大脑处理起来也是费尽的。
问题又来了,为什么人类有进制这种抽象,我觉得主要还是来源于认知的范围是有限的,而认知的对象是无限的。之所以说认知范围是有限的,主要是人的身体机能决定的,不能同时(并行)思考和处理多个问题。以有限的认知认识无限,只能将无限的进行分而治之。数字是对现实世界和数量有关的一种抽象。位,就是数字抽象的基本单元。对于人类来说,现实世界的物质是无限的,小到分子原子、大到宇宙万物。所以用进制数可以表示一个特定的数量的概念。
如果存在一个主体(比如上帝),ta使用的是无限进制,宇宙万物都囊括在其中,它不用进位。每个事物都有是唯一的,那么人类的进制就已经没有了意义,ta能使用无限进制的前提是掌握了无限事物的信息,超人类思维的存在。这就是无限这个抽象的力量。
传送门
人类为什么要做运算呢?因为人类的认知是有限的啊,为了得到暂时无法获得的信息,基于已有的信息进行信息的变化和组合,就生成了运算。所以,如果人类可以直接获得任何信息,比如看到一个平面物体,便知道它的面积和体积,那基于几何学的长宽高、积分之类的运算就不再具有它的价值,但这目前还只是一种思维游戏,人类还是渺小的。
这里举个例子:
国王统治了100个小城邦,他欲了解各城邦的粮食产量这个信息,以备决策。最简单的方式就是,统计各城邦的产量,然后全部相加。
如果没有数字和运算,他要得到信息,需要把100个城邦的粮食搬到一起,进行称重了。
插个题外话,统计出来的数字只是一种近似值,为什么呢?因为在实操的过程中,城邦是可以谎报数量的,可以报大或报小,加起来的数已经不是国王心中想要的那个数了,但是这也没有办法,先解决有和无的问题,只要偏差不大的离谱,是可以容忍和妥协的。妥协这词在计算机的实现中也是常见的。
物理学中的很多问题都是靠运算得出的,比如光速是怎么得来的(人类一开始测量得到的光速也只是近似值)?天体物理学又靠什么说宇宙在膨胀?
所以,再不要把运算限定在10进制了,它只是众多进制中人类习以为常的一种而已。
结合进制和运算:
比如5进制的23+12=40,它的10进制是多少呢?
23的10进制为:2x51+3x50=13
12的10进制为:1x51+2x50=7
40的10进制为:4x51+0*50=20
数字的实际意义则有进行运算的人赋予,抽象的作用便在于此。
计算机使用二进制,为什么是二进制呢?
早期的计算机有3进制、还有5进制的,都是电驱动,用简单的电子元件来构建。
电信号的电压强弱来表征数字,如上图,如果是5进制,那么不稳定的电压,必然导致不稳定的数。不稳定代表了不可信。
二进制就不同了,电压不稳定,只要在范围内,取值就确定的。所以二进制被优胜劣汰的剩下来了。
传送门
二极管有个特性,就是在某个电压值Uon之前,不导电,一旦突破,则通电,如下图。死区电压不导电。
晶体二极管为一个由p型半导体和n型半导体形成的pn结,在其界面处两侧形成空间电荷层,并建有自建电场。当不存在外加电压时,由于pn结两边载流子浓度差引起的扩散电流和自建电场引起的漂移电流相等而处于电平衡状态。当外界有正向电压偏置时,外界电场和自建电场的互相抑消作用使载流子的扩散电流增加引起了正向电流。当外界有反向电压偏置时,外界电场和自建电场进一步加强,形成在一定反向电压范围内与反向偏置电压值无关的反向饱和电流I0。当外加的反向电压高到一定程度时,pn结空间电荷层中的电场强度达到临界值产生载流子的倍增过程,产生大量电子空穴对,产生了数值很大的反向击穿电流,称为二极管的击穿现象。pn结的反向击穿有齐纳击穿和雪崩击穿之分。
PN结的工作原理传送门
P是多电子的一个,N是缺电子的一个,他们都导电,P是多电子要对外输出,N是缺电子要对内吸纳。电子多和少是工程师们利用化学原理制造出来的。它们中间隔了一道空气墙,适当电压可以打通,就导电了。
于是:二极管的导电性就可以抽象出1和0,1为通,0为不通。而通和不通,可以被人类(用电压大小的方式)掌控,下图是3个1。有没有觉得像位的抽象?
传送门
我不知道是谁发明或发现了这种转换,五体投地。但其中的核心逻辑:由简单到复杂。
将2个二极管,按照不同的线路布线,就可以得到逻辑运算中的“或、与、非”运算。
下面是盗图,盗图源链接
注意下图表示的电流方向。
“与”门
“或”门
“非”门
最后那些常用的电路都有了固定的接线模式,逻辑门的电路被抽象成了符号,它们共有一个特点:实现了抽象逻辑符号,在物理世界的正确表达:
盗图
还可以看看这个网站的逻辑门
Basic Gates and Functions
下面这个电路设计图,实现了单个位的二进制计算逻辑,sum是输出,carry是进位。——专业术语,或者叫抽象名“半加器”。
这里贴张这个逻辑电路的真值表:
A输入 | B输入 | sum输出 | carry输出 |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 1 | 1 | 0 |
1 | 0 | 1 | 0 |
1 | 1 | 0 | 1 |
上边电路解决了一位的加法,那么多位的呢?
把电路单元连接起来!
所以引出另一个电路图——全加器,由半加器(上边提到的半加器单元用HALF ADDER来表示了)进化而来。
上图实现了,进位场景下(三个输入:低位进位的位、高位的两位),两个输出(sum和carry)的计算单元。
所以继续复杂深化,得到2位的计算电路。下图A0 A1分别代表第1位,第二位的二进制数。
继续下去得到一个8位的加法电路:
所以,这个图很清晰告诉了一个编程中经常出现的名字:“溢出”。装不下了就溢出了。
乘法运算,是带进位的加法运算。首先要搞定的是位乘法运算。使用And运算即可。比如A*B,前置条件是假设不会溢出。所以限定A和B都小于1进制的4,结果用8位二进制来保存。如下图:原谅我画图不专业。。核心就是B乘Ai的时候,根据B当前位,为结果进位(左移),我仔细想了想,比较low的是接线的时候,按位来接(比如B1就进1位接在结果线路)。加法器这里,抽象了一把,把所有结果加起来。(里面是应该有3个加法器串联在一起)
以上,运算有关的就到此为止(逻辑的没有写就略过了)。
关于计算机的可计算性等价于Lambda算子,请百度。本人还未深刻理解Lambda。
参考:
【10分钟速成课:计算机科学】
Lambda算子简介
denallo学习笔记:λ演算(lambda calculate)