【读书笔记】编码 - 隐匿在计算机软硬件背后的语言

   74 min read

第一章 至亲密友

莫尔斯电码(Morse Code):有两种闪烁,短闪和长闪。或者点(dot)和划(dash)。

莫尔斯电码表:

编码:一种用来在机器和人之间传递信息的方式。

口头话语(the spoken word)或言辞(speech):

书面语言(the written word)或文本(text):

布莱叶盲文:

可以约定,一个 dash 的时长是 dot 的 3 倍。

一个字母中的 dot 和 dash 应间隔一个 dot 的时间。

一个单词中的字母应用一个 dash 的时间分隔。

一个句子中的单词应用两个 dash 的时间分隔。

简单且短促的编码被分配给字母表中使用频率较高的字母,而不太常用的字母则被分配以较长的编码。

SOS:国际求救信号,三个点,三个划,三个点。

缺点:没有区分大写字母和小写字母,但可以通过增加序列来表示。

可以把 dot 读为嘀(dib),把 dash 读为嗒(dab)。

第二章 编码与组合

数字的自乘:幂。例如:2*2*2*2 可以记作 2^4,读作 2 的 4 次幂。

码字的数量 = 2^点和划的数量

莫尔斯码树型图:

作用:

  1. 确保不会对不同字母定义相同码字。
  2. 可以用尽可能短的码字来表示所有字母,避免产生编码长度上的浪费。

码字的数目 = 2^编码的位数

莫尔斯码也被称作二进制码:

组合学或组合分析:数学上的一个分支,常应用到概率和统计学中。

第三章 布莱叶盲文与二进制码

在布莱叶盲文中,每个符号被编码成 2*3 的点码单元中的一个或多个凸起的点。

点码单元用 1-6 的数字来编号。

大点表示凸起点,小点表示平点。

一个单词中每个字母所对应的点码单元之间用一小块空白分开,而单词间则用一大块空白(一块没有凸点的点码单元)分开。

优先码(precedence codes)或换挡码(shift codes):改变作用域编码的含义,直到作用域结束。

逃逸码(escape codes):逃离对编码串单调的、一成不变的解析,转到一种新的解析方式中。

第四章 手电筒的剖析

开关:两个断开的线头。

一个电路就是一个环路,只有整个回路是连通的,灯泡才能被点亮。开关控制断开的过程。

电子理论:电流是由电子的运动而产生的。

原子(atom)由中子(neutron)、质子(proton)和电子(electron)组成。

中子和质子被束缚在原子核内,而电子围绕着原子核旋转。

元素都有一个 1 到 112 之间的特定原子序数(atomic number),它表明了这种元素一个原子的原子核中所含的质子数,通常也是其所含的电子数。

原子通过化学的方式结合成分子(molecules)。

化合物(compound):水和盐。而盐水是混合物(mixture),因为水和盐都各自保留着自己的性质。

电子一般与质子数目相同。

电流产生的原因:电子从原子中脱离。

电荷(charge):质子有一个正电荷,电子有一个负电荷,而中子是中性的,不带电荷。

异性电荷相吸引,同性电荷相斥。

原子核中的质子被强力(strong force)束缚到一起。

电池的化学反应使多余的自由电子聚集到负号的那端(负极或阴极),而正号那端(正极或阳极)则变得急需额外的电子。

电子从负极流向正极。

并联后的电压与每个电池一致。

元素的导电能力与它原子内的结构有关。

电子层:电子围绕原子核运行的轨道分为不同等级。

导体(conductor):原子在最外电子层中只含有 1 个电子,该电子很容易逃逸。如:铜、银和金。

电阻:即阻抗性,有些物质与其它物质相比更不容易让电流通过。

绝缘体(insulator):几乎不能传导任何电流。如:橡胶、塑料和在干燥空气中的布料和木头。

只要有足够高的电压,任何物质都是可以导电的。

导线越长,阻抗越高;导线越粗,阻抗越低。

电压表征了电流做功的势(potential),即电势能的大小。不管电池是否被连接到电路中,电压都是存在的。

电流(current)与流经电路的电子数有关,计量单位是安培,简称安。

电阻的单位为欧姆。

欧姆定律:I = E / R,I 表示电流,E 表示电压(电动势),R 表示电阻。

短路:电阻非常非常小,导线会发热,因为电能转换为了热能。

瓦特是功率(P)的计量单位,有:P = E * I

当开关被设置成允许电流通过时,我们称它的状态为开或闭合;当处在关和断开状态时,开关不允许电流通过。

第五章 绕过拐角的通信

截面越大,导电性越好。

物理接地:英国:earth;美国:ground。

地球是一个巨大的导体,也可以把它看成是电子的来源和储藏库。

地球之于电子就好像海洋之于水滴,它是一个近乎无限的电子之源,同时也是一个无比庞大的电子池。

大地有时也被认为是零电势(zero potential)点,也就是说现在没有电压。

导线的粗细使用美国线径标准(AWG)进行度量:AWG 数值越小,导线越粗,电阻也就越小。

第六章 电报机与继电器

电报(telegraph,即远距离书写)原理:在线路的这一端采取一些措施,使得线路的另一端发生某种变化。

电磁(electromagnetism)现象:如果你手上有一根铁棒,那么在上面用细导线绕几百圈,然后在导线上接通电流, 铁棒就变成了一块磁铁。现在它可以吸引其它的铁块和钢块(电磁铁上缠绕足够多的细导线,会 产生足够强的电阻,能防止电磁铁产生短路现象);断开电流,铁棒将丧失磁性。

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

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

