混沌与光明

17世纪,Pascal发明了第一个机械计算器.

19世纪初Babbage设计了差分机,Ada则成为世界上第一个计算机程序员.

20世纪初,数学家大卫希尔伯特提出了著名的23个问题,其中第二个问题为"判定一个公理系统内的命题是相容而无矛盾的",第十个问题为,对于任意多个未知数的整系数不定方程(也称丢番图方程)是否存在一个"算法",能在有限时间内判定该方程有无整数解.对第10问题的讨论,引出了对什么是"算法",什么是"可计算"的讨论.随后,哥德尔证明了第二问题为假,即哥德尔不完备定理.随后,Alonzo Church和Alan Turing分别形式化的给出了证明,分别引出了λ演算和图灵机的概念.虽然λ演算先于图灵机提出,而且和图灵机等价,但是图灵机对当时的影响更大.图灵机中纸带和固定规则的概念深深的影响了真正的计算机.

二战中,国际商业机器公司(IBM)的机械制表机和打孔卡同时畅销于美国和纳粹德国.机械制表机的出现大大加快了美国人口普查及其他繁琐的数据统计工作的速度,打空卡也流行于政府和工业界.然而,机械制表机只能做特定的工作,没有通用性.

二战后,为了研究导弹技术,第一台通用电子计算机由美国陆军在宾夕法尼亚大学于1946年制造,即ENIAC(Electronic Numerical Integrator and Computer,电子数字积分计算机).ENIAC开始并没有存储器,在John von Neumann的建议下,加入了存储器.随后又出现了数个由大学,政府或商业公司开发的计算机,比如EDSAC ,Ferranti Mark 1(第一台商业生产的计算机),UNIVAC I(通用自动计算机,第一台大规模生产的计算机).

随着晶体管和集成电路的出现,计算机的使用开始普及.IBM成功的将计算机从科学和军事用途推广到商业用途,当时其产品有IBM 650,IBM 701,IBM 704等.最早的高级编程语言,FORTRAN和LISP 均为IBM 704开发,704也是第一台具有硬件浮点单元的计算机.IBM 704连同外设共10吨.有4K个32bit字的内存.这种为商业开发的计算机被称为大型机.

大型机与分时系统

在50年代和60年代,大型机常用打孔卡作为程序的输入方式(例如与IBM 704一起使用的IBM 711打孔卡读卡器,IBM 721打孔卡记录器),打印机作为结果的输出方式,磁芯作为内存(737磁芯存储单元),磁带和磁鼓作为二级存储(IBM 727磁带单元,IBM 753磁带控制单元)

早期的大型机一次只能运行一个程序.使用这种大型机,首先要在纸上编写程序(通常使用机器语言,后来IBM发明了FORTAN语言,并提供了编译器和库函数),随后打印到打孔卡上,程序所需要的数据使用打孔卡或磁带存储.用户将材料提交给计算机管理员,并缴费(大型机作为当时昂贵的计算资源,按运算时长收费!).

1955年,为了避免排队等待或是机器空闲,通用汽车的IBM 701大型机管理员编写了通用汽车操作系统.在监视程序的帮助下,计算机管理员提交一批任务后,计算机就会自动的执行,随后打印出结果,或者程序出错崩溃.出错的程序可以通过控制面板的指示灯,拨号盘和开关来进行调试,或者直接放弃执行.修改后的程序,就要第二天重新等待下一批.后来IBM 650引入一项功能,如果机器出现随机处理错误(硬件故障),则允许从错误的地方恢复.随后有各种批处理监视程序诞生,但是,用户需要一个多任务系统.

MIT在修改后的IBM7090大型机上制作了第一个分时系统:CTSS(兼容分时系统,兼容指兼容之前的程序),包含了现代操作系统的常见内容:多用户支持,命令行解释程序RUNCOM,文本编辑器QED,汇编器FAP.这个系统引发了研究者对分时系统的兴趣,但是其没有走出实验室.

MIT,通用电气和贝尔实验室于1964年开始开发Multics(多路复用信息和计算服务),一个为GE-645大型机开发的分时系统.该系统基于CTSS系统,并有许多创新,但是其复杂性和规模越来越大,贝尔实验室对此项目进展不满意,退出了该项目.通用电气继续开发,并成为自己的商业产品.

