这本现代魔法原理指南,把计算机体系掰开揉碎讲清楚了

关注公众号并回复「编码」

获取《编码:隐匿在计算机软硬件背后的语言》超详细思维导图


「储存器(storage)和内存(memory)有什么区别?」

「为什么 MacOS 环境下的程序不能在 Windows 下运行?」

……

Windows 编程界的传奇人物 Charles Petzold 说,当他想要回答这些问题时,他一张开嘴就立刻意识到,可以回答的内容实在太多了,为了把这些问题掰开揉碎讲清楚,他写下《编码:隐匿在计算机软硬件背后的语言》这本经典。

这本现代魔法原理指南,把计算机体系掰开揉碎讲清楚了_第1张图片

1994 年,Petzold 被授予 Windows 先锋奖,他的著作 Programming Windows 是学习微软编程的必读之作,而这本讲述计算机工作体系的书籍,更是堪称现代魔法原理指南。

在这本书中,Petzold 不断提出难题并带领读者解决问题。

如果你是计算机科班出身,重读基本原理、了解计算机发展脉络,正本清源,开卷有益;如果你是计算机小白,你可以跟着作者的步伐搭积木,把导线、灯泡、开关、逻辑门等部件组装起来,经过层层抽象后,你将会用逻辑思维构建一个完整的 CPU

你将从这本书中获得:

  • 了解计算机发展整体历史脉络
  • 自底向上理解 CPU 工作原理
  • 学会层层抽象的思维方式,将已经发明的工具封装抽象起来,向上构建体系

从布莱叶盲文到二进制编码

编码是如何产生的、什么要使用编码?这是这本书探讨的主要问题。

小编认为最精彩的部分,是在讲解摩斯电码之后,作者进一步介绍盲文的诞生:

霍伊先生视力健全,因此他被自身的感知模式所禁锢。对他来说,一个字母 A 就是一个 A,字母 A 在记录时必须看起来(或者)感觉起来像一个 A。霍伊先生没有意识到,有一种完全不同于印刷字母的文字系统可能更适合盲人阅读。

法国军队的一位军官在 1819 年发明了一种他自称为「夜间书写」的文字系统。他在厚纸上使用凸起的点和划的组合来表示文字,这样当部队需要无声交流时,即使光线很暗,士兵们也可以通过这些符号互相传递信息。

……一个盲人学生如果有了纸张和笔,他就可以做笔记,同时还能阅读记下的文字。12 岁的盲人小孩布莱叶开始不辞辛劳地改进这个文字系统……

这本现代魔法原理指南,把计算机体系掰开揉碎讲清楚了_第2张图片

在布莱叶盲文中,字母、数字、标点等符号都被编码为 2 x 3 的点码单元中的一个或多个凸起的点,如上图左上角所示。

你或许敏锐地察觉到了布莱叶盲文与二进制的关联:一个单独的点,不是凸起来的,就是平的,只有两种可能性!因此,6 个可平可凸的的点就有 2^6 = 64 种组合方式。因此,布莱叶盲文系统可以表示 64 种符号,上图就是基本的小写字母表。

布莱叶盲文系统对我们理解编码,有哪些帮助?

二进制的思想,从本质上就是可能性的遍历,每个点只有平/凸两种可能,这为我们进一步理解计算机二进制打下基础。

编码就是交流:部队想在夜间秘密交流,盲人渴望书写和记录……对交流的渴望是人类不竭的生产力源泉。

自动操作

「自动操作」是这本书的精华部分,第 1- 16 章对于二进制、加法器、寄存器等内容的讲解,都是为了自动操作做铺垫。让我们跟着作者的思路,用纯逻辑构建一个 CPU 吧!

如果想计算多个数相加的结果,用 1 个 8 位加法器 + 1 个 8 位锁存器就可以完成,但是有两个缺陷:

  • 8 个灯泡无法显示结果大于 255 的数
  • 如果加数很多,输入的过程中一旦输入错误,则需重新输入

为了第二个解决问题,我们可以连接 64KB 的 RAM 阵列,把输入的数先保存到 RAM 中,每次输入都会通过计数器在 RAM 中寻址后保存,这样等全部输入完成后,就可以等待加法器依次相加得出结果。

如果想计算 50 对数相加,产生 50 个结果,然后保存到 RAM 中,并且可以任意读取这 50 个结果,应该怎么办?

改造电路,使锁存器的输出连接到 RAM 的输入端,也就是说把计算后的结果写回到 RAM 阵列中保存。如下图所示:

这本现代魔法原理指南,把计算机体系掰开揉碎讲清楚了_第3张图片

下一个问题是,如何配置一个自动加法器,使它不仅可以对一组数字做累加运算,还能自主确定累加了多少数字,并且能记住在 RAM 中存放了多少个计算结果?

总体而言,我们希望 8 位锁存器能做这四件事:

  • 把一个字节从储存器加载到累加器(Load)
  • 把储存器中的一个字节加到累加器中(Add)
  • 把累加器的计算结果存放到储存器中(Store)
  • 可以停止(Halt)

