CatTalk's Blog

《编码》隐匿在计算机软硬件背后的语言

1.至亲密友

从一个小故事出发:你和你的小伙伴的卧室阁楼相望,卧室中既没电话也没电脑…晚上如何简单有效的交流,总不能靠喊吧!手电筒🔦值得一试,但如何通过手电筒传达你需要表达的信息呢,并且让对方成功get到; 通过手电筒的亮和灭,短亮和长亮就能达到交流的目的,但不是最有效.... 随即就引出了摩斯电码 Morse Code,通过点(dot)和划(dash)来表达信息,比如通过摩斯电码来表示字母表如下

编码就是交流,不论是摩斯电码还是文字,口头语言以及后面要提到的布莱叶盲文,其实都是对信息的编码,用于信息传递和交流……

仅仅靠简单的点和划就能编码很多信息...其实摩斯电码是很典型的二进制编码,通过不同的组合,就可以表示所有类型的信息。

与中国所讲的“阴阳☯️”有异曲同工之妙! 4153e6023405eb64cb86805eaad749ef

2.编码与组合

点和划的数目和所编码字的数目关系

2的乘方,其实这是数学中的排列组合知识

3.布莱叶盲文与二进制码

详细介绍了布莱叶盲文,通过凸起和平坦的点(类似于摩斯电码中的dot和dash)编码,同时扩充了在不同的上下文情况下不同的编码含义,提到了“escape codes”(逃逸码)和“shift codes”换挡码,这也是二进制编码中的常用概念..后续会降到

1-3总结:从一则小故事引出信息编码的场景,和摩斯电码,布莱叶盲文...找出其中的编码特点,进而引申出二进制编码

2018 10 22

4.手电筒的解析

