Smalltalk是一种动态类型、反射式的面向对象编程语言。Smalltalk由艾伦·凯、Dan Ingalls、Ted Kaehler、Adele Goldberg等于1970年代在施乐帕羅奧多研究中心开始开发。
![]() |
|
面向对象,反射式 | |
設計者 | Alan Kay、Dan Ingalls、Adele Goldberg |
實作者 | Alan Kay、Dan Ingalls、Adele Goldberg、Ted Kaehler、Diana Merry、Scott Wallace、Peter Deutsch、Xerox PARC其他人 |
1972年(開發始於1969年) | |
当前版本 |
![]() |
型態系統 | 強、動態 |
作用域 | 词法(静态) |
系统平台 | Xerox Alto |
操作系统 | 跨平台 |
主要實作產品 | |
Amber, Dolphin, GemStone/S, GNU Smalltalk, Pharo, Smalltalk/X, Squeak, VisualAge, VisualWorks | |
衍生副語言 | |
Self, GNU Smalltalk | |
啟發語言 | |
Lisp, Simula, Euler, IMP, Planner, Logo,Sketchpad, ARPAnet, Burroughs B5000 | |
影響語言 | |
AppleScript, CLOS, Dart, Dylan, Erlang, Etoys, Falcon, Go, Groovy, Io, Ioke, Java, Lasso, Logtalk, Newspeak, NewtonScript, Object REXX, Objective-C, PHP 5, Perl 6, Python, Ruby, Scala, Scratch, Self | |
Smalltalk对其它众多的程序设计语言的产生起到了极大的推动作用,特別是Objective-C、CLOS、Python和Ruby等。1990年代涌现的许多软件开发思想都得益于Smalltalk,例如设计模式、敏捷编程和代码重构等。
概述
Smalltalk和许多程序设计语言不同,它不仅仅是一门语言。下面从几个不同的角度来解释Smalltalk。
- 一种面向对象的程序设计语言:它是一种面向对象的语言,包含语言的语法和语义。一些编译器可以透过Smalltalk源程序产生可执行文件。这些编译器通常产生一种能在虚拟机上运行的二进制代码。Smalltalk语言本身非常精炼。
- 一种程序设计环境:这里指的是一种提供许多的系统,而不是某种特殊的开发环境。和许多语言不同(包括C++),Smalltalk附带有一个巨大的、相当标准的类库。这些类使得开发Smalltalk程序的效率非常高。在其它语言(例如Ada、C和Pascal)中,通常被作为语言的一部分的功能(例如条件判断,循环等),在Smalltalk由特定的类提供。
- 一个应用开发环境(ADE):由于Smalltalk的历史原因,它具有一个非常优秀的高度集成、开放的应用开发环境。由于开发环境中的浏览器、监视器以及调试器,都由同样的源程序衍生出来的,不同的版本之间也具有相当好的兼容性。此外,这些工具的源程序都可以在ADE直接存取。
历史
Smalltalk-76
VisualWorks,派生于Smalltalk-80 v2的商业实现
Pharo,从Squeak v3.9分叉出的派生于Smalltalk-80 v1的开源实现
最早的Smalltalk原型由艾伦·凯于1970年代初提出。类(来自Simula 67)、海龟绘图(来自LOGO)以及图形用户界面(来自Sketchpad等先驱系统)等概念的有机组合,构成了Smalltalk的最初的蓝图。
在1971年到1975年之间,艾伦·凯在Xerox PARC的小组,在Xerox Alto计算机上,设计并实现了第一个真正的Smalltalk语言系统,編譯器由Dan Ingalls負責主要實作。这个系统被称为Smalltalk-71與Smalltalk-72,具有以下几个技术创新:
开发环境的革新相当迅速。虽然当时的位图显示器十分昂贵,但是艾伦·凯却说服了PARC,让他使用这些位图显示器,这使得艾伦·凯和他的小组,能够实现不同大小和字体的文字,使用多窗口环境,以及一些对图像处理的高端支持。Smalltalk-72影响了演员模型的发展,它的语法和执行模型,与现代的Smalltalk变体有着显著的差异。
在1975到1976年间,艾伦·凯小组认识到应当对执行效率和规模进行优化。于是他们在许多重要方面重新设计了Smalltalk系统,被称为Smalltalk-76,它在语言上:
前述的所有Smalltalk系统,都是在特殊的硬件上实现的,直到1977年至1978年,Bruce Horn和Ted Kaehler把Smalltalk-76移植到Xerox NoteTaker上,它是由Intel 8086处理器和自定显示器所组成的硬件环境。虽然这种硬件环境只生产了10台,但是它证明了在通常的处理器上实现Smalltalk的可能性。
在1979至1980年,部分受NoteTaker项目的影响,Smalltalk小组的注意力转移到Smalltalk的销售可行性上。小组设计并实现了新一代的Smalltalk系统,这次修改的目标着重于在标准硬件上的移植性等方面,被称为Smalltalk-80,它包括:
- 采取ASCII码字符集,摒弃了原先在Smalltalk-72和Smalltalk-76中使用的特殊字符。
- 取消了原始方法直接存取内存的能力。取而代之的是引入一系列的原始方法提供相应的功能。
- 引入了元类的概念。
- 引入MVC(模型-视图-控制器)系统以方便交互式应用软件的开发。
Smalltalk-80是在PARC之外能获得到的第一个语言变体,最初作为Smalltalk-80版本1,给与了少数公司(惠普、苹果公司、泰克和DEC)和大学(UC Berkeley),用于同行评审和在它们自己的平台上实现。后来在1983年普遍可获得的实现,叫做Smalltalk-80版本2,发行为虚拟机规定和映像(具有对象定义的独立于平台的文件)。
1988年Xerox PARC为了将Smalltalk推向市场而成立了分拆公司ParcPlace Systems。ANSI Smalltalk自从1998年来是标准的语言参考。
两个当前流行的Smalltalk实现变体,是这些最初Smalltalk-80映像的后代。Squeak是开源实现,它经由Apple Smalltalk,派生自Smalltalk-80版本1.03。VisualWorks经由Smalltalk-80 2.5和ObjectWorks(二者都是ParcPlace Systems的产品),派生自Smalltalk-80版本2。
面向对象编程
条目:面向对象编程
Smalltalk-80例子代码在Squeak下的类层级和与之并行的元类层级的示意图。其中的r
是ProtoObject
,c
是Class
,mc
是Metaclass
。蓝色连接表示实例联系,绿色连接表示继承联系。
如同其他面向对象语言,Smalltalk-80(而非Smalltalk-72)的中心概念是“对象” 。一个对象总是一个“类”的一个“实例”。类是描述它们的实例的属性和行为的“蓝图”。例如,一个GUI窗口类,可以声明窗口拥有的属性,比如标签、位置和窗口是否可见。这个类还可以声明其实例支持的操作,比如打开、关闭、移动和隐藏。每个特定窗口对象,对这些属性都有自己的值,它们每个都能进行它的类定义的操作。
Smalltalk对象确切的可以做三件事:
- 持有状态(引用到其他对象)。
- 接收消息自本身或其他对象。
- 在处理一个消息的过程中,发送消息至本身或其他对象。
一个对象持有的状态总是私有于这个对象。其他对象只能通过发动请求(消息)至这个对象,来让它做出查询或变更这个状态。任何消息可以发送给任何对象:当接收到一个消息的时候,接收者确定这个消息是否合适。Alan Kay评论说,尽管关注于对象,消息才是Smalltalk中最重要的概念:“最大的想法是消息传递,它是Smalltalk/Squeak核心的全部意义所在(它是我们在Xerox PARC阶段从未真正完成的某种东西)。”
不同于多数其他语言,Smalltalk对象可以在系统运行的同时进行修改。现场编码和飞速应用补丁,是Smalltalk的主导编程方法论,并且是它高效的主要原因。
Smalltalk是“纯”面向对象编程语言,这意味着,不像C++和Java,在作为对象的值和作为原始类型的值之间没有区别。在Smalltalk中,原始值比如整数、布尔值和字符,也是对象,这么说的意义在于它们也是相应类的实例,而且要发送消息来调用在它们上的运算。编程者可以通过