第七章 我们的十个数字

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

两个罗马数字相加的时候只不过是利用几个规则将两个数合并,这个规则是:五个 I 是一个 V,两个 V 是一个 X,五个 X 是一个 L,以此类推。

阿拉伯数字系统与先前数字系统的区别:

  1. 阿拉伯数字系统与位置相关。
  2. 阿拉伯数字系统没有用来表示数字 10 的专门符号。
  3. 阿拉伯数字系统有 0。

任何数的 0 次幂都等于 1。

第八章 十的替代品

在十进制中,10 没有特定的符号,因此在八进制中,同样也没有表示 8 的特定符号。

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

好整数(nice round number):在十进制中,好整数通常是指结尾有若干个零的数。

任何 2 的整数次幂乘以 2 的整数次幂的结果依然是 2 的整数次幂。

八进制数中的每个位所代表的值是该位数字乘以 8 的整数次幂的结果。

任何一个以 1 开头而后面全是 0 的二进制数一定都是 2 的整数次幂,幂指数就等于这个二进制数中 0 的个数。

任何数乘以 0 结果都为 0,任何数乘以 1,结果都是这个数本身。

模板转换进制:将整个十进制数(小于或等于 255)填入到上面一行最左端的格子中。用第一个除数(128) 去除这个数。所得的商填入正下方的格子(左下角的格子),余数填入右边的格子(上面一行左数第二个格子)。 用第一个余数再除以下一个除数 64。按照模板的顺序用同样的方法继续进行下去。

原则:

  1. 每次求得的商只能是 0 或者 1。
  2. 如果被除数小于除数,商为 0,余数就是被除数。
  3. 如果被除数大于或等于除数,商为 1,余数就是被除数减去除数所得之差。

二进制数的前导零形式:即第一个 1 的左边有零,只为美观。

当以二进制计数时,最右边的一位(最低位)以 0 和 1 交替。每当该位由 1 变为 0,从 右边数第二位(次低位)也随之改变,不是由 0 变到 1,就是由 1 变到 0。因此,每次只要有一个 二进制数位的值由 1 变到 0,紧挨着的高位数字也会发生变化,而且其变化不是由 0 到 1 就是 由 1 到 0。

为了让二进制数更易读,通常在每四个数字之间用一个连字符或空格分开。

第九章 二进制数

通信理论中,噪声(noise)是指影响通信效果的所有事物。

可以利用冗余(redundancy)来抵消噪音的影响。

所有可能被转换成对两种或多种可能性的选择的信息,都可以用比特(bit)来表示。

拥有的比特位数越多,所能表示的不同可能性就越多。

在二进制中,所有的编码数等于 2 的整数次幂,其幂指数就是比特位的位数。每增加一个比特位就会将 编码的数量增加一倍。

对数运算是指数运算的逆运算:以 x 为底的 y 的对数为 z:log_xy = z,逆运算:x^z = y

通用产品代码(UPC)的内容详情见书。

检查错误和一致性的方法,奇偶校验:

  1. 奇校验:编码中含有奇数个 1。
  2. 偶校验:编码中含有偶数个 1。

补码:0 换成 1,1 换成 0。

模校验:将数字用字母代替,A BCDEF GHIJK。然后计算:3*(A+C+E+G+I+K)+(B+D+F+H+J)。 前一个括号从第一个字母开始每隔一个选取,第二个括号从第二个字母开始每隔一个选取。 从离这个值最近且大于或等于它的一个 10 的整数倍中减去它,其结果为模校验字符。可作为冗余措施。

第十章 逻辑与开关

在三段论中,首先假定两个条件是正确的,然后再通过这两个条件推断出结论。

规则:

  1. 加法和乘法的交换律:在运算符的两边的操作数可以任意调换:A+B=B+AA*B=B*A。减法和除法无法应用交换律。
  2. 加法和乘法的结合律:A+(B+C)=(A+B)+CA*(B*C)=(A*B)*C
  3. 乘法的加法分配律:A*(B+C)=(A*B)+(A*C)

在布尔代数中,操作数不是数字,而是类。一个类就是一个事物的群体,后来也被称为集合。

+ 号表示两个集合的并集。两个集合的并集的意思是指第一个集合中的所有元素与 第二个集合中所有元素的集合。

* 号表示两个集合的交集。两个集合的交集就是指即在第一个集合中又在第二个集合中的所有元素的集合。

交换律、结合律和分配率都在布尔代数中成立,另外,加法可以分配乘法:W+(B*F)=(W+B)*(W+F)

1 表示全集,即我们所提到的所有事物。

符号 1 与减号连用可以表示在全集中排除一些事物,如:1-M

0 表示空集,即不包含任何元素的集合。空集往往是两个互斥集合的交集。

矛盾律:事物不可能即是它本身,同时又是它的对立面。

并集用 OR 表示;交集用 AND 表示;从全集中去掉某些元素用 NOT 表示。

在表达式中,每个符号 * 对应电路中的两个开关(或两组开关)串联的点;每个符号 + 对应电路 中两个开关(或两组开关)并联的位置。

第十一章 门

逻辑门的工作就是让电流通过或阻止电流通过。

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

继电器是通过放大微弱信号来生成强信号的。

连接继电器是建立逻辑门的关键。

双掷继电器:拥有两个输出,但这两个输出在电的极性上是对立的,当一端有电压时,另一端就没有。

反向器不是逻辑门(一个逻辑门通常有两个或多个输入),它能将 0(低电平)转换为 1(高电平),反之亦然。

