Smalltalk是一种动态类型、反射式的面向对象编程语言。

本文介绍了Smalltalk这一动态类型、反射式的面向对象编程语言。阐述其不仅是语言,还是程序设计和应用开发环境。回顾了它从1970年代至今的发展历程,讲解了面向对象编程概念、语法,包括文字、变量声明等,还提及了相关实现列表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Smalltalk是一种动态类型、反射式面向对象编程语言。Smalltalk由艾伦·凯、Dan Ingalls、Ted Kaehler、Adele Goldberg等于1970年代在施乐帕羅奧多研究中心开始开发。

Smalltalk
面向对象反射式
設計者 Alan Kay、Dan Ingalls、Adele Goldberg
實作者 Alan Kay、Dan Ingalls、Adele Goldberg、Ted Kaehler、Diana Merry、Scott Wallace、Peter DeutschXerox PARC其他人
1972年(開發始於1969年)
当前版本
  • ANSI Smalltalk (1998年5月19日)
型態系統 、動態
作用域 词法(静态)
系统平台 Xerox Alto
操作系统 跨平台
主要實作產品
Amber, Dolphin, GemStone/S, GNU SmalltalkPharo, Smalltalk/X, Squeak, VisualAge, VisualWorks
衍生副語言
SelfGNU Smalltalk
啟發語言
LispSimula, Euler, IMP, Planner, Logo,SketchpadARPAnet, Burroughs B5000
影響語言
AppleScript, CLOS, DartDylanErlang, Etoys, Falcon, GoGroovy, Io, Ioke, Java, Lasso, Logtalk, Newspeak, NewtonScript, Object REXX, Objective-CPHP 5Perl 6PythonRubyScalaScratchSelf

Smalltalk对其它众多的程序设计语言的产生起到了极大的推动作用,特別是Objective-C、CLOS、PythonRuby等。1990年代涌现的许多软件开发思想都得益于Smalltalk,例如设计模式敏捷编程代码重构等。

概述

Smalltalk和许多程序设计语言不同,它不仅仅是一门语言。下面从几个不同的角度来解释Smalltalk。

  • 一种面向对象的程序设计语言:它是一种面向对象的语言,包含语言的语法和语义。一些编译器可以透过Smalltalk源程序产生可执行文件。这些编译器通常产生一种能在虚拟机上运行的二进制代码。Smalltalk语言本身非常精炼。
  • 一种程序设计环境:这里指的是一种提供许多的系统,而不是某种特殊的开发环境。和许多语言不同(包括C++),Smalltalk附带有一个巨大的、相当标准的类库。这些使得开发Smalltalk程序的效率非常高。在其它语言(例如AdaCPascal)中,通常被作为语言的一部分的功能(例如条件判断,循环等),在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,具有以下几个技术创新:

  • 语言完全基于消息交换Simula 67的类的概念。
  • 语言没有固定的语法,语法分析由类本身完成。

开发环境的革新相当迅速。虽然当时的位图显示器十分昂贵,但是艾伦·凯却说服了PARC,让他使用这些位图显示器,这使得艾伦·凯和他的小组,能够实现不同大小和字体的文字,使用多窗口环境,以及一些对图像处理的高端支持。Smalltalk-72影响了演员模型的发展,它的语法和执行模型,与现代的Smalltalk变体有着显著的差异。

在1975到1976年间,艾伦·凯小组认识到应当对执行效率和规模进行优化。于是他们在许多重要方面重新设计了Smalltalk系统,被称为Smalltalk-76,它在语言上:

  • 引入了继承和子类的概念。
  • 确定了语言的语法,这使得编译器能够产生高效、可执行、精炼的二进制代码。
  • 拉里·泰斯勒设计了类浏览器,这极大地提高了Smalltalk程序员的编程效率。

前述的所有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下的类层级和与之并行的元类层级的示意图。其中的rProtoObjectcClassmcMetaclass。蓝色连接表示实例联系,绿色连接表示继承联系。

如同其他面向对象语言,Smalltalk-80(而非Smalltalk-72)的中心概念是“对象” 。一个对象总是一个“”的一个“实例”。类是描述它们的实例的属性和行为的“蓝图”。例如,一个GUI窗口类,可以声明窗口拥有的属性,比如标签、位置和窗口是否可见。这个类还可以声明其实例支持的操作,比如打开、关闭、移动和隐藏。每个特定窗口对象,对这些属性都有自己的值,它们每个都能进行它的类定义的操作。

Smalltalk对象确切的可以做三件事:

  1. 持有状态(引用到其他对象)。
  2. 接收消息自本身或其他对象。
  3. 在处理一个消息的过程中,发送消息至本身或其他对象。

一个对象持有的状态总是私有于这个对象。其他对象只能通过发动请求(消息)至这个对象,来让它做出查询或变更这个状态。任何消息可以发送给任何对象:当接收到一个消息的时候,接收者确定这个消息是否合适。Alan Kay评论说,尽管关注于对象,消息才是Smalltalk中最重要的概念:“最大的想法是消息传递,它是Smalltalk/Squeak核心的全部意义所在(它是我们在Xerox PARC阶段从未真正完成的某种东西)。”

不同于多数其他语言,Smalltalk对象可以在系统运行的同时进行修改。现场编码和飞速应用补丁,是Smalltalk的主导编程方法论,并且是它高效的主要原因。

Smalltalk是“纯”面向对象编程语言,这意味着,不像C++Java,在作为对象的值和作为原始类型的值之间没有区别。在Smalltalk中,原始值比如整数、布尔值和字符,也是对象,这么说的意义在于它们也是相应类的实例,而且要发送消息来调用在它们上的运算。编程者可以通过

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_40191861_zj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值