阅读更多
引用
Alan Kay授权《程序员》整理翻译并本文。译/王江平
本文为《程序员》原创文章,未经允许不得转载,更多精彩文章请订阅《程序员》

Alan Kay是当今世界计算机领域最重要的人物之一,他因面向对象编程方面的贡献和设计Smalltalk语言获得了2003年图灵奖。同时,他也是个人计算机(PC),图形用户界面(GUI)的先驱。今天我们使用的C/C++或Java语言都或多或少从Smalltalk汲取过养分。

他所研究的领域远超计算机,总能从更高层次看问题,他的想法又总是很宏大,也许你一开始并不理解他在说什么,但回头看总会有新收获,他的每篇文章和每个演讲都令人深受启发。

他讲话风趣且深刻,似乎随口说的一句话就能放进名言库里,你肯定听过这句话:“预测未来的最好方法就是创造未来——The best way to predict future is to invent it”。

理解“对象”的历程
关于“对象”(object)的理解,我经历了几个不同阶段。

第一阶段是50年前,在ARPA研究生院的开始几周,我的几种专业背景,数学、分子生物学、系统和程序设计等,与Sketchpad、Simula和ARPAnet这些东西产生了碰撞。这使我观察到,既然一台计算机可以分解成多台虚拟计算机,相互间持续通信,于是你便可以:
  • 完全保留表达式的威力;
  • 随时为任何可建模的东西建模;
  • 无限地伸缩,而不限于已有的分解计算机的方式。
我喜欢这些。分时运行的“进程”已是这种虚拟机的体现,但因为开销太大还缺少实际的通用性(那就寻找方法消除这些开销……)。

尽管可以为任何事物(包括数据结构)建模,对我来说这还远远不够。真正了不起的是为极端的可伸缩性需求提供松耦合的封装和消息机制(以一种类似生物和生态系统的方式)。

第二个阶段包括在“Lisp世界”中掺入Lisp本身,McCarthy关于机器人和时态逻辑的思想,在ARPA(尤其是在MIT)进行的AI工作,以及Carl Hewitt的PLANNER语言。有一种思想:对象可以像服务器一样,且可以是面向目标的,使用PLANNER类型的目标作为接口语言。

第三阶段是Parc的一系列Smalltalks,试图在Parc的Alto系统(128K内存,一半用于显示设备)所能实现的和未来必然需要的功能之间寻找一种实用的平衡。这项工作是与Dan Ingalls和组里其他一些天才的同事合作完成的。理想主义的小宇宙一直让我不爽,但从实用角度结果不错。

第四阶段(也是在Parc)是重新深入探讨时态逻辑和“世界线”(world-line)思想(后面细说)。

第五阶段是再次严肃地思考可伸缩性并重新审视“协作语言”(比如Gelernter的Linda),将它们看作以通用的发布和描述方式进行描述匹配,从而实现松耦合的一种方法。我仍然喜欢这种思想,并希望看它发展到对象可以真正“协商意义”的程度。

McCarthy的时态逻辑:“时间中的真正函数”
我对这一切的思考方式大部分都可追溯到上世纪50年代的John McCarthy。John是一位出色的数学家和逻辑学家。他希望自己能做严密一致的逻辑推理——同时希望他的程序和机器人也能做到。机器人是个关键:因为他想让机器人有时在费城,有时在纽约。按常规逻辑这会有问题,然而John针对“事实”成立时能表现“时帧”(time frame)的所有事实额外添加了一个参数,从而修正了这一问题。这就创建了一种简单的时态逻辑,将“事实集合”显现为世界线的层层堆栈。

这很容易泛化为“变量”、“数据”、“对象”……的世界线。从个体角度来看,值的“历史”替换了“值”,从系统角度来看,整个系统被表示为每当系统处于两次计算之间时它所处的稳定状态。Simula后来采用了这一思想的一个弱化但却实用的版本。

