天天看点

浅读《编码:隐匿在计算机硬件背后的语言》上

作者:循老师

概览

浅读《编码:隐匿在计算机硬件背后的语言》上

书籍简介

这是一本讲述计算机工作原理的书。不过,你千万不要因为“工作原理”之类的字眼就武断地认为,它是晦涩而难懂的。作者用丰富的想象和清晰的笔墨将看似繁杂的理论阐述得通俗易懂,你丝毫不会感到枯燥和生硬。更重要的是,你会因此而获得对计算机工作原理较深刻的理解。这种理解不是抽象层面上的,而是具有一定深度的,这种深度甚至不逊于“电气工程师”和“程序员”的理解。

作者介绍

介绍一

浅读《编码:隐匿在计算机硬件背后的语言》上

介绍二

浅读《编码:隐匿在计算机硬件背后的语言》上

部分精彩点评

浅读《编码:隐匿在计算机硬件背后的语言》上
浅读《编码:隐匿在计算机硬件背后的语言》上
浅读《编码:隐匿在计算机硬件背后的语言》上

节选内容

用手电筒隔着大街聊天

你今年10岁,你最好的朋友就住在街对过。事实上,你们各自卧室的窗户正好彼此相对。

直接方案:手电筒能用来交谈吗?这当然值得一试。我们在一年级的时候学习怎样在纸上写字母和单词,因此,把同样的方法运用到手电筒上似乎也是有道理的。只需要站在窗户边,用光来画出字母。对于字母“O”,打开手电筒,在空气中划一个圈,然后关掉手电筒。对于字母“I”,竖着划一下。

演进方案:“A”是闪一次,“B”是闪两次,“C”是闪三次,依此类推,“Z”就是闪26次。单词BAD可以用闪2次,闪1次,闪4次这样的一个组合来表示,而且在字符之间设置的小停顿使这个单词不至于被误认为是闪7次的字母“G”。另外,单词之间停顿可以稍长些。

Morse码:则有两种闪烁——短闪和长闪

浅读《编码:隐匿在计算机硬件背后的语言》上
浅读《编码:隐匿在计算机硬件背后的语言》上

详解Morse码

莫尔斯码(Morse Code)是由塞缪尔·莫尔斯发明的(1791-1872)

比起发送莫尔斯码,接收编码并进行解码要费时费力得多,因为译码者不得不根据一串由“点”、“划”组成的晦涩的编码序列来反查字母。例如,如果你接收到一串形如“划-点-划-划”的编码,那么你就必须从表的第一个字母开始逐个搜寻,直到找到与这串编码相符的字母“Y”为止。问题就出在这里,因为我们现在只有一张提供“字母→莫尔斯码”的编码表,而缺少一张可以实现反向查询的“莫尔斯码→字母”译码表。在开始学习莫尔斯码的初级阶段,如果有这样的一个表无疑将是很方便的。但是要建立这样一张表,谈何容易。似乎这些字母对应的“点-划”序列并没有什么规律。

忘掉字母序列。根据编码中所包含点、划的多少来对其进行分组,是一个更好的组织这些编码的方法

一组含有2个点或划的编码组合,可以给我们呈现出4个字母——I,A,N和M。

浅读《编码:隐匿在计算机硬件背后的语言》上

一组含有3个点或划的莫尔斯码可以为我们表示更多的字母。

浅读《编码:隐匿在计算机硬件背后的语言》上

最后(如果我们不想考虑存在数字和标点符号的莫尔斯码的情况),一串由4个点或划组成的莫尔斯码就可以表示16个字符

浅读《编码:隐匿在计算机硬件背后的语言》上

每个表格所包含的码字数目都是前一张的两倍。这其实很好理解:每个表格所含有的码字,可以看成是在前一张表格所包含的全部码字上再加一个“点”,或者再加一个“划”而组成的新码字。

浅读《编码:隐匿在计算机硬件背后的语言》上

每张表的码字数都是前一张表码字数量的两倍

浅读《编码:隐匿在计算机硬件背后的语言》上

当对一串码字进行解码时,我们需要沿着箭头从左向右进行搜寻。以“点-划-点”的码字为例来说,当你需要找出这串码字所代表的字母时,应首先从图的左边开始,选择“点”的分支;然后继续沿着箭头向右选择“划”,接着又是一个“点”。找到最后一个“点”时结果就会紧随其后出现了,没错就是字母“R”

浅读《编码:隐匿在计算机硬件背后的语言》上

