Mel的故事

Lobsters Hottest 新闻

摘要

这是关于Mel的历史记录,Mel是一位真正的程序员,他为早期的鼓存储计算机直接以十六进制编写机器代码,并手动优化程序以获得最佳性能。

<p><a href="https://lobste.rs/s/wf4wid/story_mel">评论</a></p>
查看原文
查看缓存全文

缓存时间: 2026/09/24 04:56

# 梅尔传奇 来源:https://users.cs.utah.edu/~elb/folklore/mel.html ## 梅尔传奇:真正的程序员 此文由作者埃德·纳瑟(Utastro!Nather)于1983年5月21日发布于USENET。 最近一篇专注于编程*阳刚*面的文章直言不讳地宣称: `` 真正的程序员用FORTRAN编程。 或许他们现在确实如此, 在这个淡啤、 手持计算器与“用户友好”软件 泛滥的颓废年代 但在那段美好往昔, “软件”这词听着尚且陌生, 真正的电脑由磁鼓和真空管构成, 真正的程序员用机器码编程。 不是FORTRAN。不是RATFOR。甚至不是汇编语言。 是机器码。 原始、未经修饰、晦涩的十六进制数。 直接操作。 为免新一代程序员 对这辉煌过往一无所知, 我感到有责任尽力跨越代沟, 描述真正的程序员如何编写代码。 我称他为梅尔, 因为那是他的名字。 我初遇梅尔是在皇家麦克毕电脑公司, 一家现已不存在的打字机公司子公司。 该公司制造LGP-30—— 一台在当时标准下小巧廉价的 磁鼓存储电脑, 并刚开始生产 RPC-4000——一台大为改进、 更大、更好、更快的磁鼓存储电脑。 磁芯内存太贵, 而且反正也不会长久。 (这就是你从未听说过 这家公司或这台电脑的原因。) 我受雇为这台新奇设备编写FORTRAN编译器, 而梅尔是我的向导。 梅尔不认可编译器。 “如果程序不能重写自身代码,” 他问道,“它有什么用?” 梅尔用十六进制数编写了 公司最受欢迎的电脑程序。 它运行在LGP-30上, 在电脑展会上与潜在客户玩二十一点。 效果总是很轰动。 每次展会LGP-30展位都人头攒动, 而IBM的销售员则围在旁边 聊天。 这究竟是否有助于销售电脑 我们从未讨论过。 梅尔的工作是为RPC-4000 重写二十一点程序。 (移植?那是什么意思?) 新电脑采用一加一 寻址方案, 每条机器指令 除了操作码和所需操作数的地址外, 还有第二个地址,指示在旋转磁鼓上 下一条指令的位置。 用现代术语说, 每条指令后面都跟着一个GO TO! 让帕斯卡也抽这个试试。 梅尔喜欢RPC-4000, 因为他能优化代码: 即在磁鼓上安排指令位置, 使得一条指令刚完成工作, 下一条恰好到达“读头” 可立即执行。 有个程序能完成这项工作—— “优化汇编器”,但梅尔拒绝使用。 “你永远不知道它会把东西放在哪里,” 他解释道,“所以你得用单独的常量。” 我花了很长时间才理解这句话。 由于梅尔知道每个操作码的数值, 并自己分配磁鼓地址, 他编写的每条指令也可视为 一个数值常量。 他可以取出一个较早的“加法”指令, 例如,用它相乘—— 如果它有合适的数值的话。 他的代码不易被他人修改。 我将梅尔手工优化的程序 与经过优化汇编器处理的相同代码比较, 梅尔的总是运行更快。 那是因为“自顶向下”的程序设计方法 尚未被发明, 而且梅尔反正也不会用它。 他先编写程序循环的最内层部分, 使它们能在磁鼓上 首先选择最佳地址位置。 优化汇编器不够聪明,无法那样做。 梅尔从不编写延时循环, 即使当那台倔强的Flexowriter 需要在输出字符间延时才能正常工作时。 他只是在磁鼓上安排指令位置, 使得每条后续指令在被需要时 恰好*越过*读头; 磁鼓必须再完整旋转一圈 才能找到下一条指令。 他为此过程创造了一个难忘的术语。 尽管“最优”是个绝对术语, 像“唯一”一样,但口语中常 将其相对化: “不够最优”或“较不最优” 或“不太最优”。 梅尔将最大延时位置 称为“最劣”。 完成二十一点程序并使其运行后 (“甚至初始化程序都优化了,” 他自豪地说), 他收到销售部门的变更请求。 程序使用了一个优雅(优化的)随机数生成器 来洗牌并发牌, 一些销售员认为这太公平, 因为有时顾客会输。 他们想让梅尔修改程序, 以便通过控制台的感应开关, 能改变赔率让顾客赢。 梅尔拒绝了。 他认为这显然是不诚实的, 确实如此, 而且这侵犯了他作为程序员的个人操守, 确实如此, 所以他拒绝去做。 销售主管与梅尔谈了, 大老板也谈了,并在老板敦促下, 几位同事程序员也谈了。 梅尔最终让步并编写了代码, 但他把测试逻辑搞反了, 当感应开关打开时, 程序会作弊,每次都赢。 梅尔对此很满意, 声称他的潜意识在伦理上无法抑制, 并坚决拒绝修正。 梅尔离开公司另谋高就后, 大老板让我看看代码, 看能否找到那个测试并反转它。 我有些不情愿地同意了。 追踪梅尔的代码真是场冒险。 我常觉得编程是一门艺术, 其真正价值只能被 同样精通这门深奥艺术的人欣赏; 由于过程的天然性质, 可爱的瑰宝和绝妙的杰作 有时会永远隐藏于人眼和赞叹之外。 仅通过阅读代码—— 即使是十六进制的—— 你就能了解一个人很多。 梅尔,我认为,是个未被歌颂的天才。 或许我最大的震撼是 当我发现一个无辜的循环,里面没有测试条件。 没有测试。*完全没有*。 常识说它必然是个死循环, 程序会永远、无尽地绕圈。 但程序控制直接穿过它, 安全地从另一边出来了。 我花了两周才弄明白。 RPC-4000电脑有个非常现代的功能 叫做变址寄存器。 它允许程序员编写使用变址指令的程序循环; 每次循环时, 变址寄存器中的数字 被加到该指令的地址上, 使其指向 一系列中的下一个数据。 他只需每次循环时递增变址寄存器。 梅尔从不使用它。 相反,他会将指令取到机器寄存器, 将其地址加一, 然后存回去。 然后他直接从寄存器执行修改后的指令。 循环的编写考虑到了这额外的执行时间—— 就在这条指令完成时, 下一条指令恰好位于磁鼓读头下, 准备就绪。 但循环中没有测试条件。 关键线索出现于我注意到 变址寄存器位—— 位于指令字中地址 和操作码之间的那位——被置1, 然而梅尔从不使用变址寄存器, 一直将其置零。 当灵光乍现时几乎灼伤了我的眼。 他将正在处理的数据 安排在内存顶部附近—— 指令可寻址的最大地址—— 因此,在处理完最后一个数据后, 递增指令地址 会导致溢出。 进位会加到操作码上, 将其变为指令集中的下一条: 一条跳转指令。 果然,下一条程序指令位于 地址零处, 程序愉快地继续运行了。 我没有与梅尔保持联系, 所以不知道他是否曾向那些 自遥远往昔以来冲击编程技术的变革洪流屈服。 我宁愿认为他没有。 无论如何, 我深受触动,放弃了寻找 那个有问题的测试, 告诉大老板我找不到。 他似乎并不惊讶。 我离开公司时, 那个二十一点程序在打开正确感应开关时仍会作弊, 我认为本该如此。 我觉得篡改 一位真正程序员的代码不太妥当。 `` 无论是否自由诗体,这都是黑客文化中伟大的英雄史诗之一。它用寥寥数语,比所有相关学术著作更能捕捉黑客的美学与心理特质。 \[1992年附注——作者写道:"最初提交到网络时并非自由诗体,也不是任何近似形式——而是标准散文体,段落未对齐。在网络传播中它显然被修改成了现在流行的'自由诗'形式。换句话说,它被网络上的黑客修改了。这似乎在某种程度上是恰当的。\]

相似文章

乡村电脑编程 (1984)

Hacker News Top

一篇1984年的专题文章,讲述了被称为“Oregon Hermit”的保罗·卢特斯(Paul Lutus)的故事。他在偏远小屋中离网生活,编写了文字处理程序 Apple Writer,并详细描述了他早期使用 Apple II 电脑的经历。

Gigatron 编程

Hacker News Top

一篇技术文章,详细描述了作者尝试理解和编程 Gigatron TTL 彩色微型计算机的过程,涵盖其哈佛架构、CPU 指令和编程技巧。

为ENIAC编程(2011)

Hacker News Top

一篇探讨ENIAC编程过程的文章。ENIAC是最早的通用电子计算机之一,文章可能详细介绍了最初的编程技术及其历史背景。