尽管有很多分时系统在60年代出现,但是大多都没有成为主流.一方面由于硬件架构经常变化,而对应的系统几乎没有可移植性,同时导致这些系统上的软件也没有可移植性,另一方面分时系统的效率较低,而且当时硬件的内存极小,很不适合共享.

IBM推出的IBM System/360是当时(也是迄今为止)最成功的计算机之一,其首次提出配置的概念:System/360家族硬件具有不同的处理能力和存储能力,但是具有相同的指令集,并且配件相互兼容.此款计算机上的程序甚至不需要修改就能在高配置的机器上运行,而且IBM保障了兼容性,即使有后续机型推出.IBM/360刚发布时的程序也能在现在的IBM Z系列大型机上运行.

IBM在System/360大型机上没有搭载分时系统.一方面IBM为了减小升级硬件的成本,设计了多个配置的System/360,而较小内存的System/360很难运行分时系统(内存最小仅4KB,而最大则有4MB).IBM提供了OS/360这一多道程序系统.多道程序系统的程序进行IO时会切换到另一程序以最大化利用CPU.由于OS/360开发时bug很多,IBM为了防止影响销售,提前为低端设备依次发布了BPS/360(基本编程系统,用于8KB内存,至少有打孔卡读卡器的设备)BOS/360(基本操作系统,用于8KB内存),TOS/360(磁带操作系统,用于16KB内存带磁带驱动器的设备),DOS/360(磁盘操作系统,用于16KB内存带磁盘驱动器的设备).一年后发布的OS/360至少需要64KB内存,这导致占用资源较低的DOS/360成为当时最流行的系统.

从电报到电传打字机再到终端

时间再向前倒回19世纪,1837年,英国的库克和惠斯通在英国建立了13英里的电报系统,这是世界上第一部商业电报.同时在大洋对面,美国的摩尔斯发明了一种新型电报系统,其仅使用电流的通断及持续时间来编码信息,即摩尔斯电码.1844年,摩尔斯的电报系统在美国开始使用.1865年,改进后的国际莫尔斯码成为国际标准.但摩尔斯电码学习困难,很难被一般人熟练掌握,因此有人试图用各种机械按键来简化输入输出.Royal Earl House在1846年发明了一种打印电报,具有2个28键的键盘,发送方按下键后,接收方便打印这个键对应的字符.这个系统传输较慢,不能量产.1855年,David Edward Hughes(也是麦克风的发明人)改进了Royal Earl House的机器,发明了自己的印刷电报机,并组建了西部联合电报公司,他的电报系统成为当时欧洲的标准.1874年ÉmileBaudot发明了Baudot编码,并改进了Hughes电报系统,使其支持分时多路复用,并能自动编解码并打印字符,波特这个单位即纪念他.之后,电报的原始发明人惠斯通发明了惠斯通穿孔器,发报员首先使用机器将信息打印到打孔纸带上,随后被自动发报机以极高的速度发送.1903年,在Joy Morton的资助下,Charles L. Krum发明了轮式印刷电报机,并申请专利,随后二人成立Morkrum公司.1908年,Morkrum公司制作了一台电传打字机.1919年,Kleinschmidt也提交了相关专利,改进了轮式打印机的启停同步方法.为了避免专利纠纷,1924年Morkrum公司和Kleinschmidt的公司合并成Morkrum-Kleinschmidt公司,1928年又更名为Teletype公司,1930年被AT&T收购.电传(Telex)是二战后普遍的书面信息传输方式.电报是人类历史上第一个电子通信信方式,也是第一个无线通信方式,而电传打字机诞生了使用数字编码字符的方法.1963年,为了统一各种电传打印机的编码,美国标准协会制定了ASCII码,取代了Baudot码,Murray码及ITA2码.

而电传打字机,在计算机出现后,成为主流的输入设备.尤其是拥有分时操作系统的大型机,同时可以连接上千个电传打字机.大型机的用户可以使用电传打字机通过电传网络连接到主机,不必来到主机前.

1968年的计算机终端公司推出了自己也是世界上第一个终端Datapoint 3300.Datapoint 3300兼容Teletype Model 33,后者是当时最流行的ASCII电传打字机.而Datapoint 3300没有打印机,它将字符显示到显示器上,这样不仅噪音更低,而且节省纸张.

