这本现代魔法原理指南,把计算机体系掰开揉碎讲清楚了
🤫 关注 Zilliz 公众号并回复「编码」🤫
获取《编码:隐匿在计算机软硬
件背后的语言》超详细思维导图
「储存器(storage)和内存(memory)有什么区别?」
「为什么 MacOS 环境下的程序不能在 Windows 下运行?」
……
Windows 编程界的传奇人物 Charles Petzold 说,当他想要回答这些问题时,他一张开嘴就立刻意识到,可以回答的内容实在太多了,为了把这些问题掰开揉碎讲清楚,他写下**《编码:隐匿在计算机软硬件背后的语言》**这本经典。
1994 年,Petzold 被授予 Windows 先锋奖,他的著作 Programming Windows 是学习微软编程的必读之作,而这本讲述计算机工作体系的书籍,更是堪称现代魔法原理指南。
在这本书中,Petzold 不断提出难题并带领读者解决问题。
如果你是计算机科班出身,重读基本原理、了解计算机发展脉络,正本清源,开卷有益;如果你是计算机小白,你可以跟着作者的步伐搭积木,把导线、灯泡、开关、逻辑门等部件组装起来,经过层层抽象后,你将会用逻辑思维构建一个完整的 CPU !
你将从这本书中获得:
了解计算机发展整体历史脉络
自底向上理解 CPU 工作原理
学会层层抽象的思维方式,将已经发明的工具封装抽象起来,向上构建体系
从布莱叶盲文到二进制编码
编码是如何产生的、什么要使用编码?这是这本书探讨的主要问题。
小编认为最精彩的部分,是在讲解摩斯电码之后,作者进一步介绍盲文的诞生:
霍伊先生视力健全,因此他被自身的感知模式所禁锢。对他来说,一个字母 A 就是一个 A,字母 A 在记录时必须看起来(或者)感觉起来像一个 A。霍伊先生没有意识到,有一种完全不同于印刷字母的文字系统可能更适合盲人阅读。
法国军队的一位军官在 1819 年发明了一种他自称为「夜间书写」的文字系统。他在厚纸上使用凸起的点和划的组合来表示文字,这样当部队需要无声交流时,即使光线很暗,士兵们也可以通过这些符号互相传递信息。
……一个盲人学生如果有了纸张和笔,他就可以做笔记,同时还能阅读记下的文字。12 岁的盲人小孩布莱叶开始不辞辛劳地改进这个文字系统……
在布莱叶盲文中,字母、数字、标点等符号都被编码为 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 阵列中保存。如下图所示:
下一个问题是,如何配置一个自动加法器,使它不仅可以对一组数字做累加运算,还能自主确定累加了多少数字,并且能记住在 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 指令。
为了解决结果不能大于 255 的问题,我们可以把加数拆分,分别计算高字节和低字节的和,然后合并就可以得到结果。
低字节加法计算后可能需要进位,这个进位需要与高字节累加才是正确结果,解决方法是:引入进位锁存器和进位加法的指令,专门保存进位的值,然后再和高字节累加计算。
目前,这个电路可以计算 8 位数的加法运算,以及 16、24、32 及以上位数的加减运算。虽然可以完成计算的基本功能,但是还不够完美,因为现在的电路使用地址空间是要非常小心的,如果不注意,就会发生地址被覆盖的情况,导致执行错误。
为了解决这个问题,我们加入一个跳转指令,同时改造电路,使指令的后两个字节输出也可以输出到计数器,然后通过计数器来确定遇到跳转指令后,计数器输出需跳转的地址,完成跳转寻址。
如何完成两数相乘的运算?那么就可以使用跳转指令 + 跳转条件来配合完成。所以,我们需要再增加一个锁存器,叫做零锁存器,只有当加法器的输出全部为 0 时它的值才是 1。通过计数器和零锁存器的配合,就可以实现乘法运算。同理,实现除法、平方根、取对数、三角函数运算也都是可行的。
到这里,我们完成了一个计算机的核心功能,包括:处理器、存储器、输入设备、输出设备。这里的处理器即是 CPU,主要负责控制和逻辑运算。
尽管在高级语言编程中基本用不到汇编,但是理解计算机的底层逻辑对程序的优化有至关重要的作用。任何一个有追求的程序员,都应当对计算机的底层原理如数家珍。
从实验室走进寻常百姓家
到了 19 世纪末,科学和工程领域中的特定任务会用上计算设备,但公司、政府、家庭中很少见到计算设备。计算机如何一步步商业化的?
1880 年,美国政府按照宪法进行十年一次的人口普查。然而,当时美国人口迅速增长,如果按照传统的方法,要七年时间来手工编制,等做完都过时了,1890 年的人口普查甚至预计要 13 年才能完成。人口普查局找到了 Herman Hollerith,他发明了制表机,结合了人工操作和机械打表,结构类似莱布尼茨的乘法器,但用电动结构连接其他组件。操作人员把一个有 288 个弹簧针的板子压到每一个卡片上,每一根弹簧针对应卡片上的一个穿孔位置,如果有个地方打孔了,针会穿过孔与水银池里的水银接触,形成通路,这个电路出发电磁体就能进行十进制计数。
在 1890 年人口普查中,上图这样的半自动打表机总共处理了超过 6200 万张卡片,使人口普查在短短两年半内完成,也给人口普查办公室省了上百万美元。企业开始意识到,计算机可以提升劳动力并完成数据密集型的任务。Hollerith 后来成立了制表机器公司,后来与其它机械制造商合并成为了 「国际商业机器公司」,也就是大名鼎鼎的 IBM。
这种「商业机器」带来了更快、更灵活的数据处理,为电子计算机的发展奠定了深远基础。
从算盘到芯片,这本书不仅介绍了工具的演进,还把这些技术变革放进广袤的历史背景中进行叙述,让读者不禁感叹一位位技术天才的巧思。
而身处历史中的我们,也正在参与新一轮的技术革命。
《编码》整本书自底向上、一气呵成。无论是小白还是资深程序员,闲暇时读一读,正本清源,开卷有益。
积累代码量很重要,
读书、读好书也很重要。
「Zilliz 好书推荐」栏目,
旨在与你分享技术成长相关的书籍,
与你一起先把书读厚,再把书读薄。
——————————————————————————
Zilliz 以重新定义数据科学为愿景,致力于打造一家全球领先的开源技术创新公司,并通过开源和云原生解决方案为企业解锁非结构化数据的隐藏价值。
Zilliz 构建了 Milvus 向量数据库,以加快下一代数据平台的发展。Milvus 数据库是 LF AI & Data 基金会的毕业项目,能够管理大量非结构化数据集,在新药发现、推荐系统、聊天机器人等方面具有广泛的应用。
版权声明: 本文为 InfoQ 作者【Zilliz】的原创文章。
原文链接:【http://xie.infoq.cn/article/ba7433974810824e7d89361f0】。文章转载请联系作者。
评论