1 发展历史

1.1 研制背景与立项

第二次世界大战结束后,计算机技术从军事密码破译和弹道计算领域迅速向民用与科研领域扩散。兰德公司作为美国空军赞助的智库,承担大量运筹学、系统工程和战略模拟任务,急需高性能计算设备。1950年代初,兰德公司内部虽已使用IBM的制表机和模拟计算机,但面对日益复杂的线性规划博弈论模型和空战模拟,现有设备无法满足需求。兰德公司高层遂决定自主研制一台全电子化、存储程序式计算机,以取代租用或借用外部机时的被动局面。项目于1951年正式立项,经费由美国空军空中研究与发展司令部(ARDC)拨付,设计目标为:机器应具备约1K字的主存储器、每秒约1000次运算的吞吐能力,且能连续运行数小时而不出硬件故障。

1.2 设计团队与建造过程

项目由兰德公司数学部的数理逻辑学家威利斯·韦尔(Willis Ware)主持总体设计,核心团队包括计算机工程师约翰·罗森(John Rose)、罗伯特·沙普利(Robert Shapley)以及来自普林斯顿高等研究院的访问学者朱利安·比格洛(Julian Bigelow)。设计理念深受冯·诺依曼在IAS机器(普林斯顿高等研究院计算机)中提出的“存储程序概念”影响。JOHNNIAC的原型图纸于1951年底完成,1952年初开始装配。建造地点设在兰德公司位于加利福尼亚州圣莫尼卡总部的地下室,空间约等同于一个篮球场。团队克服了真空管供应紧张、散热系统设计困难以及磁鼓存储器的读写头校准难题,于1953年3月首次实现加法指令的稳定执行。1953年6月,JOHNNIAC通过验收测试,正式投入运行。

1.3 运行时间线与最终退役

JOHNNIAC于1953年7月1日进入全天候生产性运行。1950年代中后期,随着晶体管计算机开始涌现,JOHNNIAC在性能上逐渐落后。兰德公司于1960年为其进行了核心存储器升级(见2.2.2),将其运算速度提升约三倍,但仍无法与IBM 7090等商用机型抗衡。1963年,兰德公司购入一对IBM 7090,JOHNNIAC转为备用和教学机器。1966年初,因真空管老化导致维护成本超过每年5万美元,兰德公司决定退役该机。1966年2月15日,JOHNNIAC在最后一次执行编程练习后被切断电源。其主体被拆解,部分部件捐赠给史密森尼美国国家历史博物馆,部分残骸由兰德公司员工纪念性地保存。

2 硬件架构

2.1 中央处理器与指令集

2.1.1 真空管逻辑与时钟频率

中央处理器采用约2500个真空管(主要为双三极管12AU7与功率管6L6),构成全并行、单地址设计。逻辑门以电阻-晶体管逻辑(RTL)形式实现,但全部使用真空管而非晶体管。时钟脉冲由晶体控制的主振荡器生成,其基频为250千赫兹(kHz)。每四条时钟脉冲构成一个基本机器周期,因此每个周期耗时约16微秒。加法执行需要两个周期(32微秒),乘法则需要约40个周期(640微秒)。值得注意的是,当时设计者曾试图将时钟频率推高至500 kHz,但因信号传输延迟和真空管开关时间限制而未成功。

2.1.2 指令字长与寻址方式

指令字长固定为20位,采用单地址格式:最左侧的4位用作操作码(可定义16种基本操作),剩余的16位用作地址码,最多可直接寻址65536个字节(即32K字,但实际存储器并未达到此规模)。操作码包括加法、减法、乘法、逻辑与、逻辑或、转移、取数、存数、输入输出等基本指令。寻址方式仅支持直接地址,无变址寄存器,程序员需通过修改指令自身(自修改代码)来实现数组遍历。JOHNNIAC没有硬件的跳转判断逻辑,条件转移借助“检测并跳过”指令实现:先检测运算结果的正负号,若满足条件则跳过下一条指令。这种设计极大简化了控制器的复杂程度,却也给编程带来额外负担。

2.2 主存储器

2.2.1 磁鼓存储系统