Datapoint 3300可以输出25行72列的纯大写字符,而且使用TTL芯片组装,没有内置RAM,而是使用54个200位位移寄存器输出图像.当时的RAM很贵,直到Intel公司于1970年发布1103,DRAM的价格才可以被接受.

小型机与Unix

大型机主要为大商业公司和政府设计,可靠性很高,但是价格也以数十万美元起步,甚至达到数千万美元的硬件软件费用.高昂的售价实际上只适合于金融业和大型企业,大学和许多小公司根本无力购买.

数字设备公司(DEC)借机推出PDP系列计算机(Programmed Data Processor,程序数据处理器),“PDP”这个名称故意避免使用“计算机”这个术语,因为在第一台PDP之前,计算机是大型,复杂和昂贵的机器的意思.PDP性能远不如IBM的大型机,但体积小(接近于现在的柜式空调机大小),售价低(数万美元).后来这种计算机被称为小型机.小型机性能不高,经常用于程序开发,CAD或者自动控制.

贝尔实验室退出Multics项目后,曾经参与该项目的程序员Ken Thompson决定编写自己的操作系统,这个新系统要更高效,能在更低配置的机器上运行.他在实验室中找到了一个没有人用的PDP-7,在上面编写新的操作系统,还编写了一个叫"太空旅行"的游戏.1969年,由Ken Thompson和Dennis Ritchie领导的研究小组开发出的系统已经具有文件系统,进程,命令行解释器等概念和功能.随后,这个由汇编编写,具有编辑器,汇编器和shell的系统完成了自举(即自己编译自己).随后这个系统被命名为Unix.

1970年,贝尔实验室计算科学研究中心获得经费,Unix被移植到新购买的PDP-11上,并被其他部门广泛使用.1971年11月3日,Unix程序员手册第一版发布,也被认为是Unix第一版.

在将Unix从PDP-7移植到PDP-11时,Ken Thompson希望有一个高级语言来编写应用程序.Ken Thompson开发了基于BCPL的B语言.但是B语言比较慢,Dennis Ritchie改进了B,创造了C语言.1972年6月12日的第二个版本的Unix开始包含C编译器以及C编写的程序.1973年二月的第三版Unix中包含了C的调试器.

1973年11月的Unix第4版中,Unix的内核也由C语言编写.同年的操作系统原理研讨会上,Unix正式公开公布.估计有20台PDP-11安装此版本Unix.

1974年6月,AT&T将Unix第5版的源码授权给大学,由于条款十分严格,用户很少.此版本中还包含大量的PDP-11汇编.

1975年5月,第6版Unix以两万美元的价格出售,由于许可条款不限制分发源代码,因此此版本的Unix在大学间广泛传播.加州大学伯克利分校基于此发布了著名的伯克利软件发行版第一版(1 BSD).新南威尔士大学教授John Lions出版了图书《Unix第6版评论》,包括Unix第6版在PDP-11/40上的代码,以及相关注释,用于操作系统教学.但是这本书被AT&T声称违反许可证而停止出售,但是各种复印版流传于计算机专业的大学生手中.

1975年,Unix Users Group成立,由于Unix是AT&T商标,后来改名为USENIX.

1977年,贝尔实验室采购了Interdata 8/32 小型机,并将Unix移植到了此平台.这是Unix第一次运行在非DEC机器上.随后Unix又被移植到System/370的虚拟机VM/170中

1978年,Ken Thompson和Dennis Ritchie编写了一般介绍C语言的书籍《The C Programming Language》,直到1989年C语言第一个标准,这是C语言的事实标准.

1979年一月,第7版Unix发布,这是第一个可移植的版本,通过Dennis Ritchie开发的便携C编译器,该系统可以移植到许多平台.这也是最后一个由计算科学研究中心(CSRC)广泛发行的Unix.

1979年5月,2 BSD发布,并包含了著名的vi和C shell.有趣的是志愿者在2018年12月19日为BSD 2.11提交了一个安全补丁.

加州大学伯克利分校的学生重写了Unix内核,以利于VAX架构的虚拟内存的功能,1979年末发布了3 BSD.

Unix研究的主力,实际上来到了加州大学伯克利分校.CSRC后来发布的第八版Unix和第9版Unix都是基于BSD.

第一个微处理器与电子计算器

然而,即使是小型机,其价格和复杂性也不适合普通消费者.Unix在大学,企业,实验室直接流行,但普通消费者却从没有机会接触到计算机.正如计算机最早是用来计算数学问题的一样,真正做到人手一台的计算设备也是用与计算数学问题的,这就是电子计算器.

