读《编码:隐匿在计算机软硬件背后的语言》
第一次听说这本书,是在今年过年的时候,在 bang 的博客上看到他对这本书的评价非常高,他甚至感叹到,如果学校里能像这本书中讲述方式一样去教学生,那么也就不会有那么多学生是去学习的兴趣了。
后来在金旭亮老师介绍如何自学计算机课程时,他也推荐了这本书,可以作为学习计算机组成原理的入门读物。
因为我是非科班出身,最近开始补计算机课程,这本书便成为了我的第二本教材。
与作为教材的《计算机科学概论》相比,这本书更像是科普读物,以讲故事的形式,深入浅出地讲解了一台计算机是怎么制造出来的以及计算机科学的发展史,是一本绝佳的入门读物,但是如果要更系统、更全面和深入地学习计算机科学,还是需要再看一看专业教材,比如大名鼎鼎的 CSAPP。
一句话概括,这本书值得每个程序员读一读。
编码是一种用来传递信息的方式,我们使用不同的编码来为我们的交流服务。比如,盲文就是一种编码、电报报文也是一种编码。我们甚至可以说,我们每天说话交流的每一个词汇也是编码,聋哑人用的手语也是一种编码。
在计算机和电子设备中存储和传递文字、音频、图片、视频时,也使用了编码,因为计算机不能像人一样能够用直接通过眼睛、耳朵、嘴巴等方式来接收信息,计算机只认识 0 和 1。不同类型的信息使用了不同的编码。
莫尔斯码也被称作二进制码,因为这种编码的组成元素只有两个——“点”和“划”。
也就是说莫尔斯码的每一位只有两种表示,这一点跟二进制数很相似。所以一个莫尔斯码所能表示的数目大小可以用下面的公式表示:
有一种比莫尔斯码更早的编码方式,叫做布莱叶盲文,是法国的一个盲人布莱叶发明的。
换挡码和逃逸码
手电筒有一个开关,开关控制电路的中电流是否接通。开关只能是闭合状态或者断开状态。电流只能是有或者无。灯泡也只能是发光或不发光。跟莫尔斯和布莱叶发明的编码中每一位的值一样,只有两种状态。
二进制码和电气电路之间有一定的联系。
搭建一个简单的电报系统:通过电线将通讯两方连接起来,接收方有一个灯泡,发送方通过控制灯泡的开关,然后就可以发送摩尔斯编码了。
计算机系统正是基于这个装置构建出来的。
莫尔斯发明的电报机:发报时通过控制按压电键的时间长短来表示“点”和“划”,收报时通过听声音的长短来区分“点”和“划”。
但是一开始,电报机的有效距离不能太长,于是后来出现了继电器,这个继电器可以将接收到的信息转发出去。
继电器的本质是一个开关,但是这个开关的闭合和断开并不是由人来操纵的,而是由电流控制的。
延伸阅读:
大多数文明都建立在以 10 为基数的数字系统上,因为人们用自己的手指来计数。
早期的数字系统只有罗马数字和阿拉伯数字沿用到了今天,而且今天使用最广泛的就是阿拉伯数字。
阿拉伯数字相比其他计数系统的几个特点:
而位置计数法不仅仅适用于十进制,还适用于其他计数系统,比如八进制、二进制。
十进制中,我们用 0~9 这十个符号来表示所有的数字。“十”没有特定的符号,我们用 10 表示“十”。
同样,在八进制中也没有专门表示“八”的符号,我们也是用 10 来表示“八”。
四进制和二进制也是同样的表示方式。
二进制数字系统是最简单的数字系统,它的加法表和乘法表是最简单的。
二进制数字系统在算术和电子技术之间架起了一座桥梁,开关是否打开、电线中是否有电流通过、灯泡是否点亮、电报继电器是否闭合都可以用二进制数 0 和 1 来表示。
大约在 1947 年,美国数学家 John Wilder Turkey 首次用 bit 来表示二进制位 binary digit,一直沿用至今。
延伸阅读:
二进制的特殊性:它是最简单的数字系统。
在计算机时代,比特被看做是组成信息块的基本单位。
二进制并不是传达信息的唯一方法,但是比特所传递的“信息量”极小,1 比特是可能存在的最小信息量。
复杂一些的信息可以用多位二进制数来表达。
信息本质上是指多个可能性中的一种,而比特本质上就是数字。所以,我们可以说,所有可以被转换成两种或者多种可能性的选择的信息,都可以用比特来表示。比如文字、图片、声音、视频、条形码、评分等等。
用比特表示其他信息的时候,我们所要做的就是计算有多少种可能性,每种可能性对应一个编码。
我们通常所讨论的二进制数,都是指有一定位数的二进制数,比特位越多,所表示的可能性越多。
跟十进制类似,在二进制中,一个二进制数可以表示的编码数目等于 2 的整数次幂,其幂指数就是比特位的位数。
在日常生活中,我们一般是看不到比特的,因为它们深藏于 CD、计算机等电子产品中的编码,但在某些场合还是可以看得到的,比如商品包装上的条形码(UPC)。
在逻辑学中也可以找到比特的影子,逻辑学是哲学和数学的结合,其主要目的就是确定某个陈述是真还是假,而真和假同样可以用 1 和 0 来表示。
延伸阅读
Claude Elwood Shannon 首次提出了:电子工程师可以运用布尔代数去设计开关电路。
从这里开始,继电器将会极少地出现了,以后的电路会由缓冲器、反向器、四种基本逻辑电路和其他由逻辑门组成的复杂电路组成。当然,所有这些器件也是由继电器构成的。
摩根定律是简化布尔表达式的一种重要手段,可以用来简化电路:
二进制加法跟十进制相似,也是各位数字相加的组合。
二进制加法的加法表比十进制更简单。
一对二进制数字相加的结果中有两个数位,其中一个叫做加法位,另一位叫做进位位。所以二进制加法表可以表示成下面这样:
使用逻辑门制作一个半加器和一个全加器。
减法和加法的本质区别是,加法中有进位,而减法中没有进位只有借位,也就是说,减法运算中在计算低位时可能需要向更高一位借位,这样就会导致一位运算变成多位运算了。
举个例子,下面这个加法计算
可以拆成两步:
而下面的减法运算
就变成这样了:
减法表达式:
避免借位的关键是保证被减数每一位都比减数中相同位置的数要大,所以我们这里需要用到 对 9 求补数 的概念。
以 253 - 176 为例,为了在计算时不涉及到借位,我们可以将其转成 (999 - 176) + 253 + 1 - 1000 ,就可以得到最终结果了。
步骤:
以 176 - 253 为例,为了在计算时不涉及到借位,我们可以先通过计算 999 - ((999 - 253) + 176 得到最终结果的绝对值,然后再取相反数,。
步骤:
以 253 - 176 (也就是 1111 1101 - 1011 0000 )为例,为了在计算时不涉及到借位,我们可以将其转成 (1111 1111 - 1011 0000) + 1111 1101 + 1 - 1 0000 0000 ,就可以得到最终结果了。
步骤:
以 176 - 253 (也就是 1011 0000 - 1111 1101 )为例,为了在计算时不涉及到借位,我们可以先通过计算 1111 1111 - ((1111 1111 - 1111 1101) + 1011 0000) 得到结果的绝对值,然后再取相反数,就可以得到最终结果了。
步骤:
振荡器:可以在不需要人为干涉的情况下,完全自发地改变状态。振荡器是用来产生重复电子讯号(通常是正弦波或方波)的电子元件。其构成的电路叫振荡电路。能将直流电转换为具有一定频率交流电信号输出的电子电路或装置。
当采用 0 和 1 的交替序列来表示振荡器的输出时,我们可以用下面的图来描述输出。
反馈就是将电子系统中输出回路的输出量(输出电压或输出电流)的一部分或全部,通过一定的电路(反馈网络)反向送回到输入端或输入回路,进而对输入量产生影响的连接形式(过程)。
触发器(Flip Flop)是一种可以存储电路状态的电子元件。最简单的是由两个或非门,两个输入端和两个输出端组成的RS触发器。
触发器的电路图由逻辑门组合而成,其结构均由R-S锁存器派生而来(广义的触发器包括锁存器)。触发器可以处理输入、输出信号和时钟频率之间的相互影响。
这一章主要是通过观察微处理器和外部设备的交互过程,来认识其内部的结构和工作原理。这里作者将微处理器看做一个黑盒,主要的研究方法是通过观测芯片的输入、输出信号。特别是芯片的指令集来理解微处理器的工作原理。
2022-05-15 广告