社会焦点

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

字号+ 作者: 来源: 2017-03-24

图灵奖得主Alan Kay谈面向对象和函数式编程,javascript函数式编程 pdf,面向切面编程aop例子,如何理解面向对象和面向过程,面向接口编程的好处

  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——未求值的表达式可作为参数传递,之后再求值。这使得不太优雅的“特殊形式”四处充斥,它们本来可以写成漂亮的惰式函数。

转载请注明出处。


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章