JOHNNIAC初始的主存储器为一台由工程研究协会(Engineering Research Associates, ERA)制造的磁鼓,型号为ERA 1101磁鼓。鼓体直径约12英寸,表面涂覆磁性氧化铁,以3500 RPM旋转。磁鼓被划分为64条磁道,每条磁道存储64个20位字,共计4096字。读写头每磁道一组,固定于鼓体上方。磁鼓的随机存取平均等待时间为半转时间(约8.6毫秒)。系统无缓存机制,指令必须等待所需数据旋转到读写头下方才能执行,这成为整机性能的主要瓶颈。为缓解延迟,程序员会将数据在磁鼓上“交错”放置:将连续的字安排在相隔固定角度的扇区,使CPU在完成一条指令后,下一个字恰好旋转到读写头位置。

2.2.2 核心存储器的后期升级

1959年,为延长JOHNNIAC的服役寿命并改善性能,兰德公司为其引入了3D-3线核心存储器。该存储器由约8000个手工编织的铁氧体磁芯组成,容量为8192个20位字,访问时间降至8微秒(约为磁鼓的1/1000)。升级后,JOHNNIAC的运算速度获得质的飞跃:原本受限于磁鼓等待时间的指令,现在可在一个周期内完成。核心存储器与原磁鼓并行存在,形成两级存储层次:程序员可将频繁使用的代码和数据(如操作系统内核)驻留在核心存储器中,而将大型数据库保存在磁鼓上。这一设计在当时属于前瞻性尝试,为后续计算机的分级存储架构积累了经验。

2.3 输入输出设备

2.3.1 穿孔纸带与卡片机

JOHNNIAC配备了一台IBM 513型穿孔卡片复制机,用于读入程序和初始数据。卡片为80列标准格式,每张卡片可由读卡器以每分钟150张的速度处理。输出端则使用IBM 514型穿孔卡片机。此外,系统还拥有一台高速纸带读取机(型号为Flexowriter),以每秒200字符的速度读取五孔纸带。穿孔纸带在调试阶段尤为常用:程序员可将修改后的代码段直接通过纸带补丁方式输入,无需重新穿制整套卡片。

2.3.2 电传打字机与行式打印机

操作员通过两台电传打字机(Teletype Model 35)与机器交互。其中一台用作系统控制台,用于加载程序、监控运行状态和输出少量错误信息;另一台用于普通用户的交互式输入。行式打印机为一台IBM 721型,每分钟可打印150行,每行最多120个字符。打印字体为全大写字母,数字和有限符号。由于噪音巨大(约85分贝),操作员常配备耳塞。在JOHNNIAC运行高峰期,打印机每天消耗约3000张连续折叠纸,打印结果常堆满半个机房。

3 软件与编程

3.1 初始编程方式

3.1.1 机器代码与手工汇编

JOHNNIAC在1953至1954年间完全依赖机器代码编程。程序员需要在纸上手动编写指令的二进制表示(例如,加法指令的操作码为0001,地址为1023则写成0001 0000001111111111)。随后将每条指令转换成穿孔卡片或纸带上的孔洞组合。由于无汇编器,地址引用必须手动计算:例如,若一条转移指令的目标地址为位置1047,程序员必须将1047的二进制值移位并拼接到指令中。这种原始方式极易出错,兰德公司曾记录一次典型的手工编程错误——某个假日晚班程序员将地址最高位错位,导致程序覆盖了操作系统的关键存储区,引发系统崩溃,耗时两小时排除

3.1.2 INTCODE 与早期解释器

1954年,兰德公司的软件工程师赫尔伯特·施皮茨(Herbert Spitz)为JOHNNIAC开发了第一款高级语言解释器——INTCODE。INTCODE是一种面向科学计算的中间代码语言,语法类似简化的FORTRAN但更接近汇编。程序员用INTCODE书写代码(例如“ADD X, Y”),由解释器逐行读取并转换为JOHNNIAC的机器指令。INTCODE支持浮点数的软件仿真(因JOHNNIAC无硬件浮点单元),但解释执行导致速度下降约为原生代码的1/10。尽管如此,INTCODE显著降低了编程门槛,使得兰德公司的非工程师研究员(经济学家、军事分析师)也能直接参与编程。INTCODE的源码长约500行,手写在穿孔纸带上,后被保存在兰德公司档案室。

3.2 操作系统雏形

3.2.1 JOHNNIAC 的监控程序

