为你的计算机“编程”
Alan Kay 著
原文所有权利归原作者(Alan Kay)所有。本译文在获得原作者同意后发布,译文版权声明见结尾。
All rights of the original work belong to the original author(s) (Alan Kay). This translation work is published with the approval of the original author(s) and includes its own copyright disclaimer at the end.

1980 年代的计算机将会易用而廉价,却足够强大,让我们能实现未曾设想过的事情。
14 岁的中学女孩 Beth 正懒洋洋地在树荫下的草丛中享受阳光。她膝上端着一个稀奇的设备,目光盯着上面一个电视一样的显示屏幕里动来动去的照片。她妈妈在房子里喊她:“Beth,该做作业啦。”
“我正做着呢,妈。”Beth回答。
她开始敲击在那块显示屏下面打字机一样的键盘。屏幕上显示出了一段她昨天开始创作的星际旅行的故事,还有一张未完的插画和一些文献引用。
她注意到一句别扭的话,用一根铅笔一样的电子画笔点了下那个句子,键入了一个改进版本,那个句子就在她眼前变成了她新写的措辞。然后她用一个画图工具为她的插画上色、又画了些直线,补完了那幅画。当她犯错的时候,就输入一些指令来撤销她的操作,然后再重新开始。
Beth 的另一幅插画是一个正在和空间站对接的飞船。她决定要做一个动画,为此她开始钻研,如果她假想的火箭只能打开和关闭它的推进器,她该如何控制宇宙飞船的姿态。很快,她的屏幕上就有了一个随着她控制而移动的飞船。看着还差那么一点,但她相信自己再想想就能搞对了。
当 Beth 对自己的作品感到满意后,她按了个按键将它保存好,然后就开始了一些更加私人的探索。乐趣所驱,她已经花了不少时间创作一段精致的赛马动画。现在是时候为这个游戏加入赌马的环节了。
Beth 使用的设备是她的个人计算机。尽管这个少女生活在假想的未来,但在位于加州的施乐公司帕罗奥多研究中心,有数百名和她一样的学生已经对个人计算机有了相似的体验。他们参与的是一个 1971 年开始的为期 10 年的项目,项目目标是开发和测试“属于 1980 年代的个人计算机”。到了 1978 年年中,约 100 名成年人和 300 名以上的 6 到 15 岁的青少年学会了使用这些计算机来编写和绘制报告、绘画、编曲,以及制作动画来为自己的想象赋予生命。
他们每个人都学会了如何通过计算机指令,或者称为“编程”,来创造新的工具和效果。比如,12 岁的 Susan 设计了一个画图工具,来帮助她创造和修改屏幕上的几何图形和纹理效果。Dennis,一个 11 岁的孩子,制作了自己的太空战争游戏,游戏里是他亲自设计的太空战队在屏幕上战斗。12 岁的 Joan 改写了一个由专业动画师制作的工具,用它制作了一场生动的赛马动画。

文档排版
你可以用个人计算机编写文章、绘制插图。举个例子,你可以编写一篇宇宙飞船的故事,将它保存放好后,再键入指令让文章的任意片段显示出来供你检阅。如果你发现了拼写错误,你可以用名为“鼠标”的控制设备来修正它。当你用鼠标移动电子指针将它移动错误处,那里的屏幕背景就会变暗。输入正确的版本后,按下鼠标的一个按钮,之前的错误就原地修改完成。如果想画一张插图,你可以按下鼠标的另一个按钮,一个“绘图板”会出现在眼前。用指针选定“画刷”工具后,你可以将它移到要上色的区域里,然后按住鼠标按钮,移动鼠标来给你想要的地方上色。

