X

《计算机思维》2:自动的机器

……当然,那时候可没有“深蓝”和“AlphaGo”。一直到 1857 年这个秘密才被揭开,事实是……里面真的藏了一个人。只不过因为设计巧妙,看不出来而已。

但是你能看出来当时的人对“自动的机器”有多么着迷。人们迫切想要这个东西,而且人们认为有这个东西很正常。“土耳其行棋傀儡”是个魔术,但下面这个东西可不是魔术——

提花织机的打孔卡,图片来自维基百科

打孔卡,可以说是机械化自动机器的软件。打孔卡这个技术思想在此后有广泛的应用,IBM公司最早就是靠这东西起家的……

但是,“严格的灵活性”毕竟不是真正的灵活性。打孔卡技术,距离可编程计算,还有根本性的一步。

2.第一台通用计算机

你可能不知道,第一台可编程的通用计算机,并不是电子的,而是机械的。

1820年,英国人查尔斯·巴贝奇(Charles Babbage)把“严格的灵活性”发挥到了极致,设计了一个叫做“差分机”的东西,它可以做多步骤的复杂计算。

巴贝奇的野心是用差分机计算正确的数学用表。当时公开发行的对数表、三角函数表都是人手算出来的,其中有大量的错误。巴贝奇认为人是靠不住的,这种计算应该交给机器。巴贝奇跟英国政府说,数学用表的错误会导致英国海军的计算出错,那么舰艇就出事儿,搞不好可能会沉船,现在我发明了一种机器,能做冷酷无情的计算。英国政府被说服了,真给了他一笔经费。

巴贝奇的设计包括 25000 个部件,具有强大的计算能力……但是他做了十年只完成了七分之一 ——

人的思想要是领先时代太多,是不是一个悲剧呢?巴贝奇因为发明数学表格的计算理论工具而得过英国皇家天文学会的金奖,他还是第一个提出“科学管理”的人。但是差分机和分析机被当时的人视为是巴贝奇身上的污点,什么实用成果都没拿出来,结果有一万两千个零件被溶解报废了。

1871年巴贝奇去世的时候 ,《泰晤士报》甚至还专门讽刺了他一番。

而通用计算机这种东西再次被人提出来,则是70年后的事情了。

3.现代计算机

1945年,因为电子真空管技术条件成熟和美国军方资助,世界第一台能用的通用计算机终于被做出来了,这就是著名的 ENIAC 。ENIAC 是现代计算机的鼻祖,它奠定了所谓的“冯·诺依曼架构”。而在此之前,艾伦·图灵已经提出了可编程通用计算机的完整数学理论。

我认为约翰·冯·诺依曼是人类历史上最聪明的几个人之一。他是数学家、物理学家,是博弈论的创始人,还是现代计算机架构的提出者 —— 不过冯·诺依曼自己对此是否认的,他说这个设计是一帮人讨论的结果,他只不过负责做笔记而已。

相对于巴贝奇的设计,冯·诺依曼架构的关键改进在于它有了“内存”这个概念。负责计算的CPU速度很快,而从打孔卡读取计算步骤的速度非常慢,所以现在的设计是先一次性地把打孔卡的程序信息读进来,存到内存里,然后在计算过程中让CPU直接和内存交换信息,这就能大大加快计算速度。

从提花织机的打孔卡提供了“严格的灵活性”,到巴贝奇的可编程通用计算机,到冯·诺依曼架构的CPU和内存,这是非常清晰的演变。现在我们看到了,图灵再厉害,“编程”这个思想不是他先提出的;冯·诺依曼再神,计算机系统不是他发明的。

计算机是这么一个不断改进的东西。一代一代的工程师提出各种各种巧妙的设计 ——

要在硬件上实现信息的数字化,人们发现应该用二进制。十进制很直观,但是要用硬件实现十进制,你的电子管就得用十个级别的电压代表0-9这10个数字,这不但不容易实现,而且很容易出错。二进制只需要电子管和存储点有开和关两个状态就行,这就大大增加了可靠性。

然后香农设计了逻辑门……我们专栏讲过,从硬件到软件的关键思想是分层。

然后你还要考虑CPU时钟的同步问题。如果没有“步”这个概念,各方面的计算没有协调,可能会导致两组电信号同时出现,系统就会出错。

然后你还要考虑存储信息和操作过程中可能会有各种小错误,而这就有一个自动纠错的问题……等等等等。

我就想,为什么说信息行业是个创新行业呢?因为第一,这里面的想法太密集,有太多可以改进之处;第二,改进的方向相当明确。这就是说每个参与者都知道自己能干什么……在其他领域,可没有这么好的事情。

从计算机思维的角度来说,这一讲的核心教训是你必须考虑硬件。永远都别忘了计算机是个机器,而机器有数学算法之外的、自己的特点和脾气。比如说,

x = 3

这个语句,在数学上的意思无非就是变量 x 的值是 3,是一个事实陈述。但是对编程来说,这不是一个陈述,而是一个动作:是把用 x 标记的那一段内存位置,赋值为 3。

机器不理解你要说的事实,机器只会按你的指令做各种动作。我们在编程的时候要 debug,要想办法控制内存,要提升计算性能,就必须考虑硬件自身的特点。

今天我们用的一切计算机,包括手机、汽车、凡是通用计算机,就都是冯·诺依曼架构。当然冯·诺依曼架构不是唯一的可能性。现在人们正在研究新的架构,比如量子计算机和神经网络计算机 —— 那些东西有自身的编程特点。

不过在我看来,巴贝奇要是看到今天的计算机,是不会感到特别惊奇的。