柏虎资源网

专注编程学习,Python、Java、C++ 教程、案例及资源

世界上第一台计算ENIAC到底是怎么工作的,和代的计算机还一样吗

很多人在之前讨论最早的计算机的文章中有这样的回复:

那么咱们今天就来扒一扒最早的计算机到底是个啥,这东西有哪些是现在的计算机不能企及的,又有哪些部分是现代计算机早已经远远超越的。

首先要说的是——ENIAC作为世界上第一台真正意义上的电子计算机,其工作原理和今天的计算机既有传承,也有巨大差异。它并不是靠“存储程序”来运行的,而是依赖上万个真空管、继电器和电缆,通过物理插接和开关配置来定义运算路径。

早期,在ENIAC上编程主要是依靠线缆跳线来完成的,所以,在上面照片中并不是工作人员在维护ENIAC,而是在执行真正的编程操作。

通常的情况下,ENIAC的计算程序设计会被先绘制在一张编程板上:

在解决一个计算问题的时候需要在这个板子上画好了线路跨接路径,定义好接线的次序和接线参数然后由操作员对照着纸上的连接提示把连接线相互连起来。

一旦连接线连接好了之后,ENIAC就可以通电走完整体的逻辑关系。实际上在单步计算上没有现代计算机指令集的调用、没有用到地址表、不需要进行复杂的寻址操作。因此它的计算速度会远远超过现代计算机。

但这并不意味着它整体算力超越现代计算机。原因很简单:ENIAC没有现代意义上的指令集和内存寻址机制,它靠人工布线,每一次编程就是一次硬件重构,复杂逻辑和数据存取全都要靠外部辅助。所以要清楚一点——它的“快”只是单一算术电路并行触发的结果,而不是系统性的性能优势。

由于每个步骤需要拔插电缆,在ENIAC的计算过程中反而费时费力的并不是计算本身,而是重新配置编码盘接线。因此这个东西的整体计算效率并不高。

为了解决这个问题,就出现了一个关键的人物——冯·诺伊曼。冯·诺伊曼之所以成为计算机史上的转折人物,就在于他敏锐地看到了 ENIAC 的局限:人工布线的编程方式把机器禁锢成了“巨大但僵硬的计算器”,只能解决单一问题,缺乏通用性。他提出的核心思想就是——把程序像数据一样存储在内存中,让计算机通过读取指令来自动完成逻辑控制,这就是后来被称为“冯·诺伊曼结构”的体系。它彻底改变了计算机的编程模式:不再需要拔插电缆,而是通过指令流和数据流的调度,机器可以在一套硬件架构下反复执行不同的程序。用的东西很简单——“打孔带”。

这是一种在1725年就出现在提花织布机上的古老物件。通过在纸带上打孔来控制织布机的行针方式,从而可以织出各种图案的布匹。

到了1846年这种打孔带也就逐渐的被应用在电报业务中。成了图案之外的真正信息载体。

如果我们去看ENIAC的编码盘,我们会发现这也是一个基于位置的阵列系统:

天生就和打孔纸带上的阵列孔有相似特性。冯·诺伊曼就是利用了这一点,把接线规则替换成了光电信号。利用纸袋机替换掉了手工接线的过程。到了1948年前后,冯·诺伊曼借鉴了提花织机、打孔卡/纸带的思想,把“信息载体”与“控制逻辑”绑定,让电信号能自动驱动逻辑单元,而不是让操作员每次都重新插线。

有了输入设备(纸带)、输出设备(同样是纸带),加上统一的存储结构和逻辑控制,计算机才真正进化成我们今天熟悉的“冯·诺伊曼机”。ENIAC是开端,而冯·诺伊曼的思想才是灵魂。

那么,我们能不能复现这个过程呢?其实是可以的!

例如上面这张图片:就可以当作一个程序和数据的载体让ENIAC执行计算工作。它的本质就是一个二维阵列:每一列代表一个时钟周期的指令或数据,每一行对应不同的通道/寄存器。打孔的位置就是“1”,不打孔就是“0”。当纸带通过光电读头时,电信号就会按照预设的节奏被送进逻辑电路,从而触发加法器、乘法器或者跳转控制。

为了让大家能够更直观地感受到 ENIAC 的工作方式,今天没事就专门写了一个“ENIAC 纸带模拟系统”。它的目标很简单:让现代人通过电脑和一块廉价的 ESP32 开发板,就能体验当年工程师用纸带控制电子计算机的过程。

整个系统分成几部分。首先是纸带生成器,它能把二进制程序数据转换成一张带有链轮孔的“纸带图像”。图像里包含了程序头、数据区、CRC32 校验等信息,完全模仿了历史上的纸带格式。然后是纸带读取器,它会把图像再解码回数据,并通过串口发送到 ESP32,等于是把“打孔纸带”的物理过程转化为现代通信。ESP32 这一端有一个接收程序,负责把数据保存到板载存储,并且返回确认信号,确保传输可靠。

为什么用ESP32呢?这玩意便宜!,一个ESP32芯片本身的价格也就是7块钱人民币,而一个ESP32的开发板价格也就只有20多块钱。

最核心的部分是弹道计算程序。ENIAC最初的用途就是做炮弹弹道表,我在程序里复刻了这一逻辑:以初速 850 m/s、发射角 32.5° 为参数,在重力作用下计算每个时间步长的位置,直到炮弹落地。计算公式依旧是经典的牛顿力学,轨迹点的推算完全按 ENIAC 累加器的思路来实现。

