今天我们继续讲《计算机思维》。了解一些历史有利于理清思路。上一讲讲算法,我们总结了一个历史教训,那就是人的思想,可以领先于技术应用。人类并不是先有了计算机才有的计算机思维,而是早就有了计算机思维,在那儿等着计算机出现。借用一个佛教术语,启蒙时代以来思想家已经“照见”了计算机的可能性。
我们看计算机产品是最容易过时的,今年买的手机明年就换代了。硬件可以被淘汰,软件可以被升级,但是,思想很难过时,数学永不过时。计算机的发展故事,是把思想实现的故事。
我们孜孜以求的,是一个“自动的”机器。
1.对自动的追求
下面这张图中是一个会下国际象棋的机器人,叫“土耳其行棋傀儡(Mechanical Turk)”。它在1770年出现在欧洲,能跟人类棋手对弈,而且水平相当高。它击败过拿破仑·波拿巴和本杰明·富兰克林这样的名人。很多人怀疑棋盘下面那个柜子里可能藏了一个人,可是打开柜子只能看到一堆齿轮。这个下棋机器人在欧美纵横征战了数十年。
……当然,那时候可没有“深蓝”和“AlphaGo”。一直到 1857 年这个秘密才被揭开,事实是……里面真的藏了一个人。只不过因为设计巧妙,看不出来而已。
但是你能看出来当时的人对“自动的机器”有多么着迷。人们迫切想要这个东西,而且人们认为有这个东西很正常。“土耳其行棋傀儡”是个魔术,但下面这个东西可不是魔术——
这是“作家机械人偶(The Writer)”,由瑞士钟表师皮埃尔·雅克·德罗在1768 年设计制造 [1]。它能自己拿笔蘸墨水,在纸上写字画画 ——
如果你见过这个会写字的机器人,再见到会下棋的机器人可能就不会感到那么不可思议了吧。其实下棋和写字还是有本质区别,写字只是“自动”,而下棋需要智能。但是在谈论智能之前,我们得知道,自动,已经是一个了不起的成就。
这个作家机器人偶是怎么写字画画的呢?你必须能把那些字和画的信息存储到机器里才行。而这是通过机器人后背的一个齿轮实现的 [2],齿轮上代表不同字母的钢片的形状决定了字母写出来什么样 ——
而那些字母是可以替换的!你换一组字母,或者换一套代表绘画笔画的齿轮,作家机器人偶就可以写出别的内容。就好像我们现在玩游戏机,换个卡带就是一个新游戏一样。
十八世纪真是个蒸汽朋克式的美好时代。如果人类一直没有发明电力,今天我们看到的就都是这样的自动机器。我们想想,像八音盒这种东西,它为什么能播放特定的乐曲?其实是一样的道理。我借用威尔逊在《生命视角》中的一个说法,这是“严格的灵活性”:操作步骤是严格固定的,但是可以接受灵活的输入,产生不同的输出。
1804 年 [3],法国人发明了一种提花织机(Jacquard loom),它能从一个长长的打孔卡上读取信息,织出特定式样的花纹。打孔卡上的孔可以让钩子穿过去,钩子控制织线。织机是同一个织机,打孔卡可以随便更换,换张卡就是不一样花纹。
提花织机的打孔卡,图片来自维基百科
打孔卡,可以说是机械化自动机器的软件。打孔卡这个技术思想在此后有广泛的应用,IBM公司最早就是靠这东西起家的……
但是,“严格的灵活性”毕竟不是真正的灵活性。打孔卡技术,距离可编程计算,还有根本性的一步。
2.第一台通用计算机
你可能不知道,第一台可编程的通用计算机,并不是电子的,而是机械的。
1820年,英国人查尔斯·巴贝奇(Charles Babbage)把“严格的灵活性”发挥到了极致,设计了一个叫做“差分机”的东西,它可以做多步骤的复杂计算。
巴贝奇的野心是用差分机计算正确的数学用表。当时公开发行的对数表、三角函数表都是人手算出来的,其中有大量的错误。巴贝奇认为人是靠不住的,这种计算应该交给机器。巴贝奇跟英国政府说,数学用表的错误会导致英国海军的计算出错,那么舰艇就出事儿,搞不好可能会沉船,现在我发明了一种机器,能做冷酷无情的计算。英国政府被说服了,真给了他一笔经费。
巴贝奇的设计包括 25000 个部件,具有强大的计算能力……但是他做了十年只完成了七分之一 ——
差分机的七分之一完成品
而这纯粹是因为硬件技术不允许。巴贝奇必须用齿轮和杠杆实现各种运算,可是这些东西没法做得特别精细,很容易这里卡壳、那里跳线,而且零件越多越容易出问题。英国政府一直看不到成果,把巴贝奇的经费停了。
巴贝奇做不出来,可是他特别能想……1830年,巴贝奇又自费发明了一个更厉害的东西,叫“分析机”。分析机,是一个可编程的通用计算机!
分析机的神来之笔在于它把操作步骤也写进了打孔卡之中,这样计算步骤就是不固定的了,就是可编程的了。不但如此,分析机还可以根据中间的计算结果,决定下一步的计算操作 —— 也就是说,它允许程序里有“If… then… ”这种条件语句,它甚至还包括循环语句!分析机有输入部分、有计算部分、有存储中间计算结果的部分,还有输出打印的部分……分析机,是真正的计算机。
巴贝奇还有一个合作者专门给分析机写程序,可以说是人类历史上第一个程序员,而且这是一个女程序员,叫埃达·洛夫莱斯(Ada Lovelace),他俩用了十余年的时间一直在研究分析机。洛夫莱斯甚至还想到,分析机不仅能用来做数值计算,还能作符号计算 —— 它不仅仅是个“计算”机,它是个能处理任何信息的机器!
……可惜的是,分析机也没做成。下面这张图是分析机的一个实验部分,来看一眼世界第一台计算机吧 ——
人的思想要是领先时代太多,是不是一个悲剧呢?巴贝奇因为发明数学表格的计算理论工具而得过英国皇家天文学会的金奖,他还是第一个提出“科学管理”的人。但是差分机和分析机被当时的人视为是巴贝奇身上的污点,什么实用成果都没拿出来,结果有一万两千个零件被溶解报废了。
1871年巴贝奇去世的时候 ,《泰晤士报》甚至还专门讽刺了他一番。
而通用计算机这种东西再次被人提出来,则是70年后的事情了。
3.现代计算机
1945年,因为电子真空管技术条件成熟和美国军方资助,世界第一台能用的通用计算机终于被做出来了,这就是著名的 ENIAC 。ENIAC 是现代计算机的鼻祖,它奠定了所谓的“冯·诺依曼架构”。而在此之前,艾伦·图灵已经提出了可编程通用计算机的完整数学理论。
我认为约翰·冯·诺依曼是人类历史上最聪明的几个人之一。他是数学家、物理学家,是博弈论的创始人,还是现代计算机架构的提出者 —— 不过冯·诺依曼自己对此是否认的,他说这个设计是一帮人讨论的结果,他只不过负责做笔记而已。
相对于巴贝奇的设计,冯·诺依曼架构的关键改进在于它有了“内存”这个概念。负责计算的CPU速度很快,而从打孔卡读取计算步骤的速度非常慢,所以现在的设计是先一次性地把打孔卡的程序信息读进来,存到内存里,然后在计算过程中让CPU直接和内存交换信息,这就能大大加快计算速度。
从提花织机的打孔卡提供了“严格的灵活性”,到巴贝奇的可编程通用计算机,到冯·诺依曼架构的CPU和内存,这是非常清晰的演变。现在我们看到了,图灵再厉害,“编程”这个思想不是他先提出的;冯·诺依曼再神,计算机系统不是他发明的。
计算机是这么一个不断改进的东西。一代一代的工程师提出各种各种巧妙的设计 ——
要在硬件上实现信息的数字化,人们发现应该用二进制。十进制很直观,但是要用硬件实现十进制,你的电子管就得用十个级别的电压代表0-9这10个数字,这不但不容易实现,而且很容易出错。二进制只需要电子管和存储点有开和关两个状态就行,这就大大增加了可靠性。
然后香农设计了逻辑门……我们专栏讲过,从硬件到软件的关键思想是分层。
然后你还要考虑CPU时钟的同步问题。如果没有“步”这个概念,各方面的计算没有协调,可能会导致两组电信号同时出现,系统就会出错。
然后你还要考虑存储信息和操作过程中可能会有各种小错误,而这就有一个自动纠错的问题……等等等等。
我就想,为什么说信息行业是个创新行业呢?因为第一,这里面的想法太密集,有太多可以改进之处;第二,改进的方向相当明确。这就是说每个参与者都知道自己能干什么……在其他领域,可没有这么好的事情。
*
从计算机思维的角度来说,这一讲的核心教训是你必须考虑硬件。永远都别忘了计算机是个机器,而机器有数学算法之外的、自己的特点和脾气。比如说,
x = 3
这个语句,在数学上的意思无非就是变量 x 的值是 3,是一个事实陈述。但是对编程来说,这不是一个陈述,而是一个动作:是把用 x 标记的那一段内存位置,赋值为 3。
机器不理解你要说的事实,机器只会按你的指令做各种动作。我们在编程的时候要 debug,要想办法控制内存,要提升计算性能,就必须考虑硬件自身的特点。
今天我们用的一切计算机,包括手机、汽车、凡是通用计算机,就都是冯·诺依曼架构。当然冯·诺依曼架构不是唯一的可能性。现在人们正在研究新的架构,比如量子计算机和神经网络计算机 —— 那些东西有自身的编程特点。
不过在我看来,巴贝奇要是看到今天的计算机,是不会感到特别惊奇的。
查尔斯·巴贝奇
参考文献
[1] http://www.sohu.com/a/253593989_776727
[2] http://news.ifeng.com/a/20170820/51695992_0.shtml
[3] 《计算机思维》说打孔卡提花织机发明于 1700 年代早期,我调研了历史,认为是作者写错了。
推荐阅读:adobe软件有哪些
(正文已结束)