下面这份是“把早期冯·诺依曼架构(von Neumann architecture)讲明白”的全景版:它讲的是什么、为什么重要、当年的机器长什么样、怎么编程、遇到哪些瓶颈,以及它如何一路演化成今天的计算机。

1) 它到底指什么?

核心思想(1945 年 EDVAC 草案)
把计算机分成五大部件——存储器、算术单元、控制单元、输入、输出——并把程序指令与数据都用二进制放在同一存储器里,由控制单元按顺序取指—译码—执行。这就是“存储程序、统一存储”的范式,后世常简称“普林斯顿架构”。

对比一下常被拿来区分的哈佛架构:程序与数据分开存、分开总线;早期计算机与后来很多 DSP/MCU 为了吞吐/安全用这条路线。冯诺依曼架构的“合仓”设计,硬件更简洁、软件更灵活,是通用机的主线。

2) 早期硬件长什么样(1940s–1950s)

部件与典型实现

  • 存储器:最“卡脖子”的部分

    • 汞延迟线(顺序访问):把位变成声波在水银管里来回跑;容量小、读写有等待窗。
    • 威廉姆斯管(Williams tube)(早期随机访问):在阴极射线管屏上存电荷点。
    • 磁鼓(顺序访问):一圈圈旋转,程序要“卡点”放在磁面合适的位置以减少等待。
    • 磁芯存储(50s 普及,真正随机访问):把可靠性和速度带上来,才算“稳住江山”。
  • 算术与控制真空管为主(也混二极管/继电器),大多是累加器(ACC)中心的定点串行/并行混合算术,控制单元多为硬连线逻辑(微程序是 1951 年后才提出并逐渐应用的)。

  • I/O:纸带/穿孔卡/电传打字机/磁鼓/磁带,先天慢,常靠批处理。

  • 总线/时序:没有今天统一规范的“系统总线”,更多是机内若干“通道”或“寄存器-存储器”路径与中心时钟协调。

几台“教科书级”早期机

  • EDVAC(理念来源、1949/1951 投入):二进制、存储程序、汞延迟线存储。
  • Manchester “Baby”/Mark I(1948/1949):首台运行储存程序的电子计算机(Baby),Mark I 引入索引寄存器雏形,缓解自修改代码依赖。
  • EDSAC(1949):剑桥大学机器,率先投入日常科研;威廉姆斯管 + 亚瑟·威尔克斯提出子程序/汇编思想与“子程序库”。
  • IAS 机(1951):普林斯顿研究所样机,很多商用机(如 IBM 701)直接/间接受其指令格式与结构影响。
  • UNIVAC I(1951 商用):把“存储程序计算机”带到工业界。

3) 典型指令系统与编程模型

基本模型

  • 单地址/累加器架构:早期指令往往是“操作码 + 地址”,隐含一个或少数工作寄存器(如 ACC)。
  • 两指令同字:为省存储,常把两个短指令打包在一个字里(如“上半字/下半字”)。
  • 顺序控制 + 跳转:取指按顺序自增,配合条件/无条件转移。某些早期机的指令里甚至**带“下一条指令地址”**字段,以适应延迟线/磁鼓的等待节拍。
  • 寻址与下标:初期没有/很少有索引寄存器,数组循环普遍靠自修改代码(在运行时把指令里的地址改掉)。曼彻斯特系率先推广了**B-寄存器(索引)**思路,随后变成标配。
  • 数据类型:以定点整数为主,浮点最初靠软件子程序,后来才出现专用浮点单元。

取指—执行基本循环(抽象伪代码)

PC ← 起始地址
循环:
  IR ← M[PC]          // 取指
  PC ← PC + 1
  (OP,ADDR) ← 解析(IR)
  A/M[...] ← 执行(OP, A, M[ADDR]) // 在累加器与存储器之间来回搬运
  若遇跳转:PC ← 目标

软件生态萌芽

  • 汇编器符号地址(从 EDSAC、IAS 系开始普及);
  • 子程序库(数学函数、I/O 例程);
  • 批处理纸带/卡片作业流
  • 早期编译器(FORTRAN 在 1957 年面世)则属于“下一阶段”的成果。

4) 为什么它“能统治 70+ 年”?

  • 统一存储编译器/操作系统/自举成为可能:程序能当数据对待,链接、装载、优化、生成都可“程序化”。
  • 硬件简化:同一存储、同一数据通路,制造与扩展更容易。
  • 通用性:只要给出合适的程序,同一机器能做不同任务;这和“接线式/表驱动”的早期思路拉开差距。

5) 早期就暴露的痛点与后来的应对

“冯·诺依曼瓶颈”
程序与数据共用一个存储与通路,带宽访问延迟限制了吞吐;顺序取指也让指令级并行难以提升。

历史上的缓解手段(按时间脉络)

  • 物理层面:把存储从顺序访问(延迟线/磁鼓)换成随机访问(威廉姆斯管→磁芯);
  • 架构层面:索引/基址寄存器多通道 I/O(DMA)中断,降低自修改代码与忙等;
  • 微结构层面(后期):Cache 层级、预取、流水线、乱序执行、分支预测、执行并行化
  • 系统层面:编译优化、向量化/并行库、操作系统调度、存储层次管理。

真正“摆脱”瓶颈只能在架构范式上动刀(比如哈佛式分离、VLIW/超标量、GPU/加速器、数据流/向量机、存内计算等);但绝大多数通用 CPU 仍以冯·诺依曼范式为内核。

6) 你能用哪些“刻度”理解早期机器?

  • 字长:16/32/36/40/48 位等,和存储与算术精度绑定。
  • 地址空间:受存储技术与字长约束,常见几千到几万字(不是今天的“字节”语义)。
  • 指令条数:几十条即可办事;大量功能靠子程序库
  • 性能:加法以百微秒量级,乘法毫秒量级;I/O 比计算更慢,批处理批量吞吐最重要。
  • 可靠性:真空管寿命与散热是保底难题,维护几乎是“跟机工种”。

7) 早期与后来的“普林斯顿 vs 哈佛”混合体

虽然“冯·诺依曼架构”强调统一存储,但现代通用处理器普遍是混合体

  • 指令/数据 Cache 分离(L1I/L1D 是哈佛式),下层再合并成统一地址空间(冯·诺依曼式);
  • 总线/互连分层(取指、数据、I/O 并行化);
  • 安全隔离(执行域/页表/保护环)——这些都是在不改范式的前提下对瓶颈与可用性的工程化回应。

8) 小时间线(只记几个锚点)

  • 1945:《EDVAC 报告草案》系统提出存储程序思想。
  • 1948–49:Manchester Baby 首次运行储存程序;EDSAC 进入日常服务。
  • 1951:IAS 机、UNIVAC I 投入;“冯·诺依曼机”变成工程现实。
  • 1950s:磁芯存储普及、编译器诞生、商用计算机产业化。

9) 一句话总结

早期冯·诺依曼架构 =(统一存储 + 存储程序 + 顺序控制)×(真空管 + 早期存储器)
它把“计算是什么”的问题从硬件接线转移到可编程的软件世界里;此后 70 年,工业界做的几乎都是在这个范式里加速、并行、分层和纠错


如果你要做分享/备课,我可以给你出一张**“早期冯·诺依曼机速查表”**(1 页 PDF):列出 5 台代表机(Baby/EDSAC/IAS/EDVAC/UNIVAC),按“年份/存储/字长/指令/性能/编程工具”对比,顺手画一张“取指—执行”示意图。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