18、从算盘到芯片
历史上,人们为了简化数学运算,发明了很多精巧的工具和机器。
早期人类社会使用如下工具计算:
由于这些工具无法做乘法和除法,苏格兰数学家发明了对数:A乘以B等于A和B对数之和,即先在对数表查找这2个值,相加后再在对数表逆向寻找其乘积。
随后的400年里,人们致力于建立对数表的工作,也有一些人设计出一些小装置代替对数表:带对数刻度的滑尺。
其次手持计算器出现,利用由刻在骨头、牛角、象牙上的数字条组成的乘法辅助器,从而制造出最早的机械计算器。但一个加法器的关键是处理进位能否成功。直到19世纪后半叶,机械计算器才得以出现并使用。
而在18世纪初,人类发明了自动织布机,使用打孔的金属卡片控制织物的图案,这对计算的历史产生了深远的影响。
在18世纪,人类依赖计算器的计算功能,但是此时的对数表使用起来耗费时间,英国数学家和经济学家发明了选择性的对数计算,即差分法,然后其设计出了差分机,其本质就是一个大型机械加法器,但这个差分机没有完成过。随后,这个数学家有了更好的想法,这就是解析机,解析机包含一个存储部件(类似存储器的概念)和一个运算部件(类似算数逻辑单元),乘法可以通过重复加法求解,除法通过重复减法求解。
此解析机可以使用改造后的织布机的卡片来编程,解析机编织出了代数的结构模型。
这个英国数学家是第一个意识到条件跳转在计算机中重要性的人。
但到18世纪中期,差分机最终由一对父子制造出来,人们已经遗忘了之前的英国数学家设计的差分机。
计算史另一个转折点源于美国宪法,其中有一条要求每10年进行一次人口普查,此时的人口普查数据采集工作大约要花费7年以上的时间,这个时间太久了,因此有人开始研究自动系统可能性。此时使用了穿孔卡片记录每个人的特征,但这不是二进制编码的,原因是:对于此时的人来说,将年龄转换为二进制数要求太高了,而且真正的二进制系统是可以将所有孔打穿的,这将会使卡片破裂。
之后,为了对人口数据进行统计,人们发明了制表机。
在当时的人口普查中使用这种自动化技术实验取得了重大成就,在实验中使用超过6200万张卡片,是人口普查的2倍,但时间却缩短了三分之一。
这个创造这种机器设备的人1896年创办了制表机公司,租借并出售穿孔卡片设备。到1911年公司合并,公司更名为计算制表记录公司,也叫C-T-R公司。再到1915年,托马斯·J·华盛顿成为这个公司的总裁,在1924年将公司更名为国际商业机器公司,即IBM。
在1928年,人口普查使用的卡片逐渐演变为IBM卡片,之后使用了将近50年。
第一台继电式计算机在1935年被制造出来,使用了二进制数,到了1937年,贝尔实验室的一个人在厨房中连接了一个1位加法器,称为K机器,这促使1939年贝尔实验室中复数计算机的诞生。
同一时期,哈佛大学研究生与IBM合作,在1943年创造出一台自动连续可控计算机,也就是闻名世界的Harvard Mark I,这是一台可以打印表格的数字计算机。
但继电器不是最完美的设备,频繁工作会导致断裂,如果其中有污垢也会导致失效。
在20世纪40年代,真空管已被广泛引用于放大电话信号,真空管同样可以连接成与门、或门、与非门、与或门,那么就可以制造出加法器、选择器、解码器、触发器、计数器。
但真空管同样存在价格昂贵、耗电量大、产生热量多等缺点,但好处是真空管可以在百万分之一秒内发生转变,要比继电器快1000倍。
到了20世纪40年代初期,新设计的计算机使用真空管取代继电器。
1937年艾伦·M·图灵在破译德国代码生成器生成的代码项目中,发表2篇论文,首次提出可计算性概念和测试机器智能的方法,这对计算机的发展产生深远影响。
1945年人们设计出了曾经最大的计算机,但设计的并不理想,到1946年,约翰·冯·诺依曼提出计算机应该使用二进制,并且应当拥有存储器,并且可以在存储器中进行寻址操作取得代码执行并保存数据,也允许条件跳转,这就是著名的存储程序概念,这个阶段被称为冯·诺依曼结构。但这个结构也有问题,因为在执行命令中,从存储器取指令要花费3/4的时间。
考虑到成本效益,人们开发出了磁芯存储器。
1948年在贝尔实验室工作的克劳德·香农发表文章,首次将“位”的概念介绍给世界,并开创了“信息论”研究领域。
与此同时,哈佛大学的诺博尔特·韦纳提出了控制论,表示计算机和机器人的机械原理之间的关系。
1948年IBM发布了第一个商用计算机系统,代号701。
而在1947年,贝尔实验室的两个物理学家制造出晶体管,晶体管开创了固态电子器件的时代。但晶体管刚开始是商用与助听器。
1956年,肖克利离开了贝尔实验室,成立了半导体实验室,地点在加利福尼亚帕罗奥图市,其他半导体和计算机公司相继再此建立基业,这个地方就是硅谷。
晶体管同样可以连接成振荡器、加法器、选择器、解码器,振荡器可以组成锁存器或RAM阵列。
1958年,人们想到了可以在一块硅片制造出多个晶体管、电阻和其他电子元件的方法,由此演化出集成电路。之后便有了摩尔定律:每18个月同一块芯片上集成晶体管数目会翻一倍。
影响集成电路性能的最重要因素是传播时间,即输入端发生变化引起输出端发生变化所需要的时间,传播时间单位是纳秒(ns)。
通常情况下,每秒至少震荡一百万个周期,称为1兆赫兹(MHz)。
1970年,真正在使用集成电路在一块电路板上制造出完整的计算机处理器的公司是英特尔公司,发布的第一款产品是一个可以存储1024位数据的芯片。
英特尔为了做出通用性的计算机,然后制造出了Intel 4004,它是第一块微处理器。
它是一个4位微处理器,其每秒的最大时钟频率为108KHz,最大时钟频率也叫主频,时钟频率决定了执行一条指令所需要的时间,处理器的位数也影响处理器的速度。
到了1972年4月,英特尔发布了8008芯片,时钟频率200KHz、可寻址空间16KB的8位处理器。
再后来到了1974年5月,英特尔和摩托罗拉同时发布了8008微处理器的改进版——8080处理器和6800处理器,这两款芯片改变了整个世界。
19、两种典型的微处理器
1974年英特尔和摩托罗拉分别推出了8080处理器和6800处理器,这两个都是8位的微处理器,运行时钟频率分别为2MHz和1MHz,寻址空间都是64KB。
这两个微处理器都是40个管脚的集成电路,其中包括:电源输入、输入信号、输出信号、控制信号。
微处理器只会读取二进制数,计算,然后输出二进制数。
为了方便编程和记忆,可以为每个处理器操作码指派一个助记符,其中加载、保存和内容转移的助记符分别为STA、LDA、MOV,8080微处理器内部还设置了6个8位寄存器,这些寄存器本质上都是锁存器。
处理器中有寄存器的好处是,当计算机程序同时用到多个数据,这些数据存放在寄存器比存放在存储器更方便访问,速度更快。
微处理器的寻址方式分为:
8080处理器也包含了标志位寄存器,并可以通过运算改变标志位的值,这些标志位可以帮助处理器完成各种运算逻辑和跳转逻辑。
微处理器可以寻址的存储器叫做随机存储器(RAM),主要原因是:只要提供了存储器地址,微处理器就可以用非常简便的方式访问存储器的任意存储单元,RAM就像一本书,可以翻到它的任意一页。
在某些情况下,使用不同的寻址方式访问存储器也是有好处的,例如一项工作既不是随机也不是顺序的,解决这种工作的存储方式叫做堆栈(stack),特点是:最先保存的数据最后取出,最后保存的数据最先取出,对应的操作分别为压栈(push)和弹栈(pop)。
在编写汇编程序时,使用堆栈和标志位,就可以完成函数的调用和返回。
微处理器并不是只连接存储器,完整的计算机系统需要输入/输出设备(I/O)以实现人机交互。微处理器与外设通信,是通过与外设对应的特定地址(接口)对其进行读写操作。
外设操作时,是如何引起微处理器的注意呢?也就是说,外设的行为需要马上得到处理器的响应,这个过程叫做中断。
以上介绍的均为8080微处理器,下面来看摩托罗拉的6800处理。
6800微处理器与8080非常相似,也有40个管脚进行输入、输出、控制。6800处理器有一个16位的程序计数器PC、一个16位的堆栈指针SP、一个8位的状态寄存器,以及两个8位的累加器A、B。但6800没有设置其他的8位寄存器。
6800同样可以时间加载、保存、跳转,但其操作码对应的助记符完全不同,而且其标志位也与8080不同。
还有一个很重要的区别是:两个微处理器在保存多字节数据时,地址排序不同,分别为从小到大和从大到小。
两种微处理器的操作码不同,导致的问题就是处理器的汇编语言不同。
1975年,英特尔8080处理器被应用在第一台个人电脑上。
在8080之后,英特尔又推出8085芯片,而其竞争对手也推出了Z-80芯片,Z-80与8080完全兼容,而且增加了很多非常有用的指令。
同样,在1977年,由斯蒂夫·乔布斯和史蒂芬·沃兹内卡创立的苹果计算机公司推出了新一代产品Apple II,但它没有使用8080和6800,而是使用了基于MOS技术更加便宜的6502芯片,它是6800的改进增强版本。
1978年6月,英特尔推出8086芯片,它是一个16位的微处理器,寻址空间1MB。但8086与8080操作码不兼容,但它包含了乘法和除法指令。
一年后,英特尔又推出了8088芯片,内部结构与8086完全相同,但外部仍以字节为单位访问存储器。
IBM在个人计算机中使用了8088芯片,这种计算机叫做IBM PC。
IBM大举进军个人计算机市场,使用的都是英特尔处理器。英特尔相继发布了186芯片、286芯片、386芯片、486芯片,到了1993年,发布Intel奔腾系列微处理器。这些芯片的指令集都是兼容8086操作码的。
苹果公司的Macintosh发布于1984年,采用68000微处理器,它是16位微处理器,是6800的下一代产品。
到了1994年,Macintosh计算机开始使用PowerPC微处理器,此处理器由摩托罗拉、IBM以及苹果联合开发。
PowerPC采用RISC(精简指令集计算机)微处理器体系结构设计。其内部设置了大量的寄存器,运算速度非常快。
微处理器发展到现代,采用多种技术来提高运行速度。其中一种就是流水线技术,还有高速缓存技术。
20、ASCII码和字符转换
计算机中存储器唯一可以存储的是比特,因此如果想要在计算机中处理信息,必须按位存储。那么计算机是如何用它来存储文本的?
为了将文本表示数字形式,我们需要构建一种系统为每一个字母赋予一个唯一的编码,包括数字和标点符号。具有这种功能的系统被称为字符编码集,系统内每个独立编码称为字符编码。
那么构建这些编码需要多少比特?
就英语而言,所有大小写字母一共需要52个编码,0-9数字需要10个编码,一共62个编码,加上标点符号,数量超过64个,也就是说,一个编码至少需要6个比特。但无论如何字符数应该不超过128个,而且远远不够128个,也就是说编码长度不会超过8位。
所以答案就是7位编码时,不需要转义字符,而且可以区分大小写字母。
如何指派这些编码?当然,自己造一台计算机,可以任意指定字符对应的编码。但是这是不通用的,也与其他计算机不兼容。
这样一来,随意编码就不合适了。如果在处理文本时,字母表的编码是按顺序来的,那么工作起来就会很便利,优点是:字母排序和分类将变得简单。
于是就产生了一种标准,被称为美国信息交换标准码,简称ASCII码。
ASCII码是7位编码,二进制取值范围是00000001111111,对应十六进制是00h7Fh。
在ASCII码中,大写字母与其对应的小写字母ASCII码相差20h。(大写字母=小写字母-20h)
这种规律大大简化了程序代码的编写。
ASCII码中有95个编码称为图形文字,因为其可以显示出来,还有33个控制字符,它们用来执行某一特定功能,因而不用显示出来。
其中,回车符使打印头换行并转移至当前页的最前端,换行符使打印头转移至当前位置下一行。
尽管ASCII码是计算机领域最重要的标准,但其缺点是:只能用于美国。其他国家有太多字符无法表示。
于是就想到一种扩展ASCII字符集的方案,计算机采用8位编码存储字符,这样就可以保存256个字符。在这个字符集中,编码00h7Fh与原ASCII码保持一致。编码80hFFh用来引入其他字符:例如重音字母以及非拉丁字母。
但是这种扩展ASCII码的思想开始被滥用,随之而来就产生了不同版本扩展的ASCII码,导致编码不一致。
由此,业界打算建立一个独一无二的字符编码系统,它可以用于全世界所有的语言文字。
1988年开始,几大著名计算机公司合作研究一种替代ASCII码的编码系统,取名Unicode码。
Unicode码采用16位编码,每一个字符需要2个字节,00000h~FFFFh共计65536个不同字符,全世界所有人类语言,都可以使用同一个编码系统,而且具有很高的扩展性。
Unicode码前128字符编码是与ASCII码一致的,也就是兼容ASCII码。
Unicode码优点是可以表示世界所有语言,但缺点是存储空间比ASCII码要大一倍。