小时候经常想,计算器是如何将两个数字加起来的?难道计算器保存了所有的个位数相加的表吗?为什么能将数字显示出来?为什么只能做简单的操作,不能做混合运算(后来知道了一种叫“科学计算器”的东西)?
后来学到了计算机内部使用二进制表示的,但是小时候那种困惑依然没有解决。这个二进制到底是如何应用的?内存里面是有很多点记录了0和1吗?那这些点有多小呢,才能保存那么多数据?这些数据在计算机内部又是怎么取出来的,怎么使用的?
直到同事给我推荐了《穿越计算机的迷雾》这本书,这些困扰我十几年的问题才渐渐明了。当然,如果大学的时候选修计算机组成原理好好上一下的话,可能也早就明白了。对计算机感兴趣,或者对于计算机到底是如何工作还有疑问的同学,非常推荐读一读这本书。这本书语言非常通俗,虽然有些地方需要仔细思考才能跟上,但是作者已经是非常努力的将这些难的东西写明白了。有些地方可能有些啰嗦,像《鸟哥的Linux私房菜》一样,但是也可以当做是幽默吧。
计算机的发明是一个非常漫长的过程,这段历史中有很多伟大的科学家的努力。首先人类先是发现了电,然后发现了电流的磁效应,法拉第又发现了磁能生电,接着开启了用电磁来传递信息的漫长探索之路,摩斯密码,电报,电话因此诞生了。
让计算机做加法这一个简单的操作,也经历了漫长的探索过程。这又和古老的逻辑学分不开,有了逻辑上的真值表和推论,才有可能用二进制表示逻辑问题,将数字逻辑转换成逻辑电路。通过一番精彩的推导,就可以制造出一个电路复杂的全加器。到这里我也对二进制有了一个更深刻的理解:计算机的计算方式和人类是有本质的不同的,人类可以理解复杂的事情,可以处理十进制。计算机天生就是处理很简单的东西,然后使用很简单的东西组合出来很复杂的东西。比如说,计算机当然也可以用十进制,不同的电压(比如0~10v表示1,11~20v表示2……)来表示。但是这样的问题是,我们要设计电路表示1+1=2,1+2=3等等。如果用二进制,只有很有限的几种情况:1-1 1-0 0-0。这种枚举起来简单,大大的简化了电路的设计。
这基本就是 CPU 的原型了:能做简单的计算。借着触发器问世,多个触发器组成的电路可以保存中间结果,支持读写。为了读取这些触发器保存的值,又出现了地址译码器,这样无论读写哪个地址都可以很快,也很简单。这就叫做随机读写(RAM)。
这些基本就是现代计算机的老底了。接下来就是我们熟悉的汇编指令,网络内容等。可以说,电子计算机的发明并不像电灯泡、轮子这种东西一样,经过多次尝试或者从仿生获得的灵感就可以一下子发明出来,电子计算机是无数人经过不断的探索才一步一步走到今天这种形态。我常常会想,现在的生活多么幸福啊,可以跳过那段没有网络,没有现在这种性能的计算机的“黑暗时代”。可是今天的计算机依然在发展,人工智能,区块链这些新技术层出不穷,说不定后人也觉得我们今天的生活是“黑暗的时代”呢。
这种科普性质的书类似的还有
《程序是怎样跑起来的》
《网络是怎样连接的》
还有最最经典的《编码》
嗯,谢谢,第三本《编码》我也买啦,另外两本有时间也去读一读。
感谢博主分享,收藏了~
我看过类似的《编码》
好巧,我是《穿越计算机的迷雾》和《编码》一起下的单……
嗨~我是看了你这篇文章才去看的这本书。今天刚好看完了,前面的内容都很有趣,从制作加法器到寄存器怎么制作,都看得我津津有味。不过最后那几节从硬盘,操作系统这些内容感觉又变成了教科书了(;´Д`A。
感谢博主推荐的这本书(*☻-☻*)
确实是,其实后面的我也没仔细看。操作系统有本《30天自制操作系统》不错,跟着做真的可以做出一个操作系统。硬盘的知识还是要了解文件系统,现在貌似已经有很多文件系统的实现了。这些东西学起来也是挺有意思的。
我最近在看一本叫《代码之髓》的书,类似风格的,很通俗易懂。
谢谢你的推荐。我一定会去看的⁄(⁄ ⁄ ⁄ω⁄ ⁄ ⁄)⁄