规则:一个门(或反向器)的输出可以作为一个或多个其它门的输入,但两个或多个门的输出是不可以相互连接的。

2-4译码器:输入为 2 个二进制位,各种组合表示 4 个不同的值。输出是 4 个信号, 任何时刻只能有一个是 1,哪个是 1 取决于输入。

或非门:用 NOR 表示,结果和或门相反。

与非门:用 NAND 表示,结果和与门相反。

缓冲器用于延迟一个信号。

带有两个反向输入的与门和或非门是等价的;带有两个反向输入的或门和与非门也是等价的。

摩根定律:

  1. 两个操作数先被取反,再进行与运算 = 两个操作数进行或运算后再取反(即或非)。
  2. 两个操作数先取反,再进行或运算 = 两个操作数先做与运算后再取反(即与非)。

第十二章 二进制加法器

一对二进制数相加的结果中具有两个数位,其中一位叫做加法位,另一位叫做进位位。

异或门:用 XOR 表示,有且仅有单个输入为 1 时,结果才为 1,否则为 0。

同或门:当两个输入相同时,结果才为 1。

两个二进制数相加的结果是由异或门的输出给出的,而进位位是由与门的输出给出的。

半加器:将两个二进制数相加,得到一个加法位和一个进位位,但没有将之前一次的加法可能产生的进位位 纳入下一次运算。

最低有效位位于最右边;最高有效位位于最左边。

行波进位(或脉冲进位):加法器的总体速度等于数字的位数乘以全加器器件的速度。

继电器->真空管->晶体管。

第十三章 如何实现减法

补码(补数):每位取反加 1(最大数减去再加 1),为了避免减法中的借位。

将进行减法的两个数分别用被减数和减数表示。从被减数中减去减数,得到差。

避免借位:原式:176-253=-77

  1. 用 999 减去减数 253,计算出对 9 的补数:999-253=746
  2. 把该数对 9 的补数与被减数相加:176+746=922
  3. 由于之前已经加了 999,这里再减去 999:922-999=-77

从一串 9 中减去一个数叫做对 9 求补数。在二进制减法中,减数是从一串 1 中减去的,结果称为对 1 的补数。

相反数(反码):对 1 求补数,即将原来二进制数中的 1 变为 0,0 变为 1。

以 8 位二进制数为例,范围为 0000000011111111,对应十进制中的 0255。 这样可以表示的数的范围是-128~+127。最高有效位(最左边)作为符号位。符号位中,1 表示 负数,0 表示正数。

为了计算 2 的补数,则首先要计算 1 的补数,然后加 1。这等价于将每位取反再加 1。用同样的步骤, 每位取反再加 1,可以将数值还原。

2 的补码系统为我们提供了一种不用负号就能表示正、负数的方法,也让我们能够自由地将 正数和负数用加法法则相加。

第十四章 反馈与触发器

振荡器(时钟):在不需要人为干涉的情况下,可以完全自发地工作。

振荡器从某个初始状态开始,经过一段时间又回到先前初始状态的这一段间隔定义为振荡器的一个循环或一个周期。

一个循环所占用的时间就是该振荡器的周期。

周期的倒数就是振荡器的频率。可以记作赫兹,即 Hz。

反馈:系统的输出返回给输入,与振荡器构造类似。

触发器:同样是在两个开关都断开的状态下,灯泡有时亮着,有时却不亮。当两个开关都断开时,电路 有两个稳定态。

触发器电路可以保持信息,它可以记忆信息。

R-S(复位/置位)触发器。

功能表(逻辑表或真值表):表达了不同输入组合所对应的不同输出结果。

电平触发的 D 型触发器:D 表示数据端输入。电平触发是指当保持位输入为某一特定电平时,触发器才保存数据端的输入值。

电平触发的 D 型锁存器:表示电路锁存住一位数据并保持它,以便将来使用。也可以称之为 1 位存储器。

边沿触发:只有当时钟从 0 跳变到 1 时,才会引起输出的改变。

区别:在电平触发器中,当时钟输入为 0 时,数据端输入的任何改变都是会影响输出;而在边沿触发器中, 当时钟输入为 1 时,数据端输入的改变也不会影响输出。只有在时钟输入从 0 变到 1 的瞬间, 数据端的输入才会影响边沿触发器的输出。

时钟信号的正跳变:当时钟端由 0 变为 1 时;负跳变指从 1 变为 0。

分频器:它的输出反馈到触发器的数据端输入。

8 位行波计数器:每一个触发器的输出都是下一个触发器的时钟输入。变化在触发器中一级一级地顺序传递, 最后一级触发器的变化必定有一些延迟。更先进的计数器是并行(同步)计数器,该计数器所有输出是在 同一时刻改变的。

可以使用计数器来确定振荡器的频率。

第十五章 字节与十六进制

数据路径,这些电路中的数据路径的位宽就是 8。8 比特代表一个字节。

半字节:字节的一半,即 4 比特。

八进制数和二进制数之间的转换只需要记住 0~7 这 8 个数字所对应的 3 位二进制数即可。

二进制数转八进制数:从最右端数字开始,每 3 比特看做一组,这样每组就对应着一个八进制数。

两个十六进制数可以完整地代表一个字节,则一个十六进制数恰好由 4 位二进制数组成,即半字节。

用一个小写的 h 紧跟在数字后边表示这个数是以十六进制表示的。

十进制转十六进制:可以用这个数除以 16,分别得到商和余数,商作为结果保留,而余数则作为下次运算的除数。

第十六章 存储器组织