1955年,兰德公司的系统程序员乔治·米切尔(George Mitchell)编写了JOHNNIAC的第一套完整监控程序,取名为“Monitor I”。Monitor I驻留在磁鼓的前64个字中,负责初始化、程序加载、中断处理和输出控制。它支持简单的“读取作业卡片 -> 执行 -> 输出结果”循环。用户需在卡片的第一列写上“JOB”标识,后续卡片为程序和数据。当程序结束后,Monitor I会自动加载下一个作业。监控程序还包含一个简单的错误检测机制:若程序执行时间超过预设的“时间限额”,Monitor I会强行中断并打印错误代码。

3.2.2 批处理与作业调度

随运行任务量增大,兰德公司在1957年升级了监控程序为“Monitor II”,引入批处理系统。操作员可将一天内的作业按优先级顺序排列,通过一张“作业控制卡片”指定每个作业的预估执行时间、所需内存大小和输出设备。Monitor II按队列顺序调度,且允许“后台打印”:将打印输出缓存在磁鼓上,以免打印机速度拖慢CPU。这套批处理系统是后来IBM OS/360的MFT(多道程序固定任务数)雏形的重要参考。兰德公司的一位操作员曾戏称,Monitor II的调度算法就是“谁先来谁先上,除非是博士先生的项目——那就插队”。

3.3 应用与算法

3.3.1 数值计算与微分方程

JOHNNIAC最频繁的应用场景是数值求解常微分方程和偏微分方程,尤其用于模拟核武器冲击波传播、火箭弹道空气动力学和天气预报方程。兰德公司数学家开发了一套基于龙格-库塔方法的通用求解库,可将任意二阶常微分方程离散化并迭代求解。典型任务如:模拟一枚“民兵”导弹再入大气层时的气动加热分布,需要用JOHNNIAC连续运行约30小时。为减少人为错误,求解库会检查中间结果是否超出机器表示范围(JOHNNIAC使用定点数,小数点位置由程序员指定,溢出错误常见)。

3.3.2 博弈论与人工智能实验

3.3.2.1 下棋程序与启发式搜索

1956年,兰德公司研究员艾伦·纽厄尔(Allen Newell)与赫伯特·西蒙(Herbert Simon)在JOHNNIAC上实现了历史上第一个国际象棋跳棋程序(checkers program)。程序采用启发式评估函数,基于棋盘上己方棋子的数量、棋子的移动性和王棋的数量来计算当前局面的得分。搜索深度固定为两层(即“我方走一步,对方回应一步”),通过“α-β剪枝”算法减少分支数量。程序虽远未达到大师水平,但已能击败初学人类棋手。纽厄尔与西蒙后来因这一工作获得图灵奖,他们在回忆录中称:“JOHNNIAC的真空管噪音,是我们听到过的最美妙的音乐。”

3.3.2.2 自然语言处理探索

1958年,JOHNNIAC上运行了一个名为“SAD SAM”(Syntactic Analysis and Discourse Simulated Assistant for Meaning)的实验性自然语言处理程序。SAD SAM能分析包含不超过20个单词的英文句子,并从一个小型知识库(约300个事实)中检索相关信息。例如,输入“Who invented the first computer?”,程序会输出“The answer is not known. But JOHNNIAC runs faster than ENIAC.” 这类答非所问的幽默回应,被视为早期AI对话系统的“无厘头”雏形。SAD SAM采用模式匹配与关键词触发技术,未涉及真正的语法分析,但奠定了兰德公司后续在自然语言理解方向持续研究的基础。

4 影响与遗产

4.1 对计算机工程的贡献

4.1.1 技术教训与设计改进

JOHNNIAC的多项设计教训深刻影响了后续计算机:首先,磁鼓存储器的等待时间问题促使研发团队探索更快的随机存取存储器,直接催生了核心存储器的引入。其次,机器缺乏变址寄存器的缺陷,促使兰德公司在后续机型(如MANIAC II)中集成硬件变址。再次,JOHNNIAC高昂的维护成本(尤其是真空管失效的检测与替换)间接推动了晶体管在兰德未来计算机中的优先采用。最后,操作系统的批处理功能被证明是提高大型机利用率的关键,Monitor II的调度思想传播至多家大学与政府机构。

4.1.2 对兰德公司后续机型的影响

