简介:这是一份世界计算机发展历史的经典教学PPT,面向计算机专业学生、教师及科技史爱好者,可快速搭建从电子管到大规模集成电路与个人计算机时代的整体认知框架。内容严格按四代计算机主线展开:从1946年ENIAC的诞生及其18000个电子管的庞大体量,到晶体管时代SAGE防空系统的军事应用;再到中小规模集成电路时期NEAC 2203、IBM System/360兼顾商业与科学计算,并延伸至CDC 6600开启超级计算机先河、Kenbak-1试水个人电脑,穿插PDP-8小型机与IMP通信处理机的网络起源细节。每代机型均配有年代、参数和历史背景,图文对照,适合课堂演示、课前预习或科普讲座。压缩包为1个PPT文件,约1.6MB,内容精炼、结构清晰,便于直接修改使用。已有764人学习下载,是计算机基础教学和科技史入门的高性价比参考资料。
1. 计算机发展史的关键不是年份,而是器件换挡
计算机发展史上最常被引用的结论是“从 ENIAC 到平板电脑”,但真正驱动换代的是运算器里的开关器件:电子管、晶体管、集成电路、大规模集成电路。
决定一台机器是“快”还是“能用”的,不是发布年份,而是器件密度和功耗带来的系统选择。ENIAC 每秒 5000 次加法,是用 18000 个真空管换来的;SAGE 重达 300 吨,只为了实时追踪雷达信号;Kenbak-1 只有 256 字节内存,却立起了“个人计算机”的概念。
这份资料适合课程设计、组成原理复习和面试前时间线整理。我会把四代里的典型机器拆成工程参数,讲清每一次器件换挡为什么发生。
2. 电子管到晶体管:可靠性与实时性是怎么换代的
第一代到第二代的跨度超过十年,但最核心的变化不是速度翻了多少倍,而是“整机能不能连续跑一小时”。ENIAC 用电子管做开关,速度确实快过继电器,可电子管是发热元件,寿命以千小时计,整个系统塞进 18000 只这样的器件,平均无故障时间被压到分钟级。晶体管把同样逻辑门的功耗和失效率降了一个量级,计算机才从实验室珍品变成能布置到防空阵地里的实时系统。
2.1 ENIAC 的器件规模与整机可靠性上界
ENIAC 的物理参数在今天看仍然吓人:长 30.48 米,宽 1 米,占地约 70 平方米,相当于 10 间普通房间;重 30 吨,功耗 150 千瓦,造价 48 万美元。内部是 18000 个电子管、70000 个电阻、10000 个电容、1500 个继电器和 6000 多个开关。它能做到每秒 5000 次加法或 400 次乘法,是继电器计算机的 1000 倍、手工计算的 20 万倍。
这个规模的第一个难题不是算力,而是可靠性。电子管必须加热阴极才能发射电子,灯丝烧断、漏气、极间短路都是常态。我按串联可靠性模型估算整机平均无故障时间:
# ENIAC 整机平均无故障时间(MTBF)的近似估算 tube_count = 18000 tube_avg_lifetime_hours = 2000 # 单只电子管的保守平均寿命 # 串联模型下失效率相加 system_failure_rate = tube_count / tube_avg_lifetime_hours mttf_hours = 1 / system_failure_rate print(f"估算整机 MTBF = {mttf_hours * 60:.1f} 分钟")运行结果是约 6.7 分钟。这个输出对应一个残酷的结论:如果一个程序连续算一分钟,坏管的概率就已经很高。真实 ENIAC 的电路有冗余和分段隔离,实际表现不会精确等于 6.7 分钟,但数量级是真实的。程序员当时最大的敌人不是算法,而是换管子和排故障。这也是为什么 ENIAC 到二战结束一年后才交付:调试时间远大于计算时间。
第二代晶体管计算机把单管寿命拉到以年计,同样的 18000 个晶体管,整机 MTBF 可以到几个月。可靠性上了台阶,“程序能跑完,结果可复现”才变成默认条件。
2.2 SAGE:实时系统的第一次完整演练
1954 年问世的 SAGE(半自动地面防空系统)是另一条路线上的里程碑。它要接收各侦察站雷达传来的信息,识别来袭飞行物,再由操作员指挥地面防空武器。也就是说,它必须在输入持续到达、外部情况不断变化时,按固定周期完成计算并把结果显示出来。
SAGE 重 300 吨,放在一个水泥堡垒里。原始资料提到它配备了调制解调器和图形显示技术,处理器还是“双核”的。这里的双核要打引号:更合理的解释是它拥有两个处理单元或双 CPU 组成的主备/协从结构,而不是今天一颗晶粒里的两个核心。理解错位没关系,但复习系统结构时,别把“双核”当作 1954 年就有现代多核处理器的证据。
它的工程贡献在于把输入设备、显示设备、通信设备和处理器拼成一个闭环。调制解调器负责接收雷达站数据,图形显示器把结果画给操作员。这条链路对时间的要求,比 ENIAC 的批量计算高得多:错过一个显示刷新周期,防空操作员看到的就是过期目标。今天我们讲实时系统、状态机和中断驱动,源头都能追溯到这一代。
把 ENIAC 和 SAGE 放一起对比,能直观看到两代机器的设计目标差异:
| 项目 | ENIAC | SAGE |
|---|---|---|
| 年份 | 1946 | 1954 |
| 重量 | 30 吨 | 300 吨 |
| 部署位置 | 大学实验室 | 水泥堡垒 |
| 交互方式 | 开关、纸带 | 调制解调器、图形显示 |
| 工作模式 | 批量计算 | 实时控制 |
SAGE 依然用了大量电子管,晶体管还没有完全接手,所以很多资料把它算作第二代时,习惯加上“过渡形态”四个字。看它的结构比看器件分类更重要。
2.3 NEAC 2203:晶体管和磁芯内存把“商用”变成可能
1960 年日本电气公司的 NEAC 2203 是当时日本最早的晶体管计算机。它使用磁芯内存,主要面向商业、科学和工程用途。晶体管替代电子管后,整机不再需要像 ENIAC 那样疯狂散热;磁芯内存则让处理器能够随机访问数据,不用等磁鼓物理转到指定位置。
今天的工程师看到“磁芯内存”会觉得陌生,它其实是用磁性材料做成的小环,电流写入后能记住 0/1 状态,断电不丢失。在当时,磁芯的成本按字节算,NEAC 2203 能被商业公司接受,说明它的价格标签已经进入企业预算范围。商用软件大多是大量小笔读写,比如账目、库存、统计,磁芯这种随机访问存储器,天然比顺序读写的延迟线存储合适。
从 ENIAC 到 NEAC 2203,可靠性提升带来的是使用方式的变化:机器可以在同一栋楼里连续运行,程序可以被反复加载、调试,企业可以仰赖它处理日常数据。这一代机器已经能看出后来小型机的雏形。
3. System/360 与 CDC 6600:兼容性、流水线和 RISC 的早熟实验
1964 年是计算机组成原理教材舍不得略过的一年。IBM 发布 System/360 大型机,Seymour Cray 交付 CDC 6600 超级计算机;第二年 DEC 推出 PDP-8。第三代计算机的核心件转向中小规模集成电路,但更有意思的是系统结构:System/360 定下了“兼容性”,CDC 6600 定下了“流水线 + 精简指令”,PDP-8 定下了“小型机价格”。这三件事一直影响到今天 x86 和 ARM 的设计取舍。
3.1 System/360:统一指令集背后是软件资产保护
System/360 是第一个可涵盖全范围应用软件的计算机,商业软件、科学计算软件都能在同一系列的不同型号上安装。高端的 System/360 用在了阿波罗登月计划和空中交通控制系统里。它如此长命,至今还有部分老型号仍在运行,原因不是硬件性能,而是软件兼容。
以前的机器往往一个型号一套指令集,换机型等于全部软件重写。System/360 的做法是:同一个系列内,指令集保持一致,低端机型编译出来的程序,可以直接拿到高端机型上跑。用户升级硬件不用重写软件,这比硬件速度的提升更值钱。今天讲 x86 的向后兼容,讲 ARM 在不同微架构间保持指令集稳定,底层逻辑都是同一句:保护既有软件投资。
这和大学第一门专业课为什么选 C 有相似的逻辑:先理解内存、地址和指令如何被硬件解释,再谈抽象层。System/360 把这种“抽象屏障”放在指令集层,操作系统和编译器都在上面稳定工作。
3.2 CDC 6600:管线标量架构与先于 CISC 时代的 RISC
CDC 6600 是 Seymour Cray 为 Control Data Corporation 设计的第一台正式超级计算机。它采用管线标量架构,CPU 交替处理指令的读取、解码和执行,设计目标是一个时钟周期完成一条指令。Seymour Cray 的小组还自己设计了精简指令集,我们今天叫它 RISC。从诞生到 1969 年,它都是世界上最快计算机。
注意,1964 年主流是让指令越加越复杂,CDC 6600 反着做。它不追求一条指令干很多事,而是让常用指令足够简单、每个周期都能被流水线吞吐。流水线的关键思想是把一条指令拆成多个阶段并重叠执行,我模拟一下五级流水线:
# 五级流水线吞吐模拟:取指、译码、执行、访存、写回 stage_count = 5 instruction_count = 100 non_pipeline_cycles = instruction_count * stage_count pipeline_cycles = stage_count + instruction_count - 1 speedup = non_pipeline_cycles / pipeline_cycles print(f"非流水线 {non_pipeline_cycles} 个时钟周期") print(f"流水线 {pipeline_cycles} 个时钟周期") print(f"加速比 {speedup:.2f}")输出是非流水线 500 周期,流水线 104 周期,加速比约 4.81。这解释了为什么精简指令集适合流水线:指令格式规整、执行步骤均匀,硬件才能稳定地每周期送出一条指令。CDC 6600 是这套思想的第一次完整落地,后来伯克利和斯坦福的 RISC 项目,都把它当作最早参照。
三代机中 System/360 和 CDC 6600 形成两条对照路线:
| 项目 | System/360 | CDC 6600 |
|---|---|---|
| 发布 | 1964 | 1964 |
| 定位 | 商用/科学通用大型机 | 超级计算机 |
| 指令风格 | 商用大型机的复杂指令 | 早期 RISC |
| 核心卖点 | 软件兼容、系列互换 | 流水线、每周期一条指令 |
| 典型应用 | 航班管制、登月计划 | 科学计算 |
3.3 PDP-8:小型机把“每台便宜”做成商业模式
1965 年 DEC 发布 PDP-8,被认为是第一台真正意义的小型计算机。它的性能足以媲美大型机,价格却远低于同类产品,因此小企业、大学、中学、报社都开始购买。DEC 在之后 15 年里卖出了 5 万多台。
从系统结构看,PDP-8 的卖点是“把必要硬件做少”:单用户任务不需要复杂的批处理调度,外部设备也可以简化。它重现了 NEAC 2203 的商业路径,但把成本压到了学校能接受的位置。如果没有 PDP-8 验证低价通用机的市场,1977 年之后个人电脑的爆发会晚很多年。
4. 大规模集成之后:Kenbak-1、Cray-1 和藏在背后的网络需求
进入 1971 年,大规模和超大规模集成电路把晶体管数从几千推向几万、几十万。这一代的戏剧性在于,同一技术基础裂出了三条路:面向个人的 Kenbak-1、面向科研的 Cray-1,以及为多机通信而生的 IMP。今天你看到的 PC、超算和互联网,都是这几条路交叉演进的结果。
4.1 Kenbak-1:256 字节内存暴露了“个人”与“成熟”的距离
1971 年,John V. Blankenbaker 用中规模和小规模集成电路设计了 Kenbak-1。生产商把它定位为易于使用的教育工具,售价 750 美元,但最终只卖出去几十台。它没有微处理器,内存只有 256 字节,输出是几组闪烁的灯。
没有微处理器,意味着 CPU 由多块分离芯片组成,成本下不来,体积也比后来一颗芯片大得多。256 字节能装什么?一个猜拳游戏的状态和逻辑都很勉强。当时程序员说用户玩完游戏,计算机根本没法显示输赢,因为可用内存太少,用户只能靠大脑记忆。
但这台机器在概念上划开了分界线:“个人也能拥有”比“性能达标”更重要。复试或面试遇到“为什么微型计算机从 1970 年代才出现”,Kenbak-1 正好说明:个人计算机不是从某台机器突然出现的,而是从这类低性能但低价格的尝试里长出来的。
4.2 Cray-1:从 RISC 到向量寄存器,超算把“并行”写进系统结构
1976 年诞生的 Cray-1,承接了 CDC 6600 的迭代路线。它采用 64 位系统,运行速度 80MHz,带 8MB RAM,重量 5.5 吨,靠氟利昂冷却;单台售价 500 万到 1000 万美元,依然卖得动。Cray-1 的圆柱形机身不是为了拍照好看,而是为了缩短信号线:机箱弯成圆形后,最远的电路板之间距离被压缩,80MHz 的时钟在 1976 年能稳定跑起来,布线和散热功不可没。
接着 CDC 6600 的 RISC 思路,Cray-1 把并行粒度从指令级扩大到数据级。向量指令允许一条指令同时操作一组数,比如对 64 个数组元素做加法,不必写 64 条标量加法。今天的 SIMD 指令、GPU 的 SIMT 模型,都是同一个想法:用存储和带宽换计算吞吐。
做一次直观换算:
kenbak_memory = 256 cray_memory = 8 * 1024 * 1024 ratio = cray_memory // kenbak_memory print(f"Cray-1 主存是 Kenbak-1 的 {ratio} 倍") # 运行结果:Cray-1 主存是 Kenbak-1 的 32768 倍32768 倍听起来很多,但更关键的是内核结构:Cray-1 的向量寄存器库让编译器或汇编程序员可以显式表达数据并行,这一点在计算机系统结构课程里,仍然是向量机和超标量机对比的重点。
第四代早期的两个端点:
| 项目 | Kenbak-1 | Cray-1 |
|---|---|---|
| 年份 | 1971 | 1976 |
| 内存 | 256 字节 | 8 MB |
| 速度/主频 | 无微处理器 | 80 MHz |
| 散热 | 无 | 氟利昂冷却 |
| 重量 | 轻便 | 5.5 吨 |
| 售价 | 750 美元 | 500 万-1000 万美元 |
| 定位 | 个人教育 | 超级计算 |
两者之间的差距不是几倍,而是四个数量级,却都发生在同一代器件背景里。这提醒我们,代数划分只是器件维度,不能直接代表性能水平。
4.3 IMP:专用小型机把主机从通信里解放出来
1969 年出现的通信处理机 IMP,是一台插在计算机主机和电话线之间的专用小型机。它负责信息路由,主机只需要把数据交给 IMP,剩下的寻址和转发由 IMP 处理。这个想法由 Leonard Kleinrock 在 ARPANET 方案讨论中提出,IMP 因此被看成第一代网关,也就是今天路由器的祖先。
把路由功能从主机中剥离出来,是非常关键的系统设计决策。主机可以专注计算,网络协议栈则由专门设备承载。现代数据中心里的交换机、智能网卡,沿用着同样的思维:不要让主 CPU 处理所有转发路径,专用硬件更经济。Kenbak-1 和 Cray-1 回答的是单机算力,IMP 回答的是多机如何协作。
5. 用一套 SQLite 把四代计算机参数做成可查证的时间线
前四章的参数散落在不同小节里,如果要做课程设计或培训资料,最好落成一张可查询的表。SQLite 不需要部署服务,文件即数据库,适合整理这类小规模历史资料。下面这个建表方式,我一般会留两列:原始文本列和数值列。速度、价格、内存这类数据来源经常不统一,保留原始文本能防止换算时丢掉线索。
5.1 建表与插入数据
-- 建表:保留原始文本字段,避免强行做单位换算 CREATE TABLE computer_history ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, year INTEGER, generation INTEGER, device_type TEXT, speed TEXT, memory TEXT, weight_kg REAL, price TEXT ); INSERT INTO computer_history VALUES (1, 'ENIAC', 1946, 1, '真空管', '5000 加法/秒', NULL, 30000, '480000 美元'), (2, 'SAGE', 1954, 2, '真空管+晶体管', '实时控制', NULL, 300000, NULL), (3, 'NEAC 2203', 1960, 2, '晶体管', '商用计算', '磁芯内存', NULL, NULL), (4, 'IBM System/360', 1964, 3, '集成电路', '兼容系列', NULL, NULL, NULL), (5, 'CDC 6600', 1964, 3, '集成电路', '每周期一条指令', NULL, NULL, NULL), (6, 'PDP-8', 1965, 3, '集成电路', '小型机', NULL, NULL, NULL), (7, 'Kenbak-1', 1971, 4, '中小规模集成电路', '手动输入', '256 字节', NULL, '750 美元'), (8, 'Cray-1', 1976, 4, '大规模集成电路', '80 MHz', '8 MB', 5500, '500万-1000万美元');字段speed和memory都用 TEXT,因为历史资料里这些值无法统一到同一种单位:有每秒次数、有主频、有内存容量。weight_kg单独设成 REAL,便于做重量排序。SAGE 的 300 吨转成 300000 千克,Cray-1 的 5.5 吨转成 5500 千克,入表之前先在笔记里记好换算规则。
数据插入后,可以直接查代别分布:
SELECT generation, COUNT(*) AS machines FROM computer_history GROUP BY generation ORDER BY generation;GROUP BY generation按代数分组,COUNT(*)统计每组机器数,最后用ORDER BY固定输出顺序。这个查询做资料整理时很有用,能一眼看出哪个时代的样本漏录了。
5.2 用脚本验算“20 万倍”到底怎么来的
原始资料里有句常见说法:ENIAC 是手工计算的 20 万倍。这句话被引用得很频繁,但很少有人把前提算完整。我把它写成一个几秒钟就能跑完的 Python 验算:
eniac_add_per_second = 5000 eniac_seconds_per_add = 1 / eniac_add_per_second manual_seconds_per_add = 40 speedup = manual_seconds_per_add / eniac_seconds_per_add print(f"ENIAC 是手工计算的 {speedup/10000:.0f} 万倍") # 运行结果:ENIAC 是手工计算的 20 万倍这个结果等价于假设一次手工加法平均耗时 40 秒。如果按 25 秒算,倍率会掉到 12.5 万;按 60 秒算,是 30 万。所以引用这句话时,把manual_seconds_per_add这个变量留在代码里,比直接抄结论更严谨。顺便可以把 ENIAC 对继电器计算机的 1000 倍也验算:如果继电器机每秒 5 次加法,ENIAC 的 5000 次正好是 1000 倍,这里没有额外假设,因为两个数字都来自原始资料。
用这个库做复习时,我会把查询结果和资料原文逐条核对,发现对不上的数字再回到INSERT语句里改,而不是直接删掉。保留原始文本和换算后的数值两列,就是给未来的自己留一条可追溯的验证链。下次再看到“20 万倍”的引用,你会先想到manual_seconds_per_add这个参数设了多少。
本文还有配套的精品资源,点击获取