上面所做的关于二进制编码的分析工作,其实是数学的一个分支,称作“组合学”或“组合分析”,而我们所作的分析则只能说是一个简单的练习。传统意义上来说,因为组合分析涉及类似像扔硬币、掷骰子这样的需要对其组合数目进行推算的问题,所以它经常被应用到概率和统计学中。但是它对于我们理解码字的组合与分解也是十分有帮助的。

解析布莱叶盲文

在布莱叶盲文中,每个在书写文字中用到的符号——具体来说就是字母、数字和标点符号——都被编码成为2×3的点码单元中的一个或者多个凸起的点。这个点码单元包含的点通常使用1到6的数字来编号。

浅读《编码:隐匿在计算机硬件背后的语言》上

小写字母表

浅读《编码:隐匿在计算机硬件背后的语言》上
浅读《编码:隐匿在计算机硬件背后的语言》上

可以总结出一个规律。第一排(字母a到j)只用到了点码单元中最上面的四个点——第1、2、4和5点。第二排在复用了第一排的编码的基础上,把第3点改为凸点。第三排也沿用了同样的规律,只是将第3和6点改为凸点。

目前在英文出版物中最常用的盲文系统被称为二级布莱叶盲文(Grade 2 Braille)。二级布莱叶盲文使用了很多缩写,以便于保存树型结构和提高阅读速度。例如,如果字母的码字单独出现,它们就表示一个普通的单词。以下三排图样(包含“完整的”第三排)为我们展示了这些单词的码字。

浅读《编码:隐匿在计算机硬件背后的语言》上
浅读《编码:隐匿在计算机硬件背后的语言》上

看一个电路图演进

普通双向电报系统

浅读《编码:隐匿在计算机硬件背后的语言》上

优质节省25%的导线

浅读《编码:隐匿在计算机硬件背后的语言》上

极致电报系统

电报机-继电器

电磁铁

浅读《编码:隐匿在计算机硬件背后的语言》上

传统电报机

其实只是一个被设计成有“最大开闭速度”的开关而已。如果需要长时间使用电键,最舒适的方法是,用拇指,食指和中指握住手柄,轻击它使其上下移动。保持电键的按下状态一小段时间,就会产生一个“点”的莫尔斯码。按下状态保持的时间更长一些就会产生一个“划”的莫尔斯码

浅读《编码:隐匿在计算机硬件背后的语言》上

线路的另一端是一个接收器,它主要是由一块电磁铁拉动一根金属杆构成的。最初,电磁铁控制的是一只钢笔。有一个装置通过使用一个压紧的弹簧来拉动一卷纸经过设备,与电磁铁连接着的钢笔就会弹起或落下,在纸上画出点和划。能读懂莫尔斯电码的人员就可以把这些“点”和“划”译成字母和单词了。当然,我们人类是个懒惰的物种,电报操作员们很快发现,他们可以很容易地通过听钢笔弹起和落下的声音来翻译电码。在传统电报机中的“发声器”的帮助下,钢笔最终被废弃,整个装置看起来如下图所示。

继电器

开始时,你喜欢接收完一条完整的信息后再把它转发。首先,根据发声器发出的滴答声,将字母记下来;当信息接收完毕时,再开始用你的电键来发送。最后,你终于掌握了诀窍,在听到滴答声的同时就可以发送信息,不需要再把信息记录下来了。这节约了不少时间。

有一天,当你正在转发信息时,瞄了瞄发声器上那根上蹿下跳的横杠,又看了看在电键上上下翻飞的手指。然后你就这样来来回回地瞅来瞅去,恍然发现发声器上下跳跃的节奏与电键是一致的。因此你就去外面找了根小木棍,然后用木棍和一些细绳把发声器和电键连接到了一起,如下图所示。

继电器与发声器很像,传进来的电流驱动电磁铁拉动金属杠,金属杠同时又作为一个开关的组成部分,而这个开关连接着电池和输出线路。通过这种方法,输入的比较弱的电流就被“放大”成了较强的输出电流。

浅读《编码:隐匿在计算机硬件背后的语言》上

当输入的电流触发了电磁铁,电磁铁把一个弹性金属条吸附下来,就像闭合了开关一样,使电流可以从接口输出

浅读《编码:隐匿在计算机硬件背后的语言》上
浅读《编码:隐匿在计算机硬件背后的语言》上

因此,把一个电报机电键、一个继电器,还有一个发声器连接好,差不多就是下图的这个样子。

浅读《编码:隐匿在计算机硬件背后的语言》上

十进制

浅读《编码:隐匿在计算机硬件背后的语言》上

数字最初起源于对事物的计数

如果有一个人有四只鸭子

浅读《编码:隐匿在计算机硬件背后的语言》上

