一条指令也是一个数,所以它改得动
十六个格子,指令和数字混在一起放。同一个字既读得成数,也读得成指令——于是一段程序可以伸手把自己改掉。
《EDVAC 报告初稿》写于 1945 年 6 月 30 日,摩尔电气工程学院,美国陆军军械部合同 W-670-ORD-4926,署名只有 John von Neumann 一人。要讲的那一句在 §14.1:「CC 收到的指令来自 M,也就是数值材料存放的同一个地方……因而每个小周期必须带一个标记,指明它是一个标准数还是一条指令。」分寸要拿准:报告里两者是靠标记位区分的,不是「完全不分」;可它们同住一块存储器、用同一套地址取——正因为这样,一条指令既取得出来,也改得动。演示里那段程序没有下标寄存器可用,它把「加 11」这条指令当成数 311 取出来、加 1、写回去,下一轮它就成了「加 12」。这台小机器是本页为讲清这句话造的,不是 EDVAC 的指令集:报告里讲编程与输入输出的那几节根本没有写出来,通篇的前向引用指向一些永远不存在的章节。存储器的规格倒是齐的(§12.7):256 条延迟线,每条 1024 位,合 262,144 位,也就是 8192 个 32 位字——换成今天的说法是 32 KiB。§12.4 有一句后来被反复引用的话:「它以最触目的方式表明,一台自动高速计算装置真正的困难、主要的瓶颈在哪里:在存储器。」要说清的是,他这里的 bottleneck 说的是「容量」不够;今天讲的「冯·诺依曼瓶颈」指处理器与存储器之间的带宽,那个说法出自巴克斯 1977 年的图灵奖演说,不是这份报告。最后是那桩公案:这份报告由戈德斯坦散发出去,署名只有他一个,而莫奇利与埃克特的贡献被这件事盖住了。1947 年 4 月 8 日两人从专利律师那里得知,这份报告已经构成在先公开,会挡住他们的 ENIAC 专利;他们还是在 6 月 26 日提了申请。1973 年 10 月 19 日霍尼韦尔诉斯佩里·兰德案判该专利无效,理由里就有这一条。手稿本身已经找不到了——校订这份文本的戈弗雷在引言里写着:寻找手稿的努力失败了。
一段会改写自己的程序:单步走,看 1 号格那条指令从「加 11」一路变成「加 15」,四个数就这么加完了
十六个格子,指令和数字混在一起放。同一个字,左边一列读成数,右边一列读成指令——哪一种读法都合法,因为它们本来就住在同一块存储器里。 这段程序要把 11 到 14 号格里的四个数加起来,可它没有下标寄存器可用。它的办法是把 1 号格里那条「加 11」当成一个数取出来、加上 1、再写回去: 于是下一轮它就成了「加 12」,再下一轮「加 13」。 现在它还是出厂时的「加 11」,往后拨一拨就看见它自己变了。 《EDVAC 报告初稿》§14.1 说的正是这件事:指令来自 M,也就是数值存放的同一个地方。 报告里两者靠一个标记位区分,但它们同住一块存储器、用同一套地址——一条指令因此既取得出来,也改得动。今天每一颗处理器仍是这个样子。
