1986年9月17日发布的MS-DOS版Turbo Pascal 3.02(其3.0初版发布于1985年4月),把完整的Pascal编译器和集成式代码编辑器装进了一个名叫TURBO.COM的可执行文件里,体积只有39,731字节。程序员James Hague在2011年10月30日算了一笔账:这个能独立开发商业软件的完整工具链,比2011年互联网上随手可见的单个碎片还要小——无论是90,518字节的jQuery 1.6压缩版、190,157字节的苹果官网白色iPhone 4S产品图,还是Mac OS X Lion系统里仅用于修改文件时间戳、体积却达44,016字节的touch命令行工具。更早的1983年11月,由Anders Hejlsberg编写核心的初代Turbo Pascal发售时定价仅49.95美元,包含编译器、编辑器和运行时库的TURBO.COM更是只有33,280字节。
人们看到这组对比,第一反应往往是感叹老一代程序员写代码克制、现代软件太过臃肿。但翻开20世纪80年代的基准跑分就会发现,Turbo Pascal真正改写行业的不是体积,而是它比同期微软编译器快出20到31倍的构建速度;而这种极致的快与小,其实是Anders Hejlsberg做出的精准工程取舍——甚至不惜为此牺牲一部分最终程序的运行效率。
快出31倍的秘密:用单遍内存编译换掉软盘读写与运行期极限性能
在20世纪80年代初的微机上写代码,最大的瓶颈是软盘I/O速度和狭小的内存。以当时微软的Microsoft Pascal为代表的传统编译器,普遍采用多遍(multi-pass)编译架构,把源码编译、汇编、链接拆成独立步骤,每一步都要在慢速软盘上反复读写中间文件,改一行代码往往要等上好几分钟。

Anders Hejlsberg采取了完全不同的路径。他把编辑器和单遍编译器(one-pass compiler)同时常驻内存,跳过独立的汇编与磁盘链接阶段,直接在内存里从源码生成机器码。1985年4-5月《Micro Cornucopia》杂志在主频仅4 MHz的Kaypro II(运行CP/M系统)上实测,Turbo Pascal在内存中完成埃拉托斯特尼筛法(Sieve)基准测试的编译,耗时不到1秒。
极致的轻快从不是靠克制省出来的,而是靠砍掉非核心环节换来的。
这种架构调整在对比测试中拉开了悬殊的差距,但也暴露出硬币的另一面。由于单遍编译为了迁就内存容量和速度,跳过了复杂的多遍全局代码优化,Turbo Pascal编译出的程序在部分运行效率上反而跑不过微软。
| 测试项目与环境 | Turbo Pascal | Microsoft Pascal | 核心差异与工程判断 |
|---|---|---|---|
| Sieve 编译+链接(1984) | 3.0 秒 | 62 秒 | Turbo 构建快 20.7 倍 |
| 矩阵求逆 8087版编译(1984) | 3.5 秒 | 109 秒 | Turbo 构建快 31.1 倍 |
| 三角函数 8087版编译(1984) | 2.86 秒 | 81 秒 | Turbo 构建快 28.3 倍 |
| Sieve 生成代码运行耗时(1984) | 15.0 秒 | 11.5 秒 | 微软生成的代码运行更快 |
| Sieve 生成代码运行耗时(1988) | 40.97 秒 | 31.36 秒 | 8MHz AT机4.0版测试,微软仍占优 |
1984年12月《Computer Language》与1988年6月《Dr. Dobb's Journal》的两组历史数据拼出了完整的真相(1988年测试中,两者的Fibonacci和Ackermann递归耗时接近,分别为Turbo 22.68秒、12.36秒对比微软24.34秒、12.58秒;而在无数学协处理器的1000次正弦计算中,Turbo以2.60秒快过微软的5.12秒)。Hejlsberg当时的判断非常清楚:与其让生成的程序在运行时快上3.5秒,不如帮程序员在每次修改代码后省下100秒的等待时间。
- 结论.Turbo Pascal 赢在“编辑-编译-调试”的秒级交互心流,而非最终二进制产物的极限跑分。
跨时空比大小背后的真问题:当算力暴涨万倍,秒级反馈为何消失了
把1986年的39,731字节与2011年的219,583字节雅虎首页或214,251字节C++维基百科页面放在一起,在技术社区Hacker News的114条评论里也引发过关于对比维度的争议。TURBO.COM是高度耦合16位MS-DOS硬件架构的纯机器码,且39,731字节仅是核心可执行文件而非整个发行包;而80,504字节的zlib.h头文件或jQuery是跨平台源码文本,OS X的touch命令则需要背负现代操作系统复杂的权限、安全、动态链接与多架构兼容层。直接对比字节数,确实忽略了现代软件在抽象层级与安全性上的代际成本。

- 提醒.直接拿16位DOS机器码与现代跨平台源码或复杂系统二进制文件比拼字节大小,会掩盖现代操作系统在安全隔离与硬件抽象上的必要开销。
但这组数字依然刺痛了现代开发工具链的设计者与一线工程师。今天个人电脑的内存容量和CPU主频比4 MHz的Kaypro II暴涨了数千乃至数万倍,固态硬盘的吞吐量更是远非当年的软盘可比;然而大量前端与系统软件工程师在日常开发中,依然要面对动辄几十秒甚至数分钟的项目构建与依赖打包等待。
这也是为什么从后来同样由Anders Hejlsberg操刀的Delphi、C#、TypeScript,到强调极速编译的Go语言,再到前端领域试图用原生代码重写打包器的工具链演进,都在反复验证同一个工程准则:硬件红利填不满无节制的抽象膨胀,谁能把编译反馈重新压回“1秒以内”,谁就能掌握下一代开发工具的定义权。