拆开手电筒,我们来了解下“电”的基本概念(以下基本上都是中学物理电学内容。包括一些基本概念:电路、原子、原子的构成(质子、中子、电子),电流的产生原因(电子的定向移动形成电流)。进一步说其实是环路上的原子之间发生电子迁移=》定向移动=〉行程电流。那环路上电子迁移的能力就进一步提到了导体,易于发生这种电子迁移的就是导体,。衡量这种能力的就是电阻,提到了欧姆定律。电流的计量,电压的计量等等

5.绕过拐角的通信

其实本篇主要讲的是如何远距离供电:如何减少电在远距离传输中的损耗(降低电阻),降低材料成本(地线)

6.电报机与继电器

有了前面对“电”的基本了解和远距离供电的知识,引出了远距离通信的场景: 摩斯利用电磁现象,在远距离上通过控制一端开关的闭合从而在另一端产生对应的电磁现象,达到传递信息的目的,虽然简陋但高效可用;另一个解决远距离传输中电损耗的问题就是继电器,通过电磁现象将电压放大;

虽然简单,事实上这已经是现代计算机通信模型的基石!

4-6总结: 从手电筒的解析介绍了电学基本知识,包括电流电压以及常见定律,又介绍了远距离供电需要解决的两个问题。之后电报机和继电器的发明正是对上述问题的解决方案 94ec73c2a5872275b2b594024cf90772

7.我们的十个数字

其实不论你生活在哪个国家,使用什么语言,数字基本上都是通用的:0,1,2,3,4,…10。这就是一种典型的编码。将信息编码进数字符号中,看到10你可能会想到10个苹果,10只鸡...

8.十的替代品

我们的计数为什么偏偏是基于10呢 为什么10=🐔🐔🐔🐔🐔🐔🐔🐔🐔🐔 而不是2=🐔🐔🐔🐔🐔🐔🐔🐔🐔🐔 这其实跟计数的诞生有关,正如我们身体有10个手指头,10个脚趾头....那假如我们8个手指,那我们的计数会变成什么样呢: 0,1,2,3,4,5,6,7,10 假如只有两根手指呢 0,1,10... 这其实就是基于不同进制的计数方法

d55a925dfae0af72f544d9dd2c5921da

9.二进制数

前面已经提到了不同进制的计数方法,二进制数字系统有点特殊性。这个特殊性就在于它是人们所能得到的最简单数字系统,显而易见,一个字符很难表示其他数字,因此他俩能编码的信息单位是存在的最小的信息量(1bit) 每增加一个bit位会将编码的数量增加一倍。介绍了胶片🎞️和UPC中二进制的应用

10.逻辑与开关

什么是真理?从亚里士多德的三段论开始,人们就在求索逻辑在数学上的表达。 乔治·布尔发明了布尔代数解决了这一问题,他使用了一套对现有数学符号的抽象(+ -……),数学分支集合学中的交集、补集、并集、差集等等 而这种简化后的逻辑的数学表达可以轻松的通过物理电路表达出来……

11.门

“逻辑门”的工作方式就是简单的让电流通过或者阻断。 前面提到了布尔代数在电路上的表达,而这个等价关系的主要贡献人就是香农,他在论文中指出“电气工程师可以运用布尔代数的所有工具去设计开关电路”。 利用前面的继电器,可以替代人工开关,通过串并联实现各种逻辑门与布尔代数对应,以此便有了实现逻辑运算的前提。

12.二进制加法器

二进制的加法可以分为加法位和进位,通过观察分析,发现加法规则与各种逻辑门类似,通过各种逻辑门的组合便能实现各位的二进制加法表达...最后组成全加法器

b5809be1e6d611faef27160233f03870

13.如何实现减法

前面我们已经学会如何通过连接几个继电器形成逻辑门从而实现加法器...那么如何实现减法呢 从十进制的减法开始,不同于加法的进位,减法会用到借位(被减数不足从前一位借位),这种利用继电器实现就比较复杂,有没有别的方式呢...我们可以利用“减一个数等于加上一个负数”,找到其数学规律。 这里会用到一个补数的数学概念,以及反码..这都是很重要的概念,但介绍起来比较复杂,按下不表....总之可以通过最高有效位(最左位)作为符号位,1表示负,0表示正,这也满足了负数在二进制中的表示。

14.反馈与触发器

一个特殊的继电器电路通过自发的开关循环就可以形成振荡器,之后提到了触发器所能表达的逻辑数

15.字节与十六进制

前面提到了二进制最小的信息单位1bit,那么8位比特流是加法器、数据选择器的输入形式和输出形式...事实上8比特代表1字节(byte)。 有提到十六进制与二进制十进制的转化方法

阅读建议:13—15章,涉及逻辑数学细节较多,建议大家仔细研读这部分章节内容。

1c35b164259af095be3de2737e84ecd6

16.存储器组织

和人类自身的记忆一样,机器也需要有先存储后访问的功能,存储器的职能和作用就在于此。 一个简单的电报继电器(Telegraph Relays)以一定的形式组织起来构成逻辑门,然后再形成触发器,同样具备保存信息的能力。书中前面章节也讨论过一个触发器可以对1位信息进行存储。如后插图所示,由一个反向器、两个与门和两个或非门构成的D型电平触发器。

简化电路可以看到这种类型的电路有一个写操作端,一个输入端和一个输出端,这种电路也叫锁存器。 多个锁存器不同方式连接就可以形成RAM阵列。 其大小是KB,MB,GB,TB

阅读建议:这章节涉及细节较多,尤其锁存器读写原理,建议看不懂的重读11-15章内容

c586adadf38997576e602cc58aa248a4

17.自动操作

前面章节已经实现了一个通过手动控制开关输入,然后观察灯泡💡亮与暗的加法器。虽显笨拙,但已经有了“计算机”的雏形,可以实现简单的加减乘除,还缺少一些自动操作。 我们之前是将手动开关实现输入到加法器,现在在他们之间增加一个RAM阵列,增加一个振荡器和计数器(实现对RAM的寻址),这样就可以将输入将输入保存进RAM阵列。之后它的输出也就成了加法器的输出。同理,我们可以通过将加法器的输出写入RAM阵列而免于直接观察灯泡的显示来验证结果。 而对这俩RAM的写入操作都需要一些额外的指令,如LOAD,ADD、HALT(停止)、STORE等,以及JUMP指令。(指令助记符后来过渡成为了汇编语言),有了以上种种的改进,我们现在已经有了一台计算机的四个主要组成部分:处理器(processor)、储存器、至少一个输入和一个输出设备,以及上面提到的ALU(算术逻辑单元)、程序计数器等。

总之,现在终于可以称得上是一台简单的计算机了!

d34f4bc298c474742c098c9be422f4a4

18.从算盘到芯片

本章基本上是计算机史,但里面提到了几个关键史实,发展脉络,很有意思!

早期阶段:人类通过小石子贝壳树枝之类的计数,慢慢发展成了计数板....在中东和亚洲地区则演变成了我们熟悉的算盘。

后来在数学层面上一些数学家作了努力,用一种对数表的形式将复杂运算进行了简化。这种对数表也很管用,指导人们日常的生活....但很繁琐,随之催生了很多自动化的机械计算器....

再到后来Joseph Marie Jacquard发明的自动织布机中的卡片编程对计算机的历史产生了深远的影响。再到巴贝芝的差分机、解析机...计算机史上的另一个转折点源于美国宪法第一条第二款,这一款中要求每十年进行一次人口普查。为了便于处理这么庞杂的工作,Herman Hollerith制造了制表机,它是组合了人工操作和自动功能的半自动化工具。利用卡片打孔来存储人口信息。结果非常成功..此后一发不可收拾,后来慢慢演变成了今天的IBM公司。

另外提到了计算机史上几个大神级的人物: 图灵:1937年发表论文首次提出了“可计算性(computability)的概念,用来分析哪些事情计算机可以做到,哪些不能。他还为计算机构想了一个抽象模型,即图灵机(Turing Machine)。 冯·诺依曼:提出存储程序概念 香农:发表“通信过程中的代数理论”,确定了开关、继电器和布尔代数之间的关系,开创了信息论。

相应的计算机制造也在变革,从早期的继电器到真空管再到晶体管,他们都是通过起到开关的作用,组合形成逻辑门,再到加法器、触发器等等。书中还提到了硅谷的诞生、仙童半导体、英特尔的创立等等,很有意思。随着不断的发展,真空管或者晶体管的组合连线成了一个实际的产业问题,于是诞生了不同的集成电路方式...这些变革也正在不断推动着强有力的芯片的诞生。最后出现了两款那个时代的经典芯片....

且听下回分解《编码》两种典型的微处理器

c6d4863f008a3e8398a71447cc61f2a7

19.两种典型的微处理器

“微处理器-正是它,将计算机中央处理器的所有构件整合在一起,集成在一个硅芯片上—诞生于1971年。” 从最初两款简单而典型的微处理说起:英特尔1974年4月推出的8080和8月摩托罗拉推出的6800。是两个具有重大历史意义的芯片。 8080和6800都是有40个引脚的集成电路。这些芯片最常见的IC封装大约2英寸长,1/2英寸宽,1/8英寸厚。 本章主要介绍两款处理器40个引脚的基本作用,以及各自对应的指令集和操作码、还包括高低字节位的保存的处理的不同。这两种不同方式分别称为Intel和Motorola方式。后来这两种不同方式的微处理器逐渐发展为Windows采用的主Intel和苹果采用的PowerPc系列。 根据摩尔定律,越来越新增的晶体管,也不断用于提高运行速度,包括用于告诉缓存,进行大量重复计算等等。

624e2f68f9e640c01bb0d2f39af3e50d

20.ASCLL码和字符转换

计算机中的存储器唯一可以存储的就是bit,因为想要用计算机处理信息,那必须把它们按位存储。那么应该如何存储文本呢…… 其实聪明的读者应该能想到我们只需要一套编码系统将文本编码为bit即可。由此诞生了很多版本兼容和特定场景下使用的编码方式,比较有名的ASCLL码和Unicode。

21.总线

在一台计算机中,各个组件包括微处理器、存储器和输入输出设备是如何通信的,依靠的就是总线。 总线可以简单的看作是数字信号的集合,而这些信号被提供给计算机上的每块电路板。这些信号包括地址信号、数据输出信号、数据输入信号、控制信号。不同的信号其实代表了与不同组件的交互。还提到了GPU,视频帧、垂直同步,磁盘的物理结构等,以及存储器和内存的区别。

40845758b8c54ceabf35bbb6b3df0532

22.操作系统

有了前面学习的内容,我们离组装自己的梦幻计算机还差多少...当你组装好一切,按下开关,你觉得你会看到什么! 是的,什么也没有,我们离一个真正运行起来的计算机还差一个软件—操作系统,一个真正在通电后自启的软件...一个01创造的世界。 想想之前我们都是通过手动控制开关来输入数据和控制输出。所以操作系统的第一个任务就是通电后如何自启载入代码指令,这里涉及到中断信号,复位指令。有没有想起我们笔记本蓝屏后强制重启的界面呢(BIOS)…之后就进入了我们创造的数字世界! 然后呢,一旦断电,一切又恢复原样,我们的信息全丢了…不同于RAM,另一种存储介质随之诞生,对应操作系统为了管理这些存储,文件系统应运而生。 操作系统提供的第三个功能是作为中间层,以API的方式为上层应用提供硬件的访问能力。

阅读建议:对操作系统感兴趣的同学可以阅读《计算机科学导论》

23.定点数与浮点数

现实世界中数字就是数字,不管是整数分数还是百分数小数等各种数字与我们形影不离,我们也很容易理解“平均花费7.5元”所代表的真实含义。然而在计算机存储中,整数和分数的转换并不是这么随意。我们知道计算机中的一切数据都是以位的形式存储的,这就意味着所有的数都表示为二进制形式。

我们从整数开始,看看如何以二进制表示这些现实中的数字。整数可以分为正整数和负整数,正整数很容易理解,比如我们可以用三位二进制表示0-7(000-111)的正整数,我们可以采用用一位高位表示正负的方式来表示负整数,同理,三位二进制可以表示的2的补数的范围(-3 - 3)。

数学家还定义了两个整数的比值表示的一类数,称作有理数或者分数,例如3/4,即10进制的0.75,如何用二进制表示呢。借助10进制的计数方式,小数点可以表示为跟10的正整数次幂的关系。0.75=0.... 有一些有理数还很难表示成小数,如1/3=0.33333...还有类似2的平方根,以及不同于实数的虚数等等,这些该如何表示呢?

现实世界中我们习惯于把数字看作是连续的,任意找出两个有理数,总能找出一个位于他们之间的数。但是计算机中非0即1,这一特点决定了它只能处理离散数据。二进制的位数也就决定了能表示的离散的数值的个数。

回归正题,上面的那些小树能表示为二进制数嘛?最简单的方式就是使用BCD码(二进制编码的十进制数)。

通常两个BCD数字存放在一个字节,为了表示正负还需要新增一个符号位。 这种存储和标记方式被称为定点格式,所谓定点是指小数点的位置总是在数的某个特定位置。那么如何知道小数点的位置呢……

科学计数法,有效数,浮点格式,基于科学计数法,存储极大数和极小数的理想方式。类似于10进制中小数点后与10的整数次数幂的关系,可以用2的负整数次数幂来表示。

IEEE浮点数标准定义了两种基本格式:4个字节的单精度格式和8字节的双精度格式。

24.高级语言与低级语言

“每个机器码所能完成的工作,是你能想象到的最微小且最简单的工作—从内存获取一个数,之后加载到处理器,再把它与另一个数相加,最终将运算结果保存到内存等”。

基于以上这些我们很难想象使用这些机器码构成一个完整的程序。前面我们通过手动控制开关输入数据,利用键盘将16进制机器码输入计算机并在显示器显示。显然这些还不够,我们需要一种理想的语言与计算机交流沟通,前面提到过助记符,MOV,ADD等,之前我们是通过手动汇编的方式将这些助记符翻译成对应的机器码,因此理论上计算机可以自动化完成这部分工作。即把助记符与其对应的机器码关联起来,这就是汇编器。

以此类推,我们在助记符更上一层建立抽象的对我们友好的计算机语言,通过翻译层将其最终翻译成对应的机器码....这就是高级语言,翻译工作就是通过编译器完成的。编译器构造比较复杂,主要功能主要包括词法分析,语法分析,语义分析等等。

这期间诞生了很多典型的计算机语言,包括ALGOL、FORTRAN,BASIC、C语言等。

25.图形化革命

要充分利用日益增长的运算和处理能力,较好的一种方法就是不断改进计算机系统中的关键部位。最典型的就是用户界面。

从字符显示到图像像显示是一次伟大的变革,计算机在这次变革中迈出了重要的一步。我们日常所用的纯平显示器属于光栅(raster)显示器。它的原理就像电视机,每一幅图像背后都是一行行的光栅线,这些光栅是电子枪发出光束迅速开会移动覆盖整个屏幕形成的。我们可以把整个屏幕想象成一个巨大的矩形阵列,阵列的每个元素都是一个点,这些点称为像素。在计算机内部,有一块专门供视频显示器使用的内存区域,屏幕上的每一个像素点由1个或多个比特表示。这些二进制数值不仅决定了像素点的亮度,还决定了它的颜色。即RAGB编码。

除了显示器,还包括鼠标的发明,窗口软件的开发,以后来对图像的存储技术的进步,包括各种压缩技术...视频音频等多媒体存储技术...

期待未来的量子计算机在交互领域的革命。