我对个人计算机的兴趣源于我从 1960 年代研究生时期就有的梦想。在几位很有远见的教授的启发下,我意识到计算机不只是体型巨大、喀啦作响、耗资数百万美元的算术机器,不应该只有熟练经验的专家靠不断输入打孔卡片才能操作。它们有潜力与普通人沟通,成为美妙的工具。而且就在当时,那些房间大小的巨型设备正在被远远更小且更快的型号替代。几年之内,我们就可以把与 1960 年代数百万美元的计算机相匹敌的计算能力—由单位时间内它可以处理的信息量表示—塞进一个与平常活页笔记本同样小的容器里。现有的技术使得我们可以制造出口袋计算器和电子表等小型设备,也将能让我们制造出个人计算机。
这意味着,很快我们就将人手一台个人计算机。但,我们怎样才能应用它呢?在这台小而强大的计算机里,不能仅仅只有电路、存储和内存等实体的“硬件”部分。我们还需要与这台机器沟通并能控制它的“软件”机制。而当下的计算机软件系统,哪怕委婉地说,也是比较笨重的。只有专家才能勉强鞭策它们运行。显然,如果我们不对软件进行大幅改进,没有可能真正实现“属于 1980 年代的个人计算机”。




图片:1946 年的古董计算机 ENIAC(图1)已经被越来越小而强大的机器所取代,比如用于文档图片排版的 PDP 11/45 微机(图2)和用于为个人计算机开发程序的 Alto 微机(图3)。很快我们就能将与它们同等的算力封装进笔记本大小的 Dynabook 中(图4)。
我所属的公司于 1971 年开立了长期研究项目来解决软件系统问题,引来一批个人计算机领域的有志之士。在我们的设想中,1980 年代的个人计算机是一个笔记本大小的方形设备,正面是一块类似液晶手表的平面反光屏,表面能感应手指或者电子画笔的点触。它的内部有着可以每秒执行数百万条指令的计算电路,也有着足以保存数月项目资料的存储容量。它应当做到完整的自包含,但同时,它还可以接入高清音响来创作音乐,连接其他计算机进行团队协作,或者接入其他信息源,比如未来的电子图书馆。我们将这台想象中的计算机称为“Dynabook”。
身处 70 年代的我们要开发用于 80 年代的软件,只能先用旧时代的硬件想办法造出一台计算机。由于计算机微型化的进程才刚刚开始,为了满足性能需求,我们造了一台桌子大小的计算机。那时扁平的反光显示器尚不存在,只好给它安装一个高清电视屏幕作为替代。除了打字机键盘之外,我们还配置了一个可以挪动的设备,称它“鼠标”,用它来控制屏幕上的电子指针,通过按上面的按钮执行不同指令。
在我们开展软件研究的同时,最初的微型计算机,或者叫微处理器,开始出现在市场上。工程师们正设计集成电路,让单个硅片上能包含数以千计的晶体管。在很小的空间内,把几个这样的芯片连接在一起,它们就能执行一个电子计算机所需的所有指令。硬件的发展导致了计算器、控制器和电子游戏市场的爆发增长。这说明我们对计算机未来发展的预测是正确的,很受鼓舞。这也意味着越来越多的人会对个人计算领域产生兴趣。
第一代微处理器的算力不足,还要数次换代才能支持 1980 年代的个人计算机。到了 1978 年,比上一代算力强大 10 倍左右的第二代微处理器问世了。按照这个趋势,进入 80 年代后,下一代微处理器就有足够的算力来支持我们的个人计算机。把数个这样的微处理器封装在一起,我们就有了 “Dynabook” 所需的每秒执行数千万指令的算力。
将指令组合起来,我们就得到一段描述某个执行过程的“程序”,它们可以在编写之后被反复调用和执行。电影剧本、足球比赛、乐谱,都是由人编写、由人执行的程序。在最近几十年才出现可以储存和调用程序的机器,尽管和人类能处理的程序相比,这些程序远要简单很多。
人们编程大多会写一串串顺序执行的指令,描述起来就像菜谱里各种原料的处理方案。比如,为了制作饼干面糊,你会按照菜谱说的,先把面粉和水搅拌在一起。稠了加水,稀了加面。如果面糊正正好,就停下来,任务完成。
如果有很多事物需要协调处理,比如像在一场宴会的安排中,对应的处理方案就会变得非常复杂。一个宴会“程序员”需要负责安排的事情有:预订大厅,雇佣厨师和服务员、安排摆桌、计划菜单、邀请宾客。由于很多活动会同时进行,他在计划时需要统筹协调。在计算机编程领域,这样复杂的事情往往需要经验丰富的程序员才能完成。
好消息是,除了把编程类比为按菜谱做菜之外,还有很多其它思维方式,能让普通程序员简练地描述各种系统。有些思想从 1960 年代早期发展至今,我们以其中一个模型为基础,为“Dynabook”设计了一套编程体系,称为 Smalltalk。用 Smalltalk 编写的程序不像是在操作菜谱里一个个惰性的原料,而是像舞台剧本或者足球比赛那样,协调安排独立自主的参与者们。
Smalltalk 的世界像一个计算机里的剧团。我们在电视屏幕上看到演出,从喇叭里听到声音。但是不仅如此,我们还能与这个微缩的宇宙交流并操纵它,比如通过键盘输入文字、通过琴键输入声音、通过鼠标可以选择和修改电视屏幕上的图片。初学 Smalltalk 时,人们会先导演一部已经完成的剧本。接下来,他们可以在此基础上增加自己的改编。最终他们可以自主编写和创作自己的剧本,而这时候他们就真的在编程了。
Smalltalk 剧本的创作首先需要作者—程序员—想象各个场景,然后为演员们写下剧本。然后就是彩排,消除程序里的 Bug。最后加上戏服,就可以开始表演了。
显示屏就是剧场。剧本里是编程者想做的事情。演出就是剧本实际表演出的效果。比如,Beth 的赛马剧场可以用同样的剧本和演员呈现出很多场不同的比赛。
Smalltalk 程序的特别之处在于每个演员都可以派生出很多后代,或者说是继承了它们父母特性的新演员。通过编程来修改这些特性,进而又能产生出更多的新演员。Smalltalk 里的演员们非常万能。数字 3,箭头形状,汽车,乐器,宇宙飞船,都是演员。 我们学习 Smalltalk 时,首先学习输入一些可以与其中一位演员交流的指令。举个例子,让我们来和一个打扮成箭头的演员沟通。我们通过键盘,在屏幕上唤出这个箭头。它显现在屏幕上,边上是一列它会遵守的命令,这是它的节目单。它包括了诸如“抹除”,“显示”,“转向”,“前进”,“运行”,“脚本”等词汇,当我们把鼠标放在上面并按下鼠标时,它就会执行某个命令。在节目单的右边是一个“解释”栏,用来让计算机详细地汇报它会如何执行这些命令。
比如,“抹除”命令让这个箭头的图片消失,“显示”会让它又重新出现。其它诸如“转向”和“增大”的命令,需要计算机和人确认额外信息才能完成。比如,当鼠标指向“转向”命令时,屏幕上会出现一个询问窗口,显示一串询问要把图片旋转多少度的文字。这时人必须要输入相应的数值。再比如,“前进”需要人回答图片应该移动多远。
当我们选中“脚本”命令时,会显示出一个空白的窗口;计算机这时在等待更具体的指令。选中“脚本”后,我们用键盘输入这个演员可以运行的指令的简单组合,比如“前进 10”和“旋转 10”。然后当我们把鼠标指向“运行”并点击鼠标时,脚本会一遍又一遍地执行。箭头向前走了 10 格,然后旋转 10 度,然后再重复这些动作。
选中 “停止“命令后,演员会停止执行这个脚本。这之后我们可以做很多事情。我们可以修改脚本,比如,把“前进 10”改成“前进 15”。或者我们可以把这个脚本添加为一个全新的命令。比如,我们刚才写的程序是让这个箭头转圈。通过键盘我们可以把这个新的命令—“转圈”—加到这个箭头的节目单里。
编程一个“演员”
要控制一个演员,你首先需要通过键盘或者鼠标调出这个演员和他所能接受的命令列表。通过鼠标将电子指针移到屏幕上的指令处,就能选中这个指令。指令后面的屏幕会变暗,这是电脑在通过改变文字的显示,来说明它知晓了你要执行这个指令的意图。
我们现在能向剧场里的某个演员发送编程好的指令了,但这只是一个开始。接下来,使用者们要学习如何控制多个演员和剧本。这样之后用户就可以自己编程,编写新脚本来教会演员们新的戏码。他们能通过调出一个画板,用鼠标选择线条和色调并绘制插画,来为演员们更换装扮。他们可以创作动画—教会演员一边动一边在遇到各种不同物件时变换大小和形状。如果要创作音乐,可以让演员们改而遵循乐谱形式的剧本,以乐器的声音作为戏服。用户还可以模拟现实世界中的系统,比如吊桥、电子电路,或者游乐园里的过山车。
一个特别能寓教于乐的例子是动画游戏的创作。只要花几分钟,我们就可以编写出一个游戏,让两位演员在屏幕上你追我赶。我们可以写一个脚本,将鼠标的横坐标与“转向”命令关联起来,将“前进”命令与鼠标的纵坐标关联起来。点中“运行”命令后,通过前后左右移动鼠标,可以像开车一样操作一位演员。接下来选中命令列表中的“克隆”命令来制作一个使用同样脚本的演员。这个新演员的脚本可以改为用另一个鼠标来操纵。这样就可以让两个人在屏幕上操纵两个独立的演员。用 Smalltalk 的画图功能,把每个演员的服装换为不同的车子,就做好了最简单的游戏版本。
编程一个新的游戏
你可以通过编程,让个人计算机上的一个演员随鼠标的控制移动。然后使用“克隆”命令生产另一个和他能力一模一样的演员。插上第二个鼠标,把第二个演员的控制权交给它,就能让两个人在计算机上玩“你追我赶”。
与从游戏公司那里拿到一个封闭的游戏相比,亲身编程游戏的最大不同,在于参与者可以随时把新点子加到自己的程序中。比如,如何处理障碍物和碰撞?要不要加上赛道?可编程的游戏在这一点上不但更加有趣,还能帮助编程者学习为复杂情景建模的方法。
这么多的事情,“Dynabook”这么小的设备是如何做到的呢?如何布置计算机内的电子电路,使得你可以用键盘和鼠标控制屏幕上的图片呢?为了能知道答案,我们必须首先意识到计算机只能以符号的形式理解和处理各种模式和结构,这些符号用于发送者(编程者)与接受者(程序)之间的沟通。一个概念可能被多种符号表达,比如,一个用来控制开口的设备在英语中称为“door”,法语中称为“porte”,德语中称”Tür”。但对于任何不懂得这个词所属的语言,或者说符号系统的人来说,这些词毫无意义。
为了表示符号,有一种最简化的方法。德国哲学家戈特弗里德·莱布尼茨(Gottfried Wilhelm Leibniz)在 18 世纪发现,只要两个不同标记的组合,就能表达所有可认知的符号。莱布尼茨使用“神”与“空”,摩尔斯电码使用“点”和“横”,在计算机术语里它们是“开”和“关”,或者有时是“0”和“1”。它们是我们所熟知的计算机术语“比特”。
莱布尼茨发现,两个标记的不同模式可以组成任意数量的符号。模式里的比特数量越多,就可以形成越多的符号。比如,2 位的模式可以形成 4 个不同的符号,3 位的模式可以形成 8 个符号,20 位的符号可以形成一百多万个符号。
计算机可以同时保持数百万的比特,让编程系统能表达编程者理解的任何事情。我们用可保存的比特数量和处理它们的速度,来判定一台计算机的计算能力。例如,Smalltalk 系统拥有约两千一百万比特的存储容量。其中的一百万比特速度较快,用于显示图像和保存草稿,剩下的比特用于长期存储。
在屏幕呈现图片是用比特来表达信息的一个最简单的例子。主存的一半,约五十万比特,用于此用途。在显示程序看来,屏幕是 600 一行、共 800 行的比特组合。当电视显像管的电子束扫描电子管的表面时,显示程序在这段内存里按行选出比特,一行行地最终画出一张图片。每当 Smalltalk 的图形程序修改显存里的比特时,图片都会改变。然后下次电子束扫过修改过的区域时,屏幕会显示一张新的图片。这很像那些建筑上或者高速边用来显示时间、天气和广告的告示板的高清版本。