电报继电器:以一定形式组织起来构成逻辑门,然后再形成触发器,同样具备保存信息的能力。

8-1 数据选择器:有 8 个数据输入端,以及 3 个选择输入端。 选择输入端的功能就是选择一个输入端数据,然后使其在输出端输出。

3-8 译码器:输出端口共有 8 个,任何时刻只会有一个锁存器的输出为 1,其余为 0。 每个输出端结果由三个信号的排列组合决定,而数据的输出与输入一致。

读/写存储器(随机访问存储器,RAM):可以在每个锁存器存储新的数据(写数据),还可以检查每个锁存器 都保存了什么数据(读数据)。读写操作很自由,只需要改变地址及相关的输入就可以从 8 个锁存器中读出 或写入需要的数据。

将 RAM 进行特殊的配置可形成 RAM 阵列,该阵列以 8*1(读作8乘1)的方式组织起来,以 1 比特作为 存储单位,共存储 8 个单位的数据,所以这个 RAM 阵列中能存储的位数等于 8 与 1 的乘积。

通过共享地址把两个 8*1 的 RAM 阵列连接起来,把其地址和输出都分别看成一个整体, 这样就得到了一个 8*2 的 RAM 阵列,该阵列可存储的二进制数依然是 8 个,但每个数的位宽为 2 位。

还可以把两个 8*1 的 RAM 阵列看作是两个锁存器,使用一个 2-1 选择器和一个 1-2 译码器将它们 按照单个锁存器连接方式进行集成,这种结构实际上就是 16*1 的 RAM 阵列。

RAM 阵列的存储容量 = 2^地址输入端的个数

可以证明不存在一对整数 a 和 b 使得 10 的 a 次幂与 2 的 b 次幂相等,但有 2^10 约等于 10^3, 即 2 的某次幂和 10 的某次幂几乎相等。

在存储器领域,通常使用的是字节数而非比特。但在描述在线路中流动的数据时,会使用类似千比特每秒(kbps)或 兆比特每秒(mbps)的用语。千比特 = 1000 bit。

随机访问存储器是以易失性存储器,需要恒定电流来保证数据不丢失。

第十七章 自动操作

累加器:用来累加多个数的锁存器。

指令码(操作码):指示电路要执行的某种操作。

控制信号:由逻辑门的各种组合实现,用来控制组件。

在位宽 8 个机器上做 16 位计算:

  1. 加宽度:把两个 8 位加法器连在一起构成一个 16 位的设备。
  2. 先低字节再高字节:先处理最右边的字节(低字节),再计算最左边的字节(高字节)。 低字节时保存进位输出,并把它作为高字节运算的进位输入。

取指令:从存储器中取出指令的过程。如果每一条指令的长度是 3 个字节,因为每次从存储器取回一个 字节,所以取每条指令需要的时间为 3 个时钟周期。此外,一个完整的指令周期需要 4 个时钟周期。

执行指令:机器响应指令码做一系列操作的过程。每一种机器码用其唯一的方式触发多种控制信号, 从而引发机器执行各种操作。

TANSTAAFL 工程准则:改进了机器的某个方面,则其它方面就会有损失,有得就有失。

分支指令(goto 指令):改变机器的顺序寻址方式,转到另一个位置。

条件跳转指令使得跟以往的计算器区别开来,能否控制重复操作或者循环是计算机和计算器的区别。

数字计算机处理离散数据;模拟计算机处理模拟数据。

数字数据就是离散数据,即这些数据是一些确定的离散值;模拟数据是连续的,并且在整个取值区间变化。

第十八章 从算盘到芯片

可计算性:用来分析哪些事情计算机可以做到,哪些做不到。

存储程序概念:这些指令在存储器中是顺序存放的,而且可以由程序计数器进行寻址,但允许条件跳转。

半导体:如锗元素和硅元素以及一些化合物。它们的导电系数可以通过多种方式操控。

半导体可以与某些杂质组合,可分为 N 型半导体(为原子之间的结合提供额外的电子)和 P 型半导体。

NPN 晶体管:其三部分分别为集电极、基极和发射极。 是一个由一个 P 型半导体夹在两个 N 型半导体之间形成的放大器。 在基极施加微小的电压就可以控制非常大的电压从集电极到发射极。

集成电路(IC,芯片)通过将硅片分层,然后非常精确地掺入杂质以及蚀刻不同的区域形成微小组件来制作。

集成电路最常见的封装方式是采用矩形塑料双排直插式(DIP),提供14、16或40个管脚。

摩尔定律:每 18 个月同一块芯片上集成晶体管数目就会翻一倍。

传播时间:输入端发生变化引起输出端发生相应变化所需要的时间。

通常以纳秒来衡量芯片的传播时间,缩写为 nsec,即 ns。千分之一秒称为毫秒,百万分之一秒称为微秒,十亿分之一秒才为纳秒。

通常情况下是每秒至少震荡一百万个周期,称 1 兆赫兹,缩写为 MHz。

在比较微处理器性能时采用的标准:

  1. 位数
  2. 时钟频率:是指连接到微处理器并驱动它运行的振荡器的最大频率,超过此时钟频率,微处理器将不能正常工作
  3. 寻址能力

可计算性的一种定义:某种意义上来讲,所有的数字计算机都是相同的,如果一台处理器从硬件上无法 做到另外一台可以做到的事情,那么它可以通过软件途径做到,最终它们可以完成相同的事情。

第十九章 两种典型的微处理器

一个微处理器通常有多个用来寻址存储器的输出信号。用于寻址的输出信号的数目与微处理器的可寻址空间大小直接相关。