为了解决上述问题,需要引入另一个 RAM,来保存 Load、Add、Store、Halt 操作码。也就是说,电路中有两个 RAM 共同工作,RAM1 保存了数据,RAM2 保存代码指令。同时,要想达到 8 位锁存器 Load 指令的效果,需改造电路,8 位加法器的输出与一个 2-1 选择器连接,2-1 选择器连接 RAM2 和 8 位锁存器,这样锁存器就可以实现从 RAM2 中执行 Load 指令。

这本现代魔法原理指南,把计算机体系掰开揉碎讲清楚了_第4张图片

为了解决结果不能大于 255 的问题,我们可以把加数拆分,分别计算高字节和低字节的和,然后合并就可以得到结果。

低字节加法计算后可能需要进位,这个进位需要与高字节累加才是正确结果,解决方法是:引入进位锁存器进位加法的指令,专门保存进位的值,然后再和高字节累加计算。

目前,这个电路可以计算 8 位数的加法运算,以及 16、24、32 及以上位数的加减运算。虽然可以完成计算的基本功能,但是还不够完美,因为现在的电路使用地址空间是要非常小心的,如果不注意,就会发生地址被覆盖的情况,导致执行错误。

为了解决这个问题,我们加入一个跳转指令,同时改造电路,使指令的后两个字节输出也可以输出到计数器,然后通过计数器来确定遇到跳转指令后,计数器输出需跳转的地址,完成跳转寻址。

如何完成两数相乘的运算?那么就可以使用跳转指令 + 跳转条件来配合完成。所以,我们需要再增加一个锁存器,叫做零锁存器,只有当加法器的输出全部为 0 时它的值才是 1。通过计数器和零锁存器的配合,就可以实现乘法运算。同理,实现除法、平方根、取对数、三角函数运算也都是可行的。

到这里,我们完成了一个计算机的核心功能,包括:处理器、存储器、输入设备、输出设备。这里的处理器即是 CPU,主要负责控制和逻辑运算。

尽管在高级语言编程中基本用不到汇编,但是理解计算机的底层逻辑对程序的优化有至关重要的作用。任何一个有追求的程序员,都应当对计算机的底层原理如数家珍。

从实验室走进寻常百姓家

到了 19 世纪末,科学和工程领域中的特定任务会用上计算设备,但公司、政府、家庭中很少见到计算设备。计算机如何一步步商业化的?

1880 年,美国政府按照宪法进行十年一次的人口普查。然而,当时美国人口迅速增长,如果按照传统的方法,要七年时间来手工编制,等做完都过时了,1890 年的人口普查甚至预计要 13 年才能完成。人口普查局找到了 Herman Hollerith,他发明了制表机,结合了人工操作和机械打表,结构类似莱布尼茨的乘法器,但用电动结构连接其他组件。操作人员把一个有 288 个弹簧针的板子压到每一个卡片上,每一根弹簧针对应卡片上的一个穿孔位置,如果有个地方打孔了,针会穿过孔与水银池里的水银接触,形成通路,这个电路出发电磁体就能进行十进制计数。

这本现代魔法原理指南,把计算机体系掰开揉碎讲清楚了_第5张图片

在 1890 年人口普查中,上图这样的半自动打表机总共处理了超过 6200 万张卡片,使人口普查在短短两年半内完成,也给人口普查办公室省了上百万美元。企业开始意识到,计算机可以提升劳动力并完成数据密集型的任务。Hollerith 后来成立了制表机器公司,后来与其它机械制造商合并成为了 「国际商业机器公司」,也就是大名鼎鼎的 IBM。

这种「商业机器」带来了更快、更灵活的数据处理,为电子计算机的发展奠定了深远基础。

从算盘到芯片,这本书不仅介绍了工具的演进,还把这些技术变革放进广袤的历史背景中进行叙述,让读者不禁感叹一位位技术天才的巧思。

而身处历史中的我们,也正在参与新一轮的技术革命。

这本现代魔法原理指南,把计算机体系掰开揉碎讲清楚了_第6张图片

《编码》整本书自底向上、一气呵成。无论是小白还是资深程序员,闲暇时读一读,正本清源,开卷有益。

想要了解更多详细内容?关注公众号并回复书名「编码」,即可获得小编整理的《编码:隐匿在计算机软硬件背后的语言》高清思维导图

福利时间

**理解计算机底层逻辑,
对程序员有多重要?**

对技术感兴趣的你,有哪些心头好书?

欢迎在评论区留言你的想法,

我们将选取一位小伙伴,

赠送纸质版《编码:隐匿在计算机软硬件背后的语言》一本!

积累代码量很重要,

读书、读好书也很重要。

「Zilliz 好书推荐」栏目,

旨在与你分享技术成长相关的书籍,

与你一起先把书读厚,再把书读薄。

你可能感兴趣的:(程序员)