时间线
这张表里,每一行都是“让下一行成为可能”的一步。 特别留意 1947 — 1952(翻译官出现)和 1957 之后(语言开始自己造自己)这两段。
- 机械时代 1804 雅卡尔的织布机开始读打孔卡:卡片上洞的排列就是图案。机器第一次照着“可以换掉的指令”干活。
- 机械时代 1837 巴贝奇设计“分析机”:有运算部件、有存数字的地方、还能根据结果决定下一步。
- 机械时代 1843 阿达·洛夫莱斯为分析机写下计算伯努利数的完整步骤——后来被公认是世界上第一个程序。
- 数据时代 1890 霍列瑞斯的打孔卡制表机帮美国做完了人口普查,他的公司后来成为 IBM。洞从“图案”变成了“数据”。
- 理论时代 1936 图灵提出“万能机器”:一台机器可以读另一台机器的规则表,然后扮演那台机器。程序能造程序,根就在这里。
- 电子时代 1941 德国的 Z3 用打过孔的废弃电影胶片当程序载体。
- 电子时代 1944 哈佛 Mark I 用打孔纸带输入程序。
- 电子时代 1945 ENIAC 用插线板和几千个开关编程,换题目要重新接线好几天;同年 EDVAC 报告把“指令和数据住在同一个内存里”写清楚了。
- 电子时代 1947 9 月,哈佛 Mark II 的日志上贴了一只从机器里夹出来的飞蛾:“第一次真的抓到一个 bug”。
- 翻译官诞生 1947 — 1949 Kathleen Booth 为 ARC2 机器写了最早的汇编器之一:人写短名字,机器查表翻成数字。
- 存储程序 1948 6 月 21 日,曼彻斯特“小宝宝”(Manchester Baby)第一次跑起存在内存里的程序:找出 2¹⁸ 的最大因数,答案是 131072。
- 存储程序 1949 EDSAC 用打孔纸带输入程序,成为第一台真正投入日常使用的存储程序计算机。
- 翻译官诞生 1952 Grace Hopper 的 A-0 系统让机器来“编译”程序,compiler 这个词开始流行。
- 语言时代 1957 FORTRAN 在 IBM 704 上诞生。它证明机器翻译出来的代码几乎和手写汇编一样快——编译器从此被信任。
- 语言时代 1958 LISP 出现:它的求值器可以用 LISP 自己写(元循环求值器)。“用自己描述自己”从此成为可能。
- 语言时代 1959 — 1960 COBOL 面向商业数据处理;ALGOL 60 用一份清晰的报告定义了语言语法,影响了后来几乎所有语言。
- 系统时代 1969 — 1973 Unix 诞生(汤普森与里奇),C 语言被设计出来;1973 年,Unix 内核用 C 重写——操作系统第一次由高级语言写成。
- 个人电脑 1975 Altair 8800 上市:一排开关加一排红灯,用户照着杂志表格把引导程序一位位拨进去,再从纸带读入 BASIC。
- 自举时代 1984 Ken Thompson 的图灵奖演讲《反思对信任的信任》发表:编译器可以在二进制里藏一个能自我复制的后门,源代码里看不出来。
- 自举时代 1987 GCC(GNU C 编译器)第一个版本发布,此后几十年一直用“自己编译自己、两遍对比”的方式自举。
- 自举时代 1991 Linux 内核与 Python 相继出现——它们分别用 C 写成,脚踩着 C 编译器这一级台阶。
- 自举时代 2015 Go 1.5 发布:编译器全部换成 Go 自己写,而它是用 Go 1.4(编译器还是 C 写的)编译出来的。
- 今天 2016 — bootstrappable.org 与 live-bootstrap 等项目,把链条从 256 字节的种子(hex0)一路接到 GCC 和 Guile,连内核和固件都算在内。
- 今天 现在 你按下“运行”的那一刻,脚下是七十多年的台阶:种子 → 汇编器 → 编译器 → 操作系统 → 语言 → 你的程序。
看图找规律
1945 年之前,人们用“改变机器”来编程;1945 年之后,人们用“改变内存里的数字”来编程; 1957 年之后,人们用“让机器处理机器”来编程。 你觉得下一步会是什么?(提示:今天让机器写程序,已经不是科幻了。)