1 MHz = 1000 Hz。

时钟周期 = 1 / 时钟频率(单位为 Hz)

寄存器和累加器非常类似,本质上都是锁存器。处理器既可以把数据从存储器读入寄存器,也可以把数据从寄存器存回存储器。

通常把两个 8 位的寄存器 H 和 L 合起来构成一个 16 位的寄存器对,称作 HL,H 用来保存高字节而 L 用来保存低字节。

直接寻址;间接寻址;立即数寻址。

标志位:进位标志位CF、零标志位ZF、符号标志位SF、奇偶标志位PF、辅助进位标志位AF。

用一个专门的 8 位寄存器来存放所有标志位,该寄存器称做程序状态字(PSW)。

按位运算指令:对于这些逻辑运算指令,其操作数的每一个对应位都是独立计算的。

BCD 码:是一种编码,把 1-9(十进制中的各个数字)用 4 位单独表示,所以一个字节可以表示两个十进制数。

循环移位指令:可以把累加器中的内容向左或向右移动 1 位。共有两种移位方式。

猥琐胶片和磁带都不是随机访问的,而是顺序访问的。

堆栈(后进先出存储器,LIFO):最先保存到堆栈的数据最后被取出,而最后保存的数据则最先取出。存入数据称为压入(push),取出数据称为弹出(pop)。

堆栈指针:一个专门的 16 位寄存器对堆栈的存储空间寻址。

堆栈上溢(stack overflow):过多地使用了 PUSH 指令导致堆栈覆盖掉存储器中保存的程序所必需的代码或数据。

堆栈下溢(stack underflow):过多地使用了 POP 指令导致过早地取完堆栈中的数据。

堆栈的初始位置将会是存储器的最高地址,因为程序的代码通常从最低位置开始存放,因此两者将保持非常远的距离。

在处理器中专门设置了一个称为程序计数器 PC 的寄存器,它用来保存处理器将要取出并执行的指令的 存储地址。跳转等指令使 PC 重新加载另外的值。

调用指令(CALL)会使得 PC 加载一个新的地址,并保存原来的地址到堆栈。

子程序由 CALL 指令实现,它是一段频繁使用的完成特定功能的代码。

在某些微处理器中,外围设备实际上占用了一些通常用来寻址存储器的地址,这种结构称作内存映像I/O。

I/O端口:专门用来访问输入/输出设备的地址。

中断机制。

小端序(Intel方式):低字节在前,高字节在后。

大端序(Motorola方式):高字节在前,低字节在后。

RISC(精简指令集计算机):通过某些方面的简化来提高处理器的速度。指令通常都是等长的,只有 加载和保存两种指令能访问存储器,并且尽量简化指令的操作。还设置了大量寄存器,这样就能避免 频繁访问存储器以提高运行速度。

现代提高速度的方法:

第二十章 ASCII 码和字符转换

为了将文本表示为数字形式,需要构建一种系统来为每一个字母赋予一个唯一的编码。数字和标点符号 也算作文本的一种形式,所有它们也必须拥有自己的编码。

所有由符号所表示的字母和数字都需要编码,具有这种功能的系统被称为字符编码集,系统内的每个 独立编码称为字符编码。

莫尔斯码是自适应长度编码,即常用字符编码较短,而不常用字符的编码较长。这种编码非常适合电报系统, 但不适合计算机。另外,莫尔斯码并不区分字母的大小写。

布莱叶盲文编码使用固定宽度,非常适合计算机使用。每一个字符对应着 6 比特的编码,并且用到了转义码 对大小写进行了区分。转义码用来表明下一个字符为大写。用移位码表示数字,移位码后紧跟的编码都被看做数字, 直到遇到下一个移位码。

对一个句子进行编码后得到的连续字符通常被称为文本字符串。

当使用电传打字机时,一旦到了一行的末尾,就会先回车:让打印机的滑架回到初始位置,这样打印下一行时 可以从纸的最左边开始;然后换行:将打印机的滑架移至正在使用中的位置的下一行。

在 ASCII 码中,一个大写字母与其对应的小写字母的 ASCII 码值相差 20h。

图形文字可以被显示出来;而控制字符是用来执行某一特定功能,因而不用显示出来。

TAB 符的作用是在下一个水平位置,即在距前一个字符的间距为字符长度 8 倍的位置打印下一个字符。

换页符:使得打印机跳出当前页,并开始准备打印下一页。

回车符使得打印头换行并转移至当前页面的最左端;换行符使打印头转移至当前位置下一行。

回车符通常用来另起一行继续打印,换行符通常在不需要移到页面最左端而换行时使用。

第二十一章 总线

计算机中各部件按照功能被分别安装在两个或更多的电路板上,这些电路板之间通过总线通信。总线是 数字信号的集合,这些信号被提供给计算机上的每块电路板。

信号分类:

总线还可以为计算机上不同电路板供电。

直接存储器访问(DMA)请求信号,可以使存储设备快速地执行存储操作。其它设备也可以不通过微处理器 而获得总线的控制权,进而直接对内存进行读写。

如果设计出来的总线不适合高速传输的话,就会出现射频干扰,这会使得附近的收音机和电视机产生静电或其它噪声。

RAM 阵列能存放的数据的数量是和地址输入信号的个数有关的:RAM 阵列中数字的个数 = 2^地址信号的个数

数据输入、输出信号决定着所存储的数字的大小(位数)。

访问时间:指从芯片接收到地址信息到输出有效数据所需时间。