这种比特操作是计算机编程的多层复杂结构的最底层。在设计、建造和使用一个剧院的过程中也有类似的分层。建造师设计整栋建筑,他负责结构的完整性和美感。剧院架构师对于建筑的设计则更关注艺术创作的需求。他们一起探索如何设计剧院内部—比如舞台,灯光和观众席。在计算机领域中,建筑设计师对应首席硬件设计师,剧院架构师对应首席软件设计师。
剧院管理人负责管理舞台管理员、场景设计师、服装师、灯光和维护人员,他对应计算机里的操作和编程系统。Smalltalk 就是剧院负责人。
为了创作一部新剧,需要创作团队里的剧作家、编曲家、制作人、导演,以及负责音乐、舞台、服装、灯光、编舞和道具的人员。在计算机领域,创作团队是一个或多个程序员,他们构建了用于处理文档和图像、制作动画、创作音乐、信息获取,还有仿真的工作环境。
最后,舞台上的表演者们—演员和音乐家们—集合起来排练。这些对应 Smalltalk 中的演员。
每个重要的技术创新都改变了人们的生活。计算机化的急流对我们这些 1978 年的人会有什么影响呢?毋庸置疑,我们已经身处改变之中。下个十年的个人计算机会带来更大的变化。
我认为接下来的冲击会类似于世界在 15 世纪活字印刷发明后的发展,但所需的时间远比它短。在书本普及后,读写的能力这一概念浮现出来,不能读书的人被称为“文盲”。文盲很快被那些能读写的人超越。私塾和后来的学校的主要作用,就是教授读写能力。
为了迎接新技术的挑战,很多学校开设了计算机“读写”课程。另外,一些年轻人会到包含我们在内的研究机构来参观,了解计算机可以做的事情。他们在使用计算机的过程中学习和享受乐趣。随着更多学校把计算机加入课表,计算机“读写”能力会越来越普及。只要人类想理解自己的技术,就必须这样做。
今天的学生还没有从计算机的幼儿园毕业,在计算机上主要还是玩电子游戏。游戏类型的未来应用既激动人心,又让人担忧。它们包含着艺术创作上前所未有的可能性,但也可能成为比商业电视节目更加钝化头脑的产品。
个人计算的下一步发展很可能是自制卡通动画。现在我们已经可以用类似 Smalltalk 的技术,来表现和演绎程式化的彩色图片。接下来很快就会出现最初的交互式戏剧系统。想象下,你自己可以出演一部全彩 007 电影。你可以是主角、反派,或者次要角色,你在表演中的选择能主导剧情。你的家人和朋友也都能担角,每个人的选择合力控制故事的走向。
这为艺术创作带来了无穷的可能。想象下不仅仅是 007,你还能改编莎翁剧作。再或者通过你的个人计算机和音乐合成器,你能创作自己的奏鸣曲,或者风靡未来的摇滚热曲。当你的兴趣转向艺术,你又能把计算机变为画板,尝试写实风格的日落景色,或者更加实验性的抽象作品。
有了你的个人计算机,你可以做你能想象到的任何事情。
译文作者:王文鑫,bnkr
转载请按此下述授权要求,注明译文作者、使用同一授权,并注明原作者和引用出处。
感谢 Alan Kay 先生和 Yoshiki Ohshima 先生的亲切支持!
Thanks to Mr. Alan Kay and Mr. Yoshiki Ohshima for your kind support!
在保证原作者所有权益的情况下,本译文使用 Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International 授权,详情见 https://creativecommons.org/licenses/by-nc-sa/4.0/deed.en。超出此授权范围之外的使用需获得“计算机史料随译”项目的许可,详情见 https://random-cs-hans.github.io。
On the precondition of keeping all rights of the original authors, this translation work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike License (International/4.0), see https://creativecommons.org/licenses/by-nc-sa/4.0/deed.en for details. Permissions beyond the scope of this license are administered by the “RandomCSHans” Project,see https://random-cs-hans.github.io.