应当提一下Christopher Strachey(编者注:1916年-1965年,生于英国英格兰伦敦汉普斯敦,计算机科学家。他是指称语义最早的提出者之一,也是编程语言设计的先驱,发展了编程语言CPL)——Lisp和McCarthy的伟大粉丝,他认识到通过始终使用(来自前一时帧的)旧值来产生新值并安装在新的时帧中,很多种编程模型都可以统一起来且更加安全。认识到这一点是因为他首先观察到Lisp中“尾递归”是多么干净利落,然后又看到这样的尾递归写成某种循环的形式更易理解:循环中包含类似赋值的语句,其中右边从时间t中取值,被赋值的变量则存在于时间t+1中(且这样的赋值只允许一次)。这就统一了函数式编程和同时模拟时间和状态的“类命令式”编程。

也要提一下Ashcroft和Wadge设计的Lucid语言(编者注:一种数据流语言,用于非冯模型编程),该语言扩展了Strachey的许多思想。

另外,数据库中的“原子事务”也值得一看,思想很类似,只是粒度更粗——从来没有破坏什么,也不用竞争条件,新的版本以一种非破坏性的方式创建出来。其中有了版本的历史。

“时间是个好主意”,这是关键的一点——我们想要它,想用安全、合理的方式处理它——而这些方式中绝大部分(如果不是全部的话)都可以是处于稳定世界线状态序列之间的纯函数式事务。

“刚刚计算来的稳定状态”非常有用。它再也不会改变——因此它代表了系统模拟中的一个“版本”——且可以在产生下一个稳定状态的函数式转换中充当源数值。它还可以充当数据源,为那一刻的世界创建视觉效果。历史信息则可用于调试、撤消、回滚等需要。

在这种模型中,“稳定状态之间时间并不存在”:“时钟”只在新状态完成时走表。就程序而言,CPU本身并不充当时钟。对于具有内在、干净时间模型的确定性关系,这种思想带来一种非常简易的处理方式。

出于很多理由(但没有一个好的)这种维持安全的方法在上世纪60年代输给了在命令式编程中使用竞争条件,然后再通过可怕的、可能导致死锁的信号量来保护它们的做法。

某些时候,任何了解Lisp且对对象间的消息传递感兴趣的人都必然“运用”并注意到一种对象(一个lambda的“东西”,可以是一个闭包)可以捆绑到一组参数上(看起来有点像消息)。如果一个人知道Lisp 1.5是如何基于新式的延迟绑定参数求值来实现的,理解还会更深入。这里指的是FEXPR,而不是EXPR——未求值的表达式可作为参数传递,之后再求值。这使得不太优雅的“特殊形式”四处充斥,它们本来可以写成漂亮的惰式函数。

使用前述的时态建模,可以松掉“求值-应用”的耦合,通过安全的消息传递来获得时间层之间的函数式关系。于是,由于我一直喜欢从系统模拟的视角看待计算,我便把“对象”和“函数”看作两种互补的思想,它们并不冲突。

术语一旦成为宗教或更加严格的选择与风格,便会失去它们的意义。这里说的自然是“面向对象”和“函数式编程”这两个术语。我不会将“函数式编程”的一般概念跟任何特定语言等同起来。我坚持认为“函数思想”是一种可靠的映射。类似的,我也不会把“面向对象”的一般概念同任何特定语言等同起来。如今这两个术语被“殖民”了,意思也变了。

还有一个大问题是“对象”和“抽象数据类型”的混淆,以及对“数据”和“赋值语句”的固执。如果真正强化了封装,对象就可以根据需要处理设计参数(包括保存历史信息)。

分布式环境中的对象
有朋友问我现在如何理解分布式环境中的对象和系统模拟的,是否依然认为有可能构造一种系统,它既有互联网那样可以有机增长的规模,又有类似于虚拟时间的良好的、可预测的语义?