进一步表示为

浅读《编码:隐匿在计算机硬件背后的语言》上

假设有27只鸭子

浅读《编码:隐匿在计算机硬件背后的语言》上

早期的数字系统中,只有罗马数字沿用到了今天

浅读《编码:隐匿在计算机硬件背后的语言》上

沿用到今天的罗马数字符号有 I V X L C D M

这里,字母I表示1,可以看做是一个划线或者一根伸出的手指。字母V像一只手,表示5。两个V是一个X,代表数字10。L是50。C来自单词centum,表示100。D是500。最后一个,M来自于拉丁文mille,意为1000。

罗马数字易于加减而难于乘除。加法:五个I是一个V,两个V是一个X,五个X是一个L,以此类推

我们所用的数字系统通常被称为阿拉伯数字,也可以称为印度-阿拉伯数字系统。它起源于印度

  • 阿拉伯数字系统是和位置相关的。100和1,000,000这两个数中都只有一个1,而我们知道,1,000,000要远远大于100
  • 早期的数字系统中也有一点是阿拉伯数字系统所没有的,那就是用来表示数字10的专门的符号
  • 阿拉伯数字也有一点是几乎所有早期数字系统所没有的,而这恰恰是一个比代表数字10的符号还重要得多的符号,那就是0。零无疑是数字和数学史上最重要的发明之一。它支持位置计数法,因此可以将25、205和250区分开来。

假设我们使用的不是十进制

书写十进制和八进制数时,我们可以利用下标标注来区别不同数字系统,避免混淆。下标TEN表示十进制,EIGHT表示八进制。

白雪公主遇到的小矮人数量是7TEN或7EIGHT;

卡通人物的手指数是8TEN或10EIGHT;

贝多芬所写的交响曲的数目是9TEN或11EIGHT;

人类手指的数量是10TEN或12EIGHT;

一年中的月份数是12TEN或14EIGHT;

两个星期的天数是14TEN或16EIGHT;

“情人”的生日庆祝会是16TEN或20EIGHT;

一天中的小时数是24TEN或30EIGHT;

拉丁字母表中的字母数是26TEN或32EIGHT;

...

在结构上,八进制数字系统与十进制数字系统并没有什么不同。它们只是在细节上存在一些差异。例如,八进制数中的每个位所代表的值是该位数字乘以8的整数次幂的结果。

浅读《编码:隐匿在计算机硬件背后的语言》上

二进制

二进制数的时候通常将它们写成带有前导零的形式(即第一个1的左边有零)。例如0011,而不是写做11。这样写不会改变数字的大小,仅仅是为了美观。例如,以下是前16个二进制数以及与它们等价的十进制数。

浅读《编码:隐匿在计算机硬件背后的语言》上

电线可以表示二进制数字。如果有电流流过这根电线就代表二进制数字1,如果没有,则代表二进制数字0。开关可以表示二进制数字。如果开关接通(或闭合)就代表二进制数字1,如果开关关断(或断开),则代表二进制数字0。灯泡可以表示二进制数字。如果灯泡点亮,就代表二进制数字1,如果没点亮,则代表二进制数字0。电报继电器可以表示二进制数字。如果继电器闭合,就代表二进制数字1,如果断开,则代表二进制数字0。

二进制数与计算机之间有着紧密的联系

大约在1948年,美国数学家约翰·威尔德·特克(John Wilder Turkey,生于1915年)就意识到随着计算机的普及,二进制数很可能会在未来发挥更重要的作用。他决定创造一个新的、更短的词语来代替使用起来很不方便的五音节词——binary digit。他曾经考虑使用bigit和binit,但是最终他还是选用了这个短小、简单、精巧而且非常可爱的词——bit

二进制数逻辑与开关

二进制对实体世界的表达:0和1的组合

二进制的运算:逻辑与开关。

浅读《编码:隐匿在计算机硬件背后的语言》上
浅读《编码:隐匿在计算机硬件背后的语言》上

浅读《编码:隐匿在计算机硬件背后的语言》上
浅读《编码:隐匿在计算机硬件背后的语言》上

继电器像开关一样,可以串联或并联在电路中执行简单的逻辑任务。这种继电器的组合叫做逻辑门(logic gates)

前面提到过,继电器对于电报系统的工作而言是至关重要的。在长距离情况下,连接电报站的电线具有很高的电阻。这就需要采取一些措施来接收微弱信号并把它增强后再发射出去。继电器就是通过电磁铁控制开关来实现这一目的的。实际上,继电器是通过放大微弱信号来生成强信号的

可以这么用

