微软似乎很喜欢用数字古董来刷情怀。八年前,微软开源了 MS-DOS v1.25 和 v2.0,两年前又开源了 v4.0。

今年4月底,微软更进一步,开源了被称作“史上最早 DOS 源码”的 86-DOS 1.00 内核以及 PC-DOS 1.00 预览版。这套源码分量极重,它让微软这家当时在西雅图的“小”公司,搭上了 IBM 这趟快车,从此一飞冲天。有趣的是,这套源码并非从微软戒备森严的服务器里导出,而是从一间车库的打印纸堆里翻出来的。

这个车库的主人不是比尔·盖茨,而是蒂姆·帕特森(Tim Paterson),QDOS 的创造者。帕特森当时是西雅图计算机产品公司(简称 SCP)的员工,这家公司决定采用 Intel 的 8086 处理器来组装个人电脑,却苦于没有合适的操作系统可用。于是,帕特森便自己动手写了一个,取名 QDOS,意为“Quick and Dirty Disk Operating System”——又快速又脏的磁盘操作系统。这名字,公司竟然也好意思把它叫出口。

当比尔·盖茨发现 QDOS 后,立刻以 5 万美元买断,并顺势把作者帕特森也挖了过来,让他将 QDOS 移植到配有 8088 CPU 的 IBM PC 上。为完成与 IBM 的合同,为即将推出的 IBM PC 提供操作系统,盖茨空手太白狼的本事确实令人佩服——连操作系统都没有,就敢签下如此重要的合约。买回来后,QDOS 这个过于随性的名字首先被改为 86-DOS,随后在 IBM PC 上,它有了一个更被世人熟知的名字:PC-DOS。
01 纸上的代码
很多人会好奇,为什么源代码会保存在打印纸上?在 80 年代初期,没有 CVS、SVN,更没有 Git 和 GitHub。当时最普遍的存储介质是 8 英寸或 5.25 英寸的软盘。

这些软盘容量极小,读写速度慢,极易受磁场、灰尘和划伤的影响,长时间使用还容易出现坏道。那时也没有成熟的自动备份技术,软盘一旦损坏,数据恢复极其困难。因此,许多程序员会定期将源码打印出来存档。这就好比今天的 git commit,每打印一次,就是一个“历史版本”。本次开源的代码,就是蒂姆·帕特森从自家车库里翻出来的“纸质 Commit 历史记录”。
当时帕特森使用的是一台 SCP 8086 机器,虽然这台机器已经有了最原始的文本编辑器和汇编工具,但显示器非常小,只能单色显示 24 行文字。

在这样的机器上,自然不会有 IDE,也不会有语法高亮、代码搜索、差分对比、多窗口……当你需要查阅大量代码时,过程极其痛苦。因此,把代码全部打印出来,摊开铺在桌子上,整个人“趴”着看,便成了一种可以同时阅览多个模块、进行交叉对比的“舒适”姿态。

02 铅笔改Bug
那个年代,许多程序员的工作流程大致如下:
- 打印源码:将成千上万行汇编代码全部打印出来,铺满整张桌子。
- 肉眼推演:左手拿着 CPU 手册,右手握着铅笔,一行一行地推演:
- 寄存器的变化
- 标志位的变化
- 内存地址的指向
- 中断调用的过程
- 直接在纸上写补丁:如果发现逻辑漏洞,为避免重新编译整个程序(软盘 I/O 慢且损耗磁盘),他们会直接在纸上将出错指令圈出来,修改指令,并重新计算十六进制偏移量。
在 QDOS 那份打印的源码中,就发现了帕特森将一条 ROL 指令圈起来,改成了 RCL 指令。

这就是那个年代硬核的“Code Review”!更硬核的是,在 1980 年代早期,许多汇编程序员并不会每次都重新编辑源文件并完整重编译系统。由于软盘缓慢、汇编和链接过程耗时,且机器内存极小,开发者经常会直接使用 DEBUG、DDT 或机器监视器等底层工具,对可执行文件中的机器码进行“二进制补丁(binary patch)”操作。他们会先在打印出的源码纸上,手工计算出新的操作码(opcode),比如将 ROL BX,1 从机器码 D1 D8 改为 RCL BX,1 的 D1 D9,然后直接修改 .COM 或 .EXE 文件中的对应字节,再写回软盘。在那个时代,这并不被视为“黑客行为”,而是一种非常正常且高效的工程实践。写到这里,我不禁想起一个经典的笑话:一个程序员,用一根针在光盘上“刻”操作系统……
03 结语
今天,当我们坐在 4K 显示器前,用自然语言给 AI 下指令,让它去写代码、改 Bug 时,很难想象四十多年前的程序员,竟要一页页打印出程序,趴在桌上一行行地审视,然后用铅笔在纸上改逻辑错误。但正是这群前辈,用这种在今天看来近乎笨拙的方式,将个人电脑上的操作系统、编程语言一点点地“修”了出来,为我们逐步构建起一个坚实、“抽象”的底座。在这个底座之上,PC 软件才开始蓬勃发展,抽象的层次也越来越高。到了今天,我们无需深入了解底层硬件,就能用 Java、Python、JavaScript 愉快地编程。从这个意义上说,我们得感谢这些先驱们创造了这个行业,让我们能在这个技术领域里找到属于自己的一碗饭。
|