让我们先回到过去,看看比尔·盖茨在职业生涯之初在做些什么。以下是维基百科上的一段简述:
盖茨读完 1975 年 1 月刊的《大众电子》(Popular Electronics)——上面展示了 Altair 8800——之后,联系了这款新微型计算机的制造者“微型仪器与遥测系统公司”(MITS),告知他们自己和同伴正在为该平台开发一个 BASIC 解释器。实际上,盖茨和艾伦当时并没有 Altair,也没有为它写过任何代码;他们只是想试探 MITS 的兴趣。MITS 总裁 Ed Roberts 同意与他们会面看演示,于是,在几个星期里,他们先在一台小型机上开发出 Altair 模拟器,然后开发出了 BASIC 解释器。在 MITS 位于阿尔伯克基的办公室举行的演示取得了成功,并促成了与 MITS 的一项协议:以 Altair BASIC 之名发行该解释器。保罗·艾伦受聘加入 MITS,盖茨则从哈佛大学休学,于 1975 年 11 月前往阿尔伯克基与艾伦一起在 MITS 工作。他们将合伙公司命名为“Micro-Soft”,第一间办公室就设在阿尔伯克基。不到一年,连字符被去掉;1976 年 11 月 26 日,“Microsoft”这一商号在新墨西哥州州务卿办公室正式注册。盖茨从此再没有回到哈佛完成学业。
面向 6502 的 Microsoft BASIC 基于 Altair BASIC,后者是比尔·盖茨和保罗·艾伦于 1975 年为 MITS Altair 8800(使用英特尔 8080 CPU)开发的著名产品,是在新墨西哥州阿尔伯克基的一家汽车旅馆里写成的。同年,MOS Technology 推出了 6502 微处理器,作为当时其他微处理器的廉价替代品。6502 后来被众多流行计算机采用,例如 Apple I、Apple II、Commodore VIC-20 和 64 系统,以及 Atari 2600 等游戏机。
供爱好者们欣赏:这就是当年使用 6502 微处理器并运行 Microsoft BASIC 的机器之一。

以下是它的一些参数:
操作系统:Commodore Basic 1.0。CPU:6502 @ 1 MHz。内存:4 KB(早期版本),后为 8 KB。显存:1 KB。ROM:14 KB。文本模式:40 x 25。图形模式:无
当今天我们至少需要 4 GB 内存时,4 KB 内存能做什么?只靠 4 KB 内存真的可能写出软件吗?
是的,可以——这就是证据:比尔·盖茨于 1978 年编写的、目前公开可得的最古老的一段源代码。
让我们来探究这段代码的一些事实。首先,让我们从源代码注释生成一个词云,看看开发者们最关心的是什么:

String(字符串)、Pointer(指针)、Variable(变量)、Value(值)和 Space(空间)是出现频率最高的词,这表明内存管理是这类机器上的一大关注点。代码经过优化,以充分利用可用的 RAM。另一个有趣的观察是,“garbage”(垃圾)一词出现了很多次——垃圾回收对于优化内存使用非常重要。
以下是源代码注释中关于字符串管理的说明:
STRINGS
IN THE VARIABLE TABLES STRINGS ARE STORED JUST LIKE
NUMERIC VARIABLES. SIMPLE STRINGS HAVE THREE VALUE
BYTES WHICH ARE INITIALIZED TO ALL ZEROS (WHICH
REPRESENTS THE NULL STRING). THE ONLY DIFFERENCE
IN HANDLING IS THAT WHEN "PTRGET" SEES A "$" AFTER THE
NAME OF A VARIABLE, "PTRGET" SETS [VALTYP]
TO NEGATIVE ONE AND TURNS
ON THE MSB (MOST-SIGNIFIGANT-BIT) OF THE VALUE OF
THE FIRST CHARACTER OF THE VARIABLE NAME.
HAVING THIS BIT ON IN THE NAME OF THE VARIABLE ENSURES
THAT THE SEARCH ROUTINE WILL NOT MATCH
'A' WITH 'A$' OR 'A$' WITH 'A'. THE MEANING OF
THE THREE VALUE BYTES ARE:
LOW
LENGTH OF THE STRING
LOW 8 BITS
HIGH 8 BITS OF THE ADDRESS
OF THE CHARACTERS IN THE
STRING IF LENGTH.NE.0.
MEANINGLESS OTHERWISE.
HIGH
THE VALUE OF A STRING VARIABLE (THESE 3 BYTES)
IS CALLED THE STRING DESCRIPTOR TO DISTINGUISH
IT FROM THE ACTUAL STRING DATA. WHENEVER A
STRING CONSTANT IS ENCOUNTERED IN A FORMULA OR AS
PART OF AN INPUT STRING, OR AS PART OF DATA, "STRLIT"
IS CALLED, CAUSING A DESCRIPTOR TO BE BUILT FOR
THE STRING. WHEN ASSIGNMENT IS MADE TO A STRING POINTING INTO
"BUF" THE VALUE IS COPIED INTO STRING SPACE SINCE [BUF]
IS ALWAYS CHANGING.
以下是错误处理的方式:
ERROR MESSAGES
WHEN AN ERROR CONDITION IS DETECTED,
[ACCX] MUST BE SET UP TO INDICATE WHICH ERROR
MESSAGE IS APPROPRIATE AND A BRANCH MUST BE MADE
TO "ERROR". THE STACK WILL BE RESET AND ALL
PROGRAM CONTEXT WILL BE LOST. VARIABLES
VALUES AND THE ACTUAL PROGRAM REMAIN INTACT.
ONLY THE VALUE OF [ACCX] IS IMPORTANT WHEN
THE BRANCH IS MADE TO ERROR. [ACCX] IS USED AS AN
INDEX INTO "ERRTAB" WHICH GIVES THE TWO
CHARACTER ERROR MESSAGE THAT WILL BE PRINTED ON THE
USER'S TERMINAL.
这份源代码的有趣之处在于,程序的许多方面都解释得非常清楚——无需查阅其他地方就能理解代码的功能。
关于代码质量的一些事实:
- 命名易于理解
浏览这份源代码时,您不会看到 a、b 或 x 这样的变量名——这与某些新近开发的项目不同。这些名字选得很好,并且有清晰的文档说明。

- 代码被拆分成许多小的子例程
6502 汇编语言非常底层,因此为了让代码更易理解和维护,代码应用了“分而治之”的原则:被拆分成许多小的子例程,使其更易读、更易维护。下面是源代码中定义的一个小型子例程示例:

探究完这段代码之后,我认为比尔·盖茨既是一位杰出的开发者,也是一位有天赋的商人。他最终与史蒂夫·乔布斯以及其他几位传奇人物一起,成为计算机界最具影响力的人物之一,这并不令人意外。
