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

非常好读的关于计算机如何实现的书,还有物理、布尔代数等学科的知识。

第17章自动操作是计算机从硬件到软件组成的关键一章

在这本书里,编码这个词的意思是指一种用来在机器和人之间传递信息的方式。换句话说,编码就是交流。

莫尔斯码也被称作二进制码(Binary Code),因为这种编码的组成元素只有两个——“点”和“划”。

尤其值得注意的是数字标识符和取消“数字标识状态”的字母标识符。它们改变了后面编码的意义——从表示字母到表示数字,又从表示数字回到表示字母。像这样的编码通常被称作“优先码”(precedence codes)或者“换档码”(shift codes)。它们改变着作用域内编码的含义,直到作用域结束。
大写字母标识符表示紧随它的字母(而且仅仅是紧随它的字母)应该被译为大写。类似这样的编码被称为“逃逸码”(escape codes)。

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

回顾一下莫尔斯码的编码规则:划的长度等于点长度的三倍;单个字母内,点或划之间以长度与点相等的空格来分开;单词内的各个字母之间用长度等于划的空格分隔;各单词之间由长度等于两倍的划的空格分开。

每个与门、或门和与非门都需要两个继电器,因此一个异或门中就包含6个继电器。一个半加器是由一个异或门和一个与门组成的,因此一个半加器就需要8个继电器。每个全加器由两个半加器和一个或门组成,所以它要18个继电器。我们需要8个全加器来制作8位二进制加法器。因而总共需要144个继电器。

加法器的总体速度等于数字的位数乘以全加器器件的速度,这被称做行波进位(ripple carry,或脉冲进位)。更快的加法器运用了一个被称为“前置进位”的电路来提高运算的速度。

字节这个词最早起源于1956年前后,由IBM公司提出。最早的拼写方式是bite,但为了避免与bit混淆用y代替了i。曾几何时,字节仅表示某一数据路径上的位数,直到20世纪60年代中叶,在IBM的360系统的发展下(一种大规模复杂的商用计算机),字节这个词逐渐开始用来表示一组8比特数据。

字节的一半——即4比特——我们称之为半字节(nibble,也可拼写成nybble),在计算机这个领域,它并不像字节那样经常使用。

条件跳转指令将它与我们以往设计的加法器区别开来,能否控制重复操作或者循环(looping)是计算机(computer)和计算器(calculator)的区别。

约翰·冯·诺依曼协助设计的ENIAC的后续产品EDVAC(Electronic Discrete Variable AutomaticComputer)。特别是在1946年与亚瑟·W·伯克斯(ArthurW.Burks)和荷曼·哥斯廷(Herman H.Goldstine)共同执笔的题为“电子计算器件逻辑设计的初步分析及讨论(PreliminaryDiscussion of the Logical Design of an ElectronicComputing Instrument)”的论文中,他描述了几个EDVAC比ENIAC更加先进的特点。EDVAC的设计者们感觉到计算机内部中应当使用二进制数,而ENIAC使用的是十进制数。同时他们认为计算机中应当拥有尽可能大容量的存储器,这些存储器应该用来存储程序代码和程序执行中产生的数据(再说明一下,这些在ENIAC中都是不能实现的,对于ENIAC来说,编程不过是扳动开关和插拔电线的事情)。这些指令在存储器中是顺序存放的,而且可以由程序计数器进行寻址,但允许条件跳转。这就是著名的“存储程序概念”(stored-program concept)。

堆栈的功能是怎样实现的呢?首先,堆栈其实就是一段普通的RAM存储空间,只是这段空间相对独立不另作他用。8080微处理器设置了一个专门的16位寄存器对这段存储空间寻址,这个特殊的寄存器称为堆栈指针(SP, StackPointer)。

外围设备有时候需要获得处理器的注意。例如,当你按下键盘的某个键时,处理器应该马上注意到这个事件。这个过程由一个称为中断(interrupt)的机制实现,这是一个由外围设备产生的信号,连接至8080的INT输入端。

NOP代表(即声明)no op(no operation,无操作)。NOP指令使处理器什么操作也不执行。这样做有什么好处呢?填空,即保持处理器的运行状态而不做任何事情。8080可以执行一批NOP指令而不会引起任何错误事件的发生。

Intel和Motorola的微处理器在保存多字节数据问题上的根本区别从未得到解决。直到今天,英特尔的微处理器在保存多字节数据时,仍然把最低有效字节放在最前面(也就是说,在最低地址处),而Motorola的微处理器在保存多字节数据时,仍然把最高有效字节放在最前面。
这两种不同的方式分别称为little-endian(Intel方式)和big-endian(Motorola方式)。争论两者之间哪一种方式更好是件有趣的事,但在这么做之前,先要知道big-endian这个术语出自乔纳森·斯威夫特(Jonathan Swift)的Gulliver'sTravels,指的是刘普特(Lilliput)和布鲁夫思科(Belfuscu)之间关于在吃鸡蛋之前应该把鸡蛋的哪一头敲碎的争论。因此,这种争论可能是没有意义的(另一方面,坦白地说,在本书第17章设计的计算机所采用的方式我个人并不喜欢)。尽管不能确定那一种方式本质上是“对的”,这种差别确实造成了附加的兼容性问题,这种问题通常会在采用little-endian和big-endian系统的机器共享信息时出现。

通常对于每1位存储空间,SRAM需要用4个晶体管(在第16章中讲过将触发器作为存储器用,其用到的晶体管更多),而DRAM只需要1个晶体管,但DRAM需要较复杂的外围支持电路,这正是它的缺点。