好问题。这里面有好几组问题及其权衡关系。二十世纪70年代Dave Reed(编者注:美国计算机科学家,UDP协议设计者)最初思考的是面向整个互联网的操作系统应具有什么样子。在他提出的许多有趣想法中,其中之一是通过由虚拟时间(pseudo-time)组织起来的分布式克隆计算来处理长延时和海量潜在用户的问题,然后慢速的互联网仅用于输入和偏差同步。这就是我们本世纪00年代早期在Croquet中实现的东西,那时互联网上一次典型的、还算不错的ping来回大约80到100毫秒。这已经好到可以无需任何服务器而创建《魔兽世界》这样的大规模并行游戏(甚至飞行仿真游戏)了,只要有玩家正在用着的那些机器就够了(分布式)。后来的版本做得更多更全面。

插一句,去掉实时图形和交互的Croquet便自动提供了一种分布式的面向对象数据库。虚拟时间是背后的大理念,保护着数据库中的分布式原子事务。

而且多年来人们一直在讨论。它能否实现?需要在哪些领域做多少工作?等等。

我们在Parc做过的与对象有关的工作就是ARPA/Parc社区中发生的网络思维的一部分,它最终产生了思考更高层网络实体的倾向。“网络层实体”的一个相当不错的、过渡性的实现是Gerry Popek在Parc花了一年时间思考“网终系统应有的样子”之后,和他在UCLA的团队一起完成的LOCUS系统。那是建立在异构机器类型之上的一种迁移式的负载平衡思想,与虚拟时间概念形成高度的互补。

我希望看到富有才华的团队把第二个问题再过一篇。对可伸缩规模的适应性很难事先预测,最好实际去实现它。对于虚拟时间,如果你了解它却不使用它,任何情况下我都觉得有点疯狂,而如果不了解它,那就有点业余了。在这两者之间,则是以各种“不二法门”为特征的宗教(而这跟任何科学都背道而驰)。

订阅2017年程序员(含iOS、Android及印刷版)请访问 http://dingyue.programmer.com.cn
  • 大小: 95.7 KB
