TB前卫网

TB前卫网店铺大全为您精选最好的精品店铺导航,欢迎您。收藏本站

图灵奖得主Alan Kay谈面向对象和函数式编程

栏目:科技数码   发布时间:2017/03/23   来源:CSDN云计算   编辑:CSDNcloud

函数

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系统。那是树立在异构机器类型之上的一种迁移式的负载平衡思想,与虚拟时间概念构成高度的互补。
我但愿看到富有才干的团队把第二个问题再过一篇。对可伸缩范围的适应性很难事前预测,最佳实际去实现它。至于虚拟时间,如果你知道它却不使用它,任何情况下我都觉得有点疯狂,而如果不知道它,那就有点业余了。在这二者之间,则是以各种“不二法门”为特点的宗教(而这跟任何科学都背道而驰)。

【公众号】:CSDN云计算
【微信号】:CSDNcloud
【微宣言】:CSDN作为国内最专业的云计算服务平台,提供云计算、大数据、虚拟化、数据中心、OpenStack、CloudStack、Hadoop、Spark、机器学习、智能算法等相关云计算观点,云计算技术,云计算平台,云计算实践,云计算产业咨询等服务。

下一篇:干货丨你做不好PPT并不是技术问题,而是方法错误!
*版权声明及防欺诈提醒