浅读《编码:隐匿在计算机硬件背后的语言》上

也可以这么用

浅读《编码:隐匿在计算机硬件背后的语言》上

继电器串联-与

浅读《编码:隐匿在计算机硬件背后的语言》上

两个继电器的串联被称为一个“与门”。为了避免复杂的图示,电气工程师用如下专门的符号表示一个与门

浅读《编码:隐匿在计算机硬件背后的语言》上

其实就是

浅读《编码:隐匿在计算机硬件背后的语言》上

衍生去看

浅读《编码:隐匿在计算机硬件背后的语言》上
浅读《编码:隐匿在计算机硬件背后的语言》上
浅读《编码:隐匿在计算机硬件背后的语言》上

继电器并联-或

浅读《编码:隐匿在计算机硬件背后的语言》上

这里的关键词是“或”,因此这样的门被称为“或门”。电气工程师用如下符号表示或门。

浅读《编码:隐匿在计算机硬件背后的语言》上

或门的两个输入中,只要有一个加上电压,输出就是高电平。如果将低电平看做0,高电平看做1,那么或门也有四种可能的组合状态

浅读《编码:隐匿在计算机硬件背后的语言》上

继电器反着玩-反向器-非

浅读《编码:隐匿在计算机硬件背后的语言》上

开关闭合,灯泡就会熄灭。以这种方式连接的继电器叫做反向器(inverter)。反向器不是逻辑门(一个逻辑门通常有两个或多个输入),尽管如此,它的用处还是很广。反向器可以用如下的专门符号来表示。

浅读《编码:隐匿在计算机硬件背后的语言》上
浅读《编码:隐匿在计算机硬件背后的语言》上

或非门

浅读《编码:隐匿在计算机硬件背后的语言》上
浅读《编码:隐匿在计算机硬件背后的语言》上
浅读《编码:隐匿在计算机硬件背后的语言》上

与非门

浅读《编码:隐匿在计算机硬件背后的语言》上
浅读《编码:隐匿在计算机硬件背后的语言》上
浅读《编码:隐匿在计算机硬件背后的语言》上

反馈与触发器

电路

浅读《编码:隐匿在计算机硬件背后的语言》上

结果

浅读《编码:隐匿在计算机硬件背后的语言》上
浅读《编码:隐匿在计算机硬件背后的语言》上

周期的倒数就是振荡器的频率(frequency)。在这个例子中振荡器的周期是0.05s,那么其频率就是1÷0.05s,即振荡器每秒钟产生20次循环,而相应的输出每秒钟也变化20次

浅读《编码:隐匿在计算机硬件背后的语言》上

为了纪念发送和接收无线电波的第一人——亨利希·鲁道夫·赫兹(1857-1894),后人使用“赫兹”这个词来表示这一概念

特殊的或非门

或非门:或非门的特点是只有在两个输入端都没有电压时,输出端才产生电压

浅读《编码:隐匿在计算机硬件背后的语言》上

左边或非门的输出是右边或非门的输入,而右边或非门的输出是左边或非门的输入。这种连接方式我们称之为反馈(feedback)

浅读《编码:隐匿在计算机硬件背后的语言》上

在初始状态下,电路中只有左边的或非门输出电流,这是因为其两个输入均为0。让我们闭合上面的开关,左边或非门将立刻输出0,右边或非门的输出也会随之变为1,这时灯泡将被点亮。

浅读《编码:隐匿在计算机硬件背后的语言》上

奇妙的是,这时一旦你关闭上边的开关,灯炮依然闪闪发光。这是因为由于左边或非门的输入中有一个为1,其输出依然是0,因而左边或非门的输出不变,所以灯泡仍然亮着

浅读《编码:隐匿在计算机硬件背后的语言》上

闭合下面的开关。我们会发现右边或非门的输入中有一个立刻变为1,其输出就相应地变为0,灯泡随之熄灭。左边或非门的输出此刻变为1

浅读《编码:隐匿在计算机硬件背后的语言》上

再去断开下面的开关就会发现,灯泡一直处在熄灭状态

浅读《编码:隐匿在计算机硬件背后的语言》上

同样是在两个开关都断开的状态下,灯泡有时亮着,有时却不亮。当两个开关都断开时,电路有两个稳定态,这类电路统称为触发器(Flip-Flop)

触发器电路可以保持信息,它可以“记住”某些信息

触发器种类繁多,先前所讲述的是最简单的一种R-S(Reset-Set,复位/置位)触发器。我们通常把两个非或门绘制成另一种形式,加上标识符就得到了下面这幅图

未完待续...

继续阅读