程序是怎么来的?
你问了一个连很多大人都答不上来的问题:在还没有程序的时候,人们怎么编程? 更奇怪的是——今天几乎每一个程序,都是被别的程序"造"出来的。那么第一个程序,到底是谁写的?
先用三句话回答你
- 最早的程序不是"写"出来的,是接出来、拨出来的:插电线、拨开关、打孔洞。
- 后来人造出了翻译官(汇编器、编译器),机器开始帮忙把好写的字翻译成机器懂的数字——写程序一下子快了成百上千倍。
- 再后来,翻译官用它自己翻译的那种语言重写了自己,这就叫自举(bootstrapping)。往上每一层都踩着下面一层,而最底下那一层,是几百个字节的、硬碰硬敲进去的数字。
目录:一共 7 站
-
第 1 站
没有"程序"的年代
织布机上的打孔卡、插线板、一排排开关——那时候换一个程序,要重新接几天的电线。
-
第 2 站
把程序变成数据
程序住进内存以后,"引导程序"出现了:一小段先把自己读进来的小程序。这就是 boot 这个词的来历。
-
第 3 站
造一个翻译官
汇编器和编译器。1957 年,人们第一次相信机器翻译出来的代码能和人手写的一样快。
-
第 4 站 · 核心
自举:鸡生蛋的问题
编译器是程序写的,那第一个编译器谁写的?答案藏在一段 256 字节的数字里,也藏在"信任"两个字里。
-
第 5 站 · 动手
玩具 CPU 模拟器
同一段程序,三种输入方式:敲汇编、敲十六进制、拨 128 个开关。网站帮你数你按了多少下。
-
第 6 站 · 动手
插线游戏
把线从拨轮插到运算器,再从运算器插到灯,通电看结果。这就是 1945 年在 ENIAC 上“写程序”的样子。
-
第 7 站
时间线
1804 年的打孔卡,1948 年第一次跑起来的存储程序,2015 年用自己写的编译器编译自己。
-
第 8 站
术语表
机器码、汇编器、自举、引导程序、微码、可复现构建……中英对照,随时查。
怎么读这几页
- 按顺序读。 四章故事是连着的:先有"没有程序"的痛苦,才有"造翻译官"的动力,才有"自举"这个问题。
- 边读边动手。 第 4 站讲完自举,就去第 5 站亲手体验一次:先拨 128 个开关输入一个程序,再换成敲汇编语言。差别会让你记住一辈子。
- 遇到不懂的词就查术语表。 每个词都给了英文原名,将来你在英文书里遇到它,能认出来。
想一想(读之前先猜)
假设有一台机器只会做四件事:读一个数字、加一个数字、打印一个数字、跳回某一步。 你能只用这四件事,让它算出 1+2+3+…+100 吗? 先在心里试一遍,读完第 5 站再去模拟器里写出来。
关于这个网站
这是一个放在 Cloudflare 边缘网络上的小网站:静态页面由 Worker 直接送出,每页都带同一套安全响应头;
目录数据来自同目录的 site.json。没有广告、没有统计脚本、没有第三方字体——
所有文字、图形和模拟器都是这个页面自己带的,断网也能看。
正在读取 site.json …