专题 · 12 环 · 1 环的主人不在馆里

计算机

终点:你手边任何一台机器里的那颗处理器

「照着步骤做」这件事本身被一点点看清楚:先有了名字,再有了记数法,再被写成代数,最后被问「有没有做不到的事」——答案是有,而正是这个答案给出了机器的设计图。

缩略轴按先后排列,间距不表示年数;实心=馆里有他,空心=还没有。

  1. 约820

    把解题写成一串照着做就行的步骤算法

    花拉子米约780–约850《algebra 与 algorithm》

    他那本讲印度数字的书,十二世纪的拉丁译本开头一句是「花拉子米如是说」,Algoritmi dixit。译名在欧洲变成了这类步骤的通称,「算法」这个词就是这么来的。他本人没有定义过算法,是他的书名替他做了这件事。

  2. 1617

    把数拆成 1、2、4、8,乘法只剩挪子与并子算法

    纳皮尔1550–1617《棋盘上只有 1、2、4、8》

    棋盘上只有两条规矩:竖走一格值翻倍,斜走值不变。两个因数摆在两边,交点落子,斜着滑到边上,两子并一子——一套不用背九九表的乘法,每一步都机械得可以交给别人照做。他没有 0 和 1 这两个符号,只有字母与棋子;可数的二进制拆法、除以二取余的换法、移位相加的乘法,都已经在这一卷里。

  3. 1703

    只用 0 和 1 记数语言

    莱布尼茨1646–1716《只用 0 和 1》

    二进制不是他先想到的,但他是第一个把它写成一篇正式论文、并且认真对待它的人。他关心的其实是别的:他觉得 0 与 1 能造出万物这件事有神学意味。要再等两百三十四年,才有人发现二进制真正的用处在开关上。

  4. 1847

    逻辑可以写成代数结构

    布尔1815–1864《x 乘 x 还是 x》

    他的 x 从头到尾是一类东西,不是真假值:乘是取交,1 减是取补。x·x = x 这条在数的代数里只有 0 和 1 满足的式子,在他这里对每一类都成立——这正是后来能落到开关上的那一条。

  5. 1861

    加法与乘法只从「下一个数」递归定义语言

    格拉斯曼1809–1877《加法是从「下一个」递归出来的》

    他与弟弟合写的中学课本里,a + b 定义为使 a + (b + e) = a + b + e 成立的那一项,乘法再由加法递归出来,交换律、结合律一条条用归纳法证。皮亚诺 1889 年写明他的证明用的就是这本书;戴德金 1888 年补证了这种定义确实定义得出东西。哥德尔 1931 年那篇里拿来编码的递归函数、今天程序里的递归,写法都是这个样子:先说第一个,再说「下一个」怎么由这一个得来。

  6. 1890

    一整篇证明写成符号,每一步只按形式变形语言

    皮亚诺1858–1932《用符号写成的论文,与没有词尾的拉丁语》

    他 1890 年那篇存在定理,四十七页全写成逻辑式,开头交代:用日常语言把它完整展开会复杂得过了头。ε、Λ、反写的 C 这些记号,连同 1889 年他给自然数写下的公理,被罗素与怀特海搬进了《数学原理》;哥德尔 1931 年那个证不出来的句子,就是在「皮亚诺公理加上《数学原理》的逻辑」这个系统里造的。证明一旦成了按规则变形的符号串,就轮到机器来检查它、执行它。

  7. 1931

    任何一套够强的公理系统,都有它证不出来的真话边界

    哥德尔1906–1978《这句话证不出来》

    他的办法是给每一个公式编一个号,让系统能谈论自己。这一步——把程序当数据编码——后来被图灵直接搬进了机器的设计里。

  8. 1936

    一条纸带、一张规则表,就够了语言

    图灵1912–1954《机器的描述,也是数据》

    真正改变世界的不是那台机器,是下一页:既然每台机器都能写成一张表,那张表也能当作另一台机器的输入——一台机器就能模拟全部机器。通用机的概念在这里,而不在任何一台实物上。

  9. 1937

    一个开关网络,就是一个布尔表达式结构

    布尔1815–1864《一个开关网络,就是一个布尔表达式》

    香农二十一岁的硕士论文把布尔代数按在继电器电路上:串联是与,并联是或,电路的化简成了式子的化简。九十年前写下的一套符号,忽然成了造电话交换机的工具——「结构」型数学最干净的一例。

  10. 1945

    程序与数据住在同一块存储器里语言

    冯·诺依曼1903–1957《一条指令也是一个数,所以它改得动》

    《EDVAC 报告初稿》把机器分成运算、控制、存储、输入、输出五部分,并且让指令和数据用同一种方式存放。今天所有通用处理器仍是这个样子。这份报告署名只有他一个人,而莫奇利与埃克特的贡献被这件事盖住了,是计算机史上争议最久的一桩公案。

  11. 1965

    一个对象自己有多少信息边界

    柯尔莫哥洛夫1903–1987《这一个串有多少信息》

    不问这串数从哪个概率分布里来,只问能把它印出来的最短程序有多长;换一种编程方法只差一个与对象无关的常数。代价是这个长度本身算不出来——他在同一篇里写明,这个函数即便处处有限也不是一般递归的,理由与停机问题同源。今天「这段数据还能压多小」「这串密钥够不够乱」「这个模型是不是只是把训练集背了下来」,问的都是它。

  12. 1971

    有些问题算得出,却算不快边界

    库克1939–不在馆里

    图灵划的是「能不能算」,这一条划的是「算得动算不动」。库克证明布尔可满足性是 NP 里最难的一类;莱文在苏联独立得到同样的结论。P 是不是等于 NP 至今没有答案,而现代密码学的安全性正建立在「不等于」这个假设上。