最后就是ENIAC模拟器。它会读取刚才生成的程序文件,用虚拟的累加器和指令集执行,并打印出轨迹、射程和最大高度。相比真实的 ENIAC,这个模拟器快得多,但在架构逻辑上保留了“指令即电路”的特征,让人能清晰看到那个时代的设计思路。

其实,在这个演示中,我们只需要运行几个脚本,就能走完整套流程:生成程序、转换为纸带、发送到 ESP32、最后在模拟器执行。例如上面的这条纸袋所代表的含义则是:
速度: 890 m/s
射角: 32.5
距离: 73179.04 m
最大高度: 11655.05 m
飞行时间: 97.49 s

ENIAC的“快”是电路层面的瞬时快,不是体系结构的可持续快。它是十进制环形计数器堆出的算术阵列:20个累加器、脉冲触发、函数表外接常量,靠插接板与拨盘把数据路径“焊死”成一次性的算法网络。加法约0.2毫秒、乘法约2.8毫秒,这些数字只说明单个算术单元在被正确布线后响应迅速;但一旦问题变了,程序等于报废,所有路径重画、重插、重校。1948年那次“改装”,只是把函数表等部件当作临时的程序只读源,勉强串起有限的指令序列,它依然不是存储程序机。因此,把ENIAC与现代处理器做“速度”对比,本身就是错误命题:缺少地址空间、条件控制与可重定位代码的系统,谈不上通用算力。

所以说,冯·诺伊曼结构真正改变的是编程对象。在这套结构里,程序与数据被一体安置到同一可随机访问的存储器中,处理器以“取指—译码—执行”的时序循环驱动控制流,条件分支、循环、间接寻址与子程序由此成为一等公民。但是要注意——所谓“冯·诺伊曼结构”不是泛泛的“用了纸带/卡片输入”,而是把指令表示为可寻址的字,用统一的地址空间管理控制与运算,让“重布线”退场,由“重编译/重装载”接管。从这一步开始,计算机才真正的获得了抽象层级:汇编—高级语言—编译器—操作系统,软件得以迭代,硬件得以解耦。

还有一点得说说了,这是咱们目前计算机教育的缺失,在大多数计算机教材中都写到现代计算机是“冯·诺伊曼结构”,其实这件事不对!甚至可以说是半个世纪之前的老皇历了。

今天绝大多数通用处理器只在语义层承袭“存储程序”思想:指令与数据共享统一的虚拟地址空间,处理器按“取指—译码—执行”来保证可编程性与可重定位代码。这是一种编程契约,而不是对物理实现的准确描述。

到了实现层,主流CPU早已是“改良哈佛”。指令与数据各有独立的一级缓存、TLB、预取与一致性路径,前端还会把复杂指令拆成微操作并缓存在uop cache 里;后端乱序执行、寄存器重命名、分支预测与投机回滚,把“线性指令流”硬生生改造成并行的数据通道。所谓“冯·诺伊曼瓶颈”被多级缓存、带宽并行与预取器部分掩蔽——这和传统意义上的“单总线取指取数排队”完全不是一回事。

再往上到系统层,我们已经是“多结构并存”:CPU保持通用性,GPU/TPU走数据流/空间映射路线(SIMD/SIMT、脉动阵列、片上SRAM作显式工作区,靠DMA搬运),NPU/ISP/编码器是更强的专用阵列;内存体系呈NUMA与异构分层(HBM+DDR+持久内存),总线与互联(CCIX/CXL/Infinity/NVLink)提供跨设备一致性与共享虚拟内存。说白了,软件语义仍是冯·诺伊曼的“存储程序”,硬件形态却同时在走哈佛化与数据流化。所以,现在很多人看到了一些计算机架构图,例如:

你会发现这些看起来像是当初大学计算机课程里面学的冯·诺伊曼结构,但是又有一些不对劲。其实就是我们所学到的教材偷懒了。很多教材里那张“CPU—存储器—输入输出”的框图,说是“冯·诺伊曼结构”,在现在看只是一个历史符号而已。它描述的是1940年代的理想模型,而不是2020年代的现实硬件。

到了今天,你随便找一张现代主板的架构图(比如上面这一张),CPU旁边除了内存控制器,还有PCIe控制器;南桥PCH下面挂了一堆网卡、声卡、硬盘控制器;缓存、预取、分支预测、乱序执行全都埋在处理器内部。这和当年“指令和数据走一根总线”的冯·诺伊曼机,已经完全不是一回事。

换句话说,我们继承的是编程契约,不是物理实现。程序员眼里还是统一地址空间、取指执行循环,但硬件工程师眼里早已是“改良哈佛 + 异构数据流”的混合体。CPU在保持通用性的同时,身边围满了GPU、TPU、NPU这些“专职干活的外援”,真正的算力早就不是单核、单总线能解释的。

所以,当教材还在用“冯·诺伊曼结构”去概括“现代计算机”,其实就是一本半个世纪前的老皇历。它方便教学,但别因此产生错觉:好像我们今天用的电脑,还跟1948年的ENIAC是一个物种。事实恰恰相反——我们站在冯·诺伊曼抽象之上,但实现层早已四分五裂,硬件世界走的是混血架构。这才是当下计算机体系真正的样子。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言