梅尔的故事

2021-08-07 03:18:53

最近一篇关于编程的男子气概方面的文章发表了一个赤裸裸的声明:真正的程序员用 FORTRAN 编写。也许他们现在这样做了,在这个 Lite 啤酒、手动计算器和“用户友好”软件的颓废时代,但回到过去,“软件”一词​​听起来很有趣,真正的计算机是由鼓和真空管制成的,真正的程序员用机器码写的。不是 FORTRAN。不是RATFOR。甚至不是汇编语言。机器码。原始的、朴素的、高深莫测的十六进制数字。直接地。为了不让新一代程序员在对这段辉煌的过去一无所知的情况下长大,我觉得有责任尽我所能地通过代沟来描述一个真正的程序员是如何写代码的。我会叫他梅尔,因为那是他的名字。我第一次见到梅尔是在我去皇家麦克比计算机公司工作时,这家打字机公司现已解散。该公司制造了 LGP-30,这是一种小型、廉价(按当时的标准)鼓式存储器计算机,并且刚刚开始制造 RPC-4000,这是一款经过大幅改进、更大、更好、更快的鼓式存储器计算机。核心成本太高,无论如何都不会留下来。 (这就是为什么你没有听说过这家公司或计算机的原因。)我受雇为这个新奇迹编写 FORTRAN 编译器,Mel 是我探索奇迹的向导。 Mel 不赞成编译器。 “如果一个程序不能重写自己的代码”,他问道,“这有什么好处?”梅尔用十六进制编写了公司拥有的最受欢迎的计算机程序。它在 LGP-30 上运行,并在电脑节目中与潜在客户玩二十一点。它的效果总是戏剧性的。每次展会,LGP-30 的展位都挤满了人,IBM 的销售人员站在旁边互相交谈。这是否真的销售计算机是我们从未讨论过的问题。 Mel 的工作是为 RPC-4000 重新编写二十一点程序。 (端口?那是什么意思?)新计算机有一个一加一的寻址方案,其中每条机器指令,除了操作码和所需操作数的地址外,还有第二个地址,指示在哪里,在转鼓上,找到了下一条指令。用现代的话来说,每一条指令后面都跟着一个 GO TO!把它放在帕斯卡的烟斗里抽烟。 Mel 喜欢 RPC-4000,因为他可以优化他的代码:也就是说,在鼓上定位指令,这样就在一个完成其工作时,下一个刚好到达“读头”并可以立即执行。有一个程序可以完成这项工作,一个“优化汇编程序”,但 Mel 拒绝使用它。 “你永远不知道它会把东西放在哪里”,他解释说,“所以你必须使用单独的常量”。我过了很久才明白这句话。由于梅尔知道每个操作码的数值,并分配了自己的鼓地址,所以他写的每一条指令也可以被认为是一个数值常数。他可以选择较早的“加”指令,如果它有正确的数值,然后乘以它。他的代码不容易被其他人修改。我将 Mel 的手动优化程序与优化汇编程序处理的相同代码进行了比较,并且 Mel 的运行速度总是更快。那是因为“自上而下”的程序设计方法还没有发明出来,反正梅尔也不会使用它。他首先编写了程序循环的最内部部分,因此他们将首先选择鼓上的最佳地址位置。优化汇编程序不够聪明,无法这样做。 Mel 也从未编写过延时循环,即使笨拙的 Flexowriter 需要在输出字符之间延迟才能正常工作。他只是在磁鼓上找到指令,所以当需要时,每个连续的指令都刚好经过读取头;鼓必须再执行一次完整的旋转才能找到下一条指令。他为这个程序创造了一个令人难忘的术语。尽管“最佳”是一个绝对术语,就像“独特”一样,但将其相对化成为常见的口头实践:“不太理想”或“不太理想”或“不是很理想”。 Mel 称最大时延位置为“最悲观”。在他完成了二十一点程序并让它运行后(“甚至初始化器也被优化了”,他自豪地说),他收到了销售部门的变更请求。该程序使用了一个优雅的(优化的)随机数发生器来从“牌组”中洗“牌”和交易,一些销售人员认为这太公平了,因为有时客户会丢失。他们希望梅尔修改程序,以便在控制台上设置感应开关,他们可以改变赔率并让客户获胜。梅尔犹豫了。他觉得这显然是不诚实的,确实如此,而且这侵犯了他作为程序员的个人诚信,确实如此,所以他拒绝这样做。销售总监和梅尔谈了谈,大老板也是,在老板的催促下,还有几个程序员同事。梅尔终于屈服并写了代码,但他把测试倒退了,当感应开关打开时,程序会作弊,每次都赢。梅尔对此很高兴,声称他的潜意识是无法控制的道德,并坚决拒绝修复它。在 Mel 离开公司寻求更环保的 pa$ture$ 后,Big Boss 让我查看代码,看看我是否能找到测试并将其反转。我有些不情愿地同意去看。跟踪 Mel 的代码是一次真正的冒险。我经常觉得编程是一种艺术形式,它的真正价值只有精通同一门艺术的另一个人才能体会到;由于过程的本质,有一些可爱的宝石和辉煌的政变隐藏在人类的视野和钦佩之外,有时是永远隐藏的。只需通读一个人的代码,即使是十六进制的,您也可以了解他的很多信息。我认为梅尔是一个无名的天才。也许当我发现一个没有测试的无辜循环时,我最大的震惊出现了。没有测试。没有任何。常识说它必须是一个闭环,程序将在其中无限循环。然而,程序控制直接通过了它,并安全地从另一边传出。我花了两周的时间才弄明白。 RPC-4000 计算机有一个非常现代的设施,称为索引寄存器。它允许程序员编写一个使用索引指令的程序循环;每次通过,索引寄存器中的数字都会添加到该指令的地址中,因此它将引用一系列中的下一个数据。他只需要每次都增加索引寄存器。梅尔从未使用过它。相反,他会将指令拉入机器寄存器,在其地址上加一,然后将其存储回去。然后他将直接从寄存器中执行修改后的指令。编写循环是为了考虑到这个额外的执行时间——就在这条指令完成时,下一条指令就在鼓的读头下,准备好了。但是循环中没有测试。当我注意到索引寄存器位(位于指令字中地址和操作代码之间的位)被打开时,重要的线索出现了——但 Mel 从未使用过索引寄存器,它一直保持为零。当灯亮起时,它几乎让我失明。他已经将他正在处理的数据定位在内存顶部附近——指令可以寻址的最大位置——因此,在处理完最后一个数据之后,增加指令地址会使其溢出。进位将在操作代码中添加一个,将其更改为指令集中的下一个:跳转指令。果然,下一条程序指令在地址位置0,程序愉快地继续了。我没有与 Mel 保持联系,所以我不知道他是否曾经屈服于自那些已经过去的日子以来席卷编程技术的洪水般的变化。我喜欢认为他没有。无论如何,给我留下了深刻印象的是我不再寻找有问题的测试,并告诉大老板我找不到它。他似乎并不感到惊讶。当我离开公司时,如果你打开正确的感应开关,二十一点程序仍然会作弊,我认为应该是这样。我对破解真正程序员的代码感到不自在。这是黑客界最伟大的英雄史诗之一,无论是自由诗还是非诗。在一些备用图像中,它比有关该主题的所有学术书籍加在一起更能捕捉到关于黑客的美学和心理学的信息。 (但对于相反的观点,请参阅 Real Programmer 的条目。)[1992 后记——作者写道:“最初提交给网络的不是自由诗,也不是任何近似于它的——它是直接的散文风格,非- 合理的段落。在网上反弹时,它显然被修改为现在流行的“自由诗”形式。换句话说,它在网上被黑了。不知何故,这似乎很合适。”作者补充说,他更喜欢“自由诗”版本,而不是他的散文原版……] [1999 年更新:现在知道梅尔的姓氏。 LGP-30 的手册提到“皇家麦克比的 Mel Kaye,他完成了 ACT 1 系统的大部分编程[...]”。] [2001 年:皇家麦克比 LPG-30 原来还有一个声明名声在外。事实证明,气象学家爱德华·洛伦兹 (Edward Lorenz) 在 1961 年发现“蝴蝶效应”和计算混乱时正在 LGP-30 上进行天气模拟。不知何故,这似乎是合适的。]