JOHNNIAC的成功经验直接用于兰德公司下一代计算机——MANIAC II(1957年)的设计。MANIAC II继承了JOHNNIAC的指令集架构并扩展为32位,同时采用晶体管逻辑和磁鼓+核心的二级存储。MANIAC II的计算速度约为JOHNNIAC的20倍。此外,JOHNNIAC的维护团队和软件组后来加入了兰德公司内部成立的“计算中心”,为兰德公司的IBM 704/7090系统提供了宝贵的技术骨干。

4.2 在计算机史中的地位

4.2.1 与同时代机型(如 IBM 701)的比较

JOHNNIAC常与IBM 701(1952年发布)对比。两者均使用真空管和磁鼓存储,但区别显著:IBM 701是通用商用机,拥有更完善的输入输出接口和IBM的销售支持,而JOHNNIAC是纯学术与军事用途的“定制机器”。IBM 701的指令集更为简单(33种指令),但计算速度略慢于JOHNNIAC(加法需约60微秒 vs JOHNNIAC的32微秒)。在软件生态上,IBM 701有FORTRAN编译器的早期版本,而JOHNNIAC仅依赖汇编和INTCODE解释器,工具链更为原始。然而,JOHNNIAC在人工智能领域的先驱性实验(下棋程序、自然语言处理)超出了IBM 701的典型应用范围,使其在计算机文化史中占据更显眼的地位。

4.2.2 历史遗迹与数字化复原

JOHNNIAC并无完整的实物保留至今,但其核心存储器模块(约4块)现存于史密森尼美国国家历史博物馆的“计算机历史馆”。兰德公司档案馆保存了约800页的JOHNNIAC技术手册、1000张原始电路图纸和六卷操作员日志。2005年,一个名为“JOHNNIAC复原小组”(由前兰德公司员工与爱好者组成)利用FPGA和软件仿真,在个人电脑上实现了JOHNNIAC的指令级模拟器,并复现了1958年的SAD SAM对话程序。该模拟器可在现代操作系统上运行,并支持加载原始纸带图像。2021年,该模拟器在一次线上“复古计算活动”中公开演示,吸引了约1500名观众观看JOHNNIAC如何运行一个国际象棋跳棋对局。

5 轶事与花絮

5.1 名称的由来与趣味命名

“JOHNNIAC”这一名称显然是对“ENIAC”的戏仿——ENIAC源自“电子数值积分器和计算机”(Electronic Numerical Integrator and Computer),JOHNNIAC则意为“约翰·冯·诺依曼的自动计算机”(John von Neumann’s Automatic Computer)。据参与命名的工程师回忆,最初团队计划称之为“RANDIAC”(RAND Automatic Computer),但冯·诺依曼本人来访时随口建议:“为什么不干脆叫我的名字?反正我每天都在听别人念叨‘冯’。” 这个玩笑被当真,从此定名。但冯·诺依曼1957年去世,并未看到JOHNNIAC最后的升级版。

5.2 运行中的趣闻与故障记录

JOHNNIAC的故障故事颇多。最著名的一次发生在1955年8月:操作员在打印报告时,一只老鼠钻入机柜并咬断了一根连接磁鼓的电缆,导致系统连续32小时无法启动。维修人员拆开磁鼓后,发现老鼠的位置正好卡在读写头下方,形成了物理性的“数据崩溃”。此后,兰德公司在机房入口增设了猫——一只名叫“脉冲”(Pulse)的虎斑猫,专门负责驱鼠。另一则趣事:1959年感恩节,一位醉醺醺的程序员试图编写一小段代码让打印机打出“Happy Thanksgiving”,却不慎将JUMP指令的目的地址写为操作系统核心区域,致使整个监控程序被覆盖。次日,修复团队花了4小时从备份纸带中恢复数据。

5.3 操作员文化与社区梗

JOHNNIAC的操作员群体形成了一种独特的“文化”。他们常在值夜班时用机器“玩”小游戏:最典型的是“闪烁灯竞赛”,即通过编程让控制台上的指示灯(约200个)以不同模式闪烁,从而判断谁的程序能使闪烁频率最快。这种非正式竞赛常演变为“灯舞锦标赛”,优胜者可获得次日清晨的免费咖啡券。操作员之间也流行一个“梗”:当程序崩溃时,他们会说“JOHNNIAC需要心灵按摩了”,然后手动输入一段让机器循环输出空字符的指令,等待操作员“冷静”再清除状态。这种操作员间的黑色幽默,后来被兰德公司的内部新闻简报以“JOHNNIAC日记”专栏形式记载。