电压的不确定性:一个集成电路的输出为 1,另一个集成电路的输出为 0。如果把这两个输出 连接在一起,结果是无法确定的。

几乎所有连接在总线上的器件都使用由总线传递而来的数据输入信号,但不管何时,连接在总线上的 电路板中只有一个能确定总线数据输入信号的类型,其它电路板处于三种状态中的无效状态。

DRAM 芯片在使用时需要定期访问其存储器中的内容,尽管有时并不需要这些内容。该过程被称为更新周期, 每秒钟都必须进行几百次。就好像为了不让某人睡觉而每隔一段时间就用手肘清退他一样。

称连接到计算机上的 CRT 为视频显示器,而称可以为视频显示器提供信号的电子元件为视频适配器,即显卡。

在通信领域,带宽是极其重要的概念,某个特定的传输媒介能够传输的信息量都是受带宽限制的。

只读存储器(ROM):它是一种集成电路,在生产时就已经填入数据,固定的地址输出的数据是不变的,且 ROM 中 并没有数据输入信号。

1 位是和 1 个像素对应的,只能用来表示两种颜色,如:黑和白。

每种颜色都是由红、绿、蓝三原色的不同组合而形成的。为了获取所有颜色,三原色中每个颜色的强度 都需要一个字节来表示。

颜色数量 = 2^每个像素赋予的比特数

屏幕长宽比:图像的宽和高之比。

正方形像素:100 个像素的水平线和 100 个像素的垂直线有着相同的物理长度。

对于想要长期保存的文件,磁带还是首要选择。

磁盘分为软盘和硬盘。

硬盘围绕其中心旋转,连到臂上的一个或多个磁头从硬盘外沿向中间移动,通过磁头可以快速访问硬盘上的任何区域。 表面被划分成许多同心圆,称为磁道。每个磁道又被划分成像圆饼切片形状的扇区,每个扇区可以存放一定数量的字节, 通常为 512 字节。

DMA 可以不经过微处理器,在总线上实现数据在随机访问存储器和硬盘之间直接传送,这样的传送 是以块为单位的,每次传输的块大小是磁盘扇区字节数的倍数,通常是 512 字节。

memory(内存)表示半导体随机访问存储器;storage(存储器)用来指任何的存储设备,通常包括 软盘、硬盘和磁带。

存储的信息是否易失是随机访问存储器和磁介质存储器的主要区别:随机访问存储器是易失性存储器, 一旦掉电,存储内容就会消失;而磁介质存储器是永久性存储设备,除非故意删除或写覆盖,否则 数据将会一直保留不变。

当微处理器发出一个地址信号,通常是寻址随机访问存储器而非磁介质存储器。

微处理器不能直接从磁盘读取数据,需要将所需的数据从磁盘调入内存(随机访问存储器),然后它才能对其访问。 微处理器还需要执行一段小程序,这段程序会访问磁盘,并将数据从磁盘调入内存。

第二十二章 操作系统

当一个微处理器首次上电或复位时,它会从特定的内存地址开始执行机器代码。

键盘响应中断过程:每次有按键按下的时候,就会产生一个中断信号送至微处理器。计算机内有中断控制芯片, 通过执行一条 RST 指令使得微处理器响应这次中断,例如:RST 1,微处理器执行这条指令,把当前程序计数器 的值压入到堆栈中,然后跳转到地址 0008h 处。可以直接在这片地址空间上输入一些代码,这些代码被称为 键盘处理程序。

可编程只读存储器(PROM):只能编程一次;而可擦除可编程只读存储器(EPROM)可重复擦除和写入,该芯片 的正面开有一个玻璃窗口,让紫外线透过这个孔照射内部芯片就可以擦除其中的内容了。

文件系统是磁盘存储的一种方法,就是把数据组织成文件。文件就是相关数据的集合,占用磁盘上一个或多个扇区。

文件以及读取这些文件所需的所有信息都存储在磁盘上。

文件存储在磁盘中不一定要占据连续的扇区空间。

引导程序:操作系统的其余部分可以通过这段代码的自举操作被高效地引导。

FAT(文件分配表)的基本思想是:将磁盘空间分成簇,簇的大小由磁盘空间的大小决定,每个文件 占用若干簇。文件的目录项只记录文件起始簇的位置,而磁盘上每一簇的下一簇的位置由 FAT 来记录。

Unix 思想:人们都使用文本文件作为公用文件形式,许多 Unix 实用程序读取文本文件,利用它提供的一些 功能做些处理,然后将其写入另一个文本文件。因此可以用链的形式来组织 Unix 实用程序,然后对这些 文本文件做相应的处理。

时分复用技术:这种技术允许多个用户同时与计算机进行交互。

多任务操作系统:可以在该系统上同时运行多个任务。

内存管理:考虑内存的分配问题。

虚拟内存:在磁盘上划出部分空间用做保存临时文件,程序把暂时不需要用的内存块放到临时文件里,待需要时再把它调入内存。

第二十三章 定点数和浮点数

实数:

虚数:负数的平方根。

复数:实数+虚数。

浮点数:

  1. 32 位:约等于 10^7。
  2. 64 位:约等于 10^13。

在十进制数字系统中,在小数点左边的数的每一位都和 10 的正整数次幂相关,而其右边的数的每一位 都和 10 的负整数次幂相关。

数字计算机只能处理离散数据,二进制数的位数直接决定了所能表示的离散数值的个数。

定点格式:小数点的位置总是在数的某个特定位置,而且有关小数点位置的信息并没有和整个数字一起存储。 使用该格式的程序需要决定。在非常大或非常小的数字中使用定点格式是不合适的。