1968年,仙童八叛逆之二的罗伯特·诺伊斯、高登·摩尔离开仙童半导体,共同创办英特尔(Intel)公司,Intel是“集成电子”(INTegrated ELectronics)的缩写。著名的安迪·葛洛夫随后加入英特尔。Intel创建之时,其目标是生产替代磁芯存储器的半导体存储器.Intel的SRAM(静态随机存取存储器)非常成功,成为大型机主存的主流,随后又推出速度更快的DRAM(动态随机存取存储器)和ROM产品.但是随着日本半导体行业崛起,日本推出了价格更低的ROM和RAM产品,这导致Intel的营收大大降低.

由于某种巧合,1969年,日本的Nippon计算器公司联系Intel,为其Busicom打印计算器设计12个定制芯片,而Intel的工程师建议只需要4个芯片即可.1971年,Intel推出4个芯片:4001:RAM,4002:ROM,4003:用于I/O的移位寄存器,4004:中央处理器.由于项目延期,Intel返还了部分费用,但是要求可以自由销售这些芯片.不同于过去使用多个专用ASIC芯片组成的计算器,4004允许通过编程来改变其功能,其代码保存在ROM中.第一款微处理器芯片由此诞生了.

4004由Federico Faggin独自设计,拥有2300个晶体管,10微米工艺,面积为12平方毫米,拥有16个4位寄存器,指令集有46个指令,支持3层嵌套调用,每秒可执行92000条指令.其性能超过了所有40年代的早期计算机.早期的计算器内部没有使用浮点数运算,而是使用BCD码进行运算,这一情况直到80年代IEEE-754浮点数标准通过才发生变化.因此Intel早期的CPU对BCD码提供了很好的支持.

4004之后,1974年,Intel推出改进版4040,增加了对中断、单步执行、ROM存储区切换的支持,并增加了用于中断的8个4位寄存器,用于调用和中断的栈深度增加到7层。

然而4004的性能不强,功能针对于BCD运算,因此只适合用于计算器.尽管如此,4004还被用作微控制器,比如控制桌上弹球游戏.

有些巧合的是,前面提到的CTC公司的Datapoint 3300终端由于使用了大量的TTL电路,发热量很大,CTC公司找到Intel和TI公司,希望他们能提供微处理器来实现终端的处理芯片.Intel将该计划中的芯片称为1201,这是世界上第一款8位微处理器,由CTC公司的Victor Poor和Pyle设计指令集和架构.然而TI发现Intel的设计不能制造出可用的芯片,因为此项目中Intel方面的工程师既不是芯片设计师也不是半导体工程师.CTC决定继续使用TTL实现,1970年,CTC的下一代产品Datapoint 2200发布,依旧使用大约100个TTL芯片,并且指令集兼容1201芯片.1971年1月,4004的设计师Federico Faggin对1201进行重新设计,并于1971年提交给CTC.不过CTC发现TTL实现的芯片比MOS集成电路要快,因此放弃了与Intel的合作,Intel没有得到5万美金的合同款,但是拥有芯片的知识产权.Intel随后将1201重新命名为8008,并于1972年4月以120美元的价格公开销售.

作为8008的兼容产品,CTC Datapoint 2200具有2K的内存(最大16K),能够显示80x12个字符,具有可选的磁带机和软盘驱动器,并且具有调制解调器,硬盘,打印机等外设.

实际上,Datapoint 2200可编程终端是世界上第一台个人电脑;Victor Poor和Pyle设计的指令集是现在X86指令集架构的祖先,他们的实现甚至早于Intel,但是公司并不希望此产品向这一方向发展.Datapoint 2200是一款相当热销的终端,因此公司改名为Datapoint.Datapoint公司80年代初成为财富500强企业,但是由于财务问题最终破产.

8008使用10微米PMOS工艺,具有3500个晶体管,7个8位寄存器和7层的栈寄存器,每秒执行36000到80000条指令,略慢于4004,但是一次处理8位数据的优势使其运算速度更快.由于8008的引脚只有18个,8008只有一个8位的总线,限制了8008作为通用处理器的能力.

走过了70年代,就到了堪比寒武纪大爆炸的80年代,家用计算机的辉煌时刻.

受篇幅原因,在另外一篇文章更新.