1
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 网站升级 网页升级 提示页面 图片说明

    网站升级,网页升级,提示页面,图片说明,网络升级

  • ESP32 html升级

    esp32 html升级

  • 系统升级页面html,页面访问界面升级

    页面访问界面升级了,赶紧通知用户吧!下面是应届毕业生小编为大家收集的关于页面访问界面升级,欢迎大家阅读!页面访问界面升级一尊敬的纳税人:因系统维护需要,浙江省国家税务局计划于2016年6月3日20时-6月6日0时对防伪税控系统实施存储迁移,届时可能会中断相关业务,全省纳税人对我局所有增值税发票系统升级版的访问将会受到影响,预计将于6月6日0时恢复所有业务系统的正常使用,感谢您的支持。衢州市国家税务...

  • Arduino ESP32 HttpUpdate OTA批量更新

    带版本判断的 Arduino ESP32 Http OTA 更新。

  • 网站升级改版服务器,网站程序升级改版 让网站无损失过渡

    当现有的网站遇到数据容量瓶颈,需要更换网站程序,如将自己编写的网站管理系统更换为开源的CMS;旧版ASP数据库不能支持大容量的数据,需要转换为SQL。更换带来的数据丢失和用户体验等麻烦就接连不断,特别是对于搜索引擎来说,网站结构的改变将有可能对排名造成较大波动。如何在转移网站数据后又不对网站造成损伤呢?这里就介绍网站转移后内容页面过渡的技巧,希望大家能以此举一反三触类旁通的处理自己所遇到的网站转移...

  • 网页升级需要关服务器吗,我们单位的网站系统进行升级,这期间网站需要关闭。网站服务器在本地,用的IIS。请问有什么方法呢?...

    2011-04-29 回答架设一个服务器是非常简单的事情,并不必要象他们所说的那样那么麻烦。那好,我就我所标的主题“如何架设一个可以调试asp程序的本地服务器”来做一个叙述,我们的目的就是,如何在自己的电脑上调试我们所下载下来的asp源代码,至于其他的,我们另做他说。   因为我平时用过最多的是两个系统,一个是win98,另外一个是win2000,98是很久之前用的了,现在还在用。因为在wi...

  • linux下安全备份升级(网页)

    如果在大部分开发完成,并且已经交付完成软件之后,如果产品要可持续的发展,并且与客户有长久合作关系,不可避免的需要进行技术支持,同样的,只要是人写出来的代码,就一定会存在bug,问题严重的还会影响产品的产量。所以,升级的必须的,现在我所知道的升级方式有三种: 一。直接把产生的二进制bin文件通过烧录器烧写到flash里面,在嵌入式linux中一般有三种类型的bin文件,分别是bootloader,

  • 关于html页面在线升级问题

    关于HTML在线升级的问题,这里是关于linux嵌入式方面,基于boa服务器的升级,所用到的cgi程序为C语言所编辑,主要想清楚这两个面,第一,升级的目的是什么,第二,如何升级。        首先就第一个问题,升级的目的是什么进行讨论,说白了,升级就是将新文件把原有的文件替换掉。    其次,升级的过程是:    1.需要做一个升级的网页即: form name="decode" id=

  • [经验分享]如何让你的网站每天自动更新

    相信很多刚刚做网站的站长朋友都有这样的感慨,每天更新网站真的是太累人了。想要提高自己网站的权重就得做到网站每天有更新,又不能一下子就把好几天的文章都给更新了,因为这在搜索引擎看来还是当天发布的,对网站的权重没有任何的作用,有没有什么办法可以让网站做到自动更新呢? 大家知道经常更新对于网站的重要性,搜索引擎喜欢新鲜的内容,如果你的站长期不更新,轻则排名下降,重则被k。...

  • 网页设计应该考虑的问题

    网页设计应该考虑的问题   当你在INTERNET这个信息的海洋中尽情遨游时,会发现许许多多内容丰富、创意新颖、设计独特的个人网页,不知道你见到这样漂亮可人的网页是否有点心动。一旦你具备了上网的条件,又萌发了制作主页的念头,那么就应该注意网页设计时应考虑哪些方面的问题,包括网站功能和以及访问者需要什么。你的整个设计都应该围绕这些方面来进行。下面笔者就自己在实践操作中的使用体会来谈谈网页设计时应该...

  • OpenWrt网页支持升级本地package

    Install packages via web interface Trigger to send file                 in file of packages.htm(View), which represent the apperance at Client’s site,  use method of POST , and input of FILE and SUB

  • asp升级到asp.net_从早期的ASP.NET Beta版本升级到Beta 2

    asp升级到asp.netIf you're upgrading some mid-BETA or CTP ASP.NET 2.0 code and you get some cryptic messages like 如果您要升级一些中端测试版或CTP ASP.NET 2.0代码,并且会收到一些隐秘消息,例如 c:\WINDOWS\Microsoft.NET\Framework\v2.0.50...

  • 从ASP.NET 升级到ASP.NET5(RC1) - 翻译

    前言 ASP.NET 5 是一次令人惊叹的对于ASP.NET的创新革命. 他将构建目标瞄准了 .NET Core CLR, 同时ASP.NET又是对于云服务进行优化,并且是跨平台的框架.很多文章已经称赞过了新的平台的优点. 但是在这篇文章中,我将展示给大家一个用VisualStudio2013,ASP.NET 4.5,MVC5,Entity Frameworkd 7编写的小型的Demo,然后将其升...

  • .net1.1项目升级到.net2.0碰到的问题

    以前网站我们都是以根目录来做路径的,现在发现用VS2005打开后提示找不到文件,以这种方式的项目升级要注意了。如:<img src="/images/XX.gif" > 这样在VS22005会提示找不到文件。 转载于:https://www.cnblogs.com/LCX/archive/2006/03/29/361944.html...

  • asp.net 数据增删查改的简易项目网页demo(适合新手)

    asp.net 数据增删查改的简易项目网页demo,适合纯新手。页面简单,只留有基本控件,适合没有asp基础的了解。

  • ASP.NET 实现自动更新系统的例子代码

    ASP.NET 实现自动更新系统的例子代码 有问题的可以到 http://bbs.oelite.com 开发板块讨论

Global site tag (gtag.js) - Google Analytics