科学计数法:把每个数表示成有效位与 10 的幂的乘积的形式,这样就可以避免写一长串的 0,所以特别 适合极大或极小的数。分成两部分:有效数和指数。

指数可以表明小数点相对于有效数移动的距离,指数的正负性只是表明了数的大小,它并不能指明数本身的正负性。

科学计数法的规范化式:规定有效数的取值范围是大于或等于 1,而小于 0。

浮点数基于科学计数法,借助二进制数实现。

在二进制中,二进制小数点右边的数字和 2 的负整数次幂相关。

在二进制的科学计数法的规范化中,有效数应该大于或等于 1 且小于 10(即十进制的2), 因此规范化后小数点的左边通常只有一个 1,除此之外没有其它数字(有 0 的话可以忽略,因此一定只有 1)。

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

单精度格式的 4 个字节可以分为三个部分:1 位的符号位(0 代表正数,1 代表负数),8 位用做指数,最后 23 位用做有效数。

对于二进制科学计数法的规范化式,其有效数的小数点左边有且仅有一个 1,因此在 IEEE 浮点数 标准中,这一位没有分配存储空间。在该标准中,仅存储有效数的 23 位小数部分,进过存储的只有 23 位, 但仍然称其精度为 24 位。

8 位指数部分的取值范围是 0~255,称为偏移指数,它的意思是:对于有符号指数,为了确定其实际所 代表的值必须从指数中减去一个值,该值称做偏移量。对于单精度浮点数,其偏移量为 127。

指数 0 和 255 用于特殊的目的,如果指数的取值范围是 1~254,那么对于一个特定的数, 可以用 s(符号位)、e(指数)和f(有效数)来描述它:(-1)^s * 1.f * 2^(e-127)

-1 的 s 次幂是数学上所采用的一种巧妙方法,含义是:如果 s = 0, 则该数是正的(因为任何数的 0 次幂都是 1);如果 s = 1,则该数是负的(因为 -1 的 1 次幂等于 -1)。

表达式的中间部分是 1.f,其含义是:1 的后面是小数点,小数点后面跟着 23 位的有效数。

1.2f 与 2 的幂相乘,其中指数等于内存中的 8 位 的偏移指数减去 127。

特殊情况:

负指数小数点左移;正指数小数点右移。

这意味着在单精度浮点格式下,16,777,216 和 16,777,217 将表示成同一个数。不仅如此,处于 这两个数之间的所有的数(如:16,777,216.5)也将被表示成同一个数。这是因为它们转换成二进制后 都是相等的。

双精度浮点数:用 8 个字节来表示,分为:1 位符号位、11 位指数位和 52 位有效数。

双精度浮点数的指数偏移量是 1023,表示为:(-1)^s * 1.f * 2^(e-1023)

关于单精度格式下的 0,无穷大(小)和 NaN 的规则通用适用于双精度。

双精度的有效数有 53 位(包括前面没有列出的那一位),大致相当于十进制的 16 位。

浮点数加法中最重要的一点就是如果对有效数相加,为了能使它们的有效位匹配,需要利用指数来确定 对其如何移位。

两个浮点数的乘法意味着要把有效数当做整数相乘,并且把指数部分相加。为了使结果规范化,一般需要 对指数调整一到两次。

浮点数的平方根、指数、对数和三角函数,都可以通过加减乘除这四种基本的运算来实现。

阶乘运算:把从 1 到该数之间的所有整数相乘,如:5! = 1*2*3*4*5

数学协同处理器,即浮点运算单元(FPU)。

如果机器上安装了数学协处理器,程序员就要学会编写相应的应用程序以支持它的运行;如果没有安装, 程序员就要通过编程来模拟它进行浮点数运算。

第二十四章 高级语言与低级语言

像 ASM.COM 这样的汇编器程序所做的工作是:读取一个汇编语言文件(源代码文件),将其转换得到一个 包含机器码的文件,即可执行文件。

构成汇编语言的助记符和机器码之间是一一对应的。汇编器拥有一张包括所有可能助记符及其参数的表,它 逐行读取汇编语言程序,把每一行都分解成为助记符和参数,然后把这些短小的单词和字符与表中内容匹配。 通过这种匹配的过程,每一个语句都会找到与其对应的机器码指令。

第一个编写汇编器的人需要手工对程序汇编。如果要为机器写一个新的汇编器(或对其修改),则可以 使用汇编语言编写该程序,然后使用原来的汇编器对其汇编。一旦新的汇编器通过了汇编,则它也就可以 对自身进行汇编,这就是自举。

交叉汇编:新的汇编器可以在已有的计算机上编写,并利用其汇编器进行汇编,即利用计算机 A 的汇编器 对运行在计算机 B 上的程序汇编。

缺点:

  1. 使用汇编语言编程非常乏味,因为这是在微处理器芯片级的编程,因此不得不考虑每一个微小的细节。
  2. 不可移植。

汇编语言被称为低级语言,因为它和计算机硬件的关系相当紧密。

定义高级语言,包括定义语言的语法来表达该语言可以描述的一切事物,还要为其编写一个编译器,可以将 高级语言的程序语句转换为机器码指令。

如果要在不同类型的处理器上运行程序,则需要用处理器对应的编译器将程序转换成对应的机器码,因此, 最后生成的可执行文件仍然只适用于特定的处理器。

从高级语言程序生成的可执行程序比相同功能的汇编语言程序更大,并且运行速度也更慢。近年来已经 不再明显,因为微处理器变得更加复杂,而且编译器在优化代码方面也更加成熟。

如果某种高级语言具有真正意义的可移植性,那么它将不能使用某些处理器的特有功能。

许多现代编译器都是利用处理器的移位指令来实现乘以或除以 2 的幂。

流水线技术使得汇编语言变得更加复杂且不易处理。

素数是只能被 1 及其本身整除的一类整数。第一个素数是 2(也是唯一的偶数素数),其它素数还包括 3,5,7,11,13,17,等等。

寻找素数的算法:爱拉托逊斯筛法。以 2 开始的整数表开始,因为 2 是素数,因此所有可以被 2 整除 的数都被排除掉(即除了 2 之外的全部偶数)。接下来是 3,因为 3 是素数,因此所有可以被 3 整除 的数也被排除掉。因为 4 在第一个步骤中已经被排除掉,所以下一个要考虑的数是 5,即排除 所有 5 的倍数。按这种方式不断循环,最后剩下的都是素数。

  1. 第一个 for 循环将数组 a 的每一个元素的初始值设置为布尔值 true。这里的 true 表示该位置 的数是素数,因此现在程序默认所有的数都是素数。
  2. 第二个 for 循环的范围是 1~100(100 刚好是 10000 的平方根)。在该循环中,如果判断条件 成立,则该数为素数,即 a[i] 为 true。第三个 for 循环则会把该数的所有小于或等于 10000 的 倍数(除了其本身)设置为 false,因为这些数都不是素数。
  3. 最后的 for 循环用来输出所有的素数,即 a[i] 为 true 的数。

编译器读取源文件并生成一个可执行文件,而解释器边读边执行源文件,不会产生新的文件。解释器的原理 比编译器的简单一些,更容易编写,但其运行程序的速度要比后者要慢。

第二十五章 图形化革命

640(水平) * 480(垂直)

在计算机内部,有一块专门供视频显示器使用的内存区域,屏幕上的每一个像素点由 1 个或多个比特表示。 这些二进制数值不仅决定了像素点的亮度,还决定了它的颜色。

红绿组合出黄色,红蓝组合出品红色,蓝绿组合是青色,三原色组合出白色。

高彩色:为每个像素赋予 2 个字节的存储空间,这样一来,可以给每一个原色分配 5 位(1 位保留) 存储空间,这种方法可以使得每种颜色具备 32(2^5)种不同的色阶, 这样算下来总共有:3*5=15 2^15=32,768 种不同的颜色。

全彩色:用 3 个字节来表示一个像素,三原色中的每一种各占一个字节。这种编码模式使红、绿、蓝各自 呈现出 256 种不同的色阶,这样算下来共有 16,777,216 种不同的颜色。

色深(色彩分辨率):每个像素所赋予的比特数。颜色数 = 2^每个像素所赋予的比特数

在冯诺依曼计算机的体系结构中,只有两种元素,一种是机器码,另一种是机器码所操作的数据。

对象实际上是代码和数据的组合。在对象内部,与其相关联的代码决定了数据存在的意义, 要理解数据的存储方式首先需要理解代码。对象如果需要与其它对象通信,则通过发送或接收消息来 实现这一过程,比如一个对象可以通过给另一个对象发送指令来获得相应信息。

计算机图形的两种分支:

  1. 矢量图形:在一些算法的帮助下,利用直线、曲线及填充区域生成图形。也正是计算机辅助设计()所 应用的领域。矢量图形一般转化为图元文件格式以存放到文件中。图元文件是由生成矢量图形的一系列 绘制命令的集合组成的,这些命令通常已经被编码为二进制形式。矢量图形的主要工具就是直线、曲线及 填充区域。
  2. 光栅图形(位图):将图像以矩阵阵列的形式进行编码,阵列中的一个单位对应着输出设备上的一个 像素点。就像视频显示器一样,位图是一种空间上的概念(可以称其具有分辨率),其图像的宽度和 高度都以像素为单位来表示。位图也具备色深(颜色分辨率或颜色深度)的概念,色深是指每一个像素 被赋予的比特数。位图中每个像素被赋予的比特数相同。从表现形式上看是二维的,但其本身的存储形式 却是一串连续的字节,通常从最顶端 1 行像素开始,紧跟着的是第 2 行、第 3 行,等等。

Internet 从本质上来讲是一组协议的集合,这些协议是计算机之间相互通信的保证。众多的协议中, 最重要的当属 TCP/IP 协议,它包括了传输控制协议()和网际协议()。这种协议使得传输过程 变得规则化,不再是简单地通过线路传输 ASCII 码字符,而由基于 TCP/IP 协议的传输系统把大的 数据块分割成小的包,之后在传输线路上(通常是电话线)独立发送,最后在传输线路的另一端 将数据重新组装起来。

Java 介于编译语言和解释语言之间,它需要经过编译,但编译的结果不是机器码,而是 Java 字节码。 Java 字节码与机器码在结构上很相似,但 Java 字节码可以在一种虚拟的计算机下被解释, 即 Java 虚拟机(JVM)上。被编译的 Java 程序产生 Java 字节码,之后计算机模拟 JVM 对其 进行解释。Java 程序的运行可以不受限于机器与图形操作系统的类型,所以它具有平台无关性。

利用电流在线路上传输信号和信息:光纤,一种由玻璃或聚合体制造的光导纤维,通过从不同角度对光 进行反射达到光传输效果。光信号在光纤中的传输速率可以达到千兆赫兹,即每秒十亿个比特。