本页使用了标题或全文手工转换

Self

维基百科,自由的百科全书
跳到导航 跳到搜索
Self
Logo
编程范型 面向对象 (基于原型)
設計者 David Ungar, Randall Smith
實作者 David Ungar, Randall Smith, 斯坦福大学, Sun微系统
发行时间 1987年,​32年前​(1987
穩定版本
2017.1
(2017年5月24日,​2年前​(2017-05-24
型態系統 动态, 强类型
許可證 类BSD许可证
網站 www.selflanguage.org
主要實作產品
Self
啟發語言
Smalltalk
影響語言
NewtonScript, JavaScript, Io, Agora, Squeak, Lisaac, Lua, Factor, REBOL

Self语言,是一种基于原型面向对象程序设计语言,于1986年由施乐帕洛阿尔托研究中心的David Ungar和Randy Smith给出了最初的设计。

简介[编辑]

Self语言是在Smalltalk的基础上发展而来,沿用了Smalltalk中一切都是对象的风格。Self语言把概念上的精简作为设计原则。它取消了的概念,只有对象的概念,同时把消息作为最基本的操作。把对象的属性理解为获取或更改属性这两种方法,从而把属性的概念简化为方法;取消了变量赋值,并以通过消息来读槽和写槽的方式代之。在发展Self的过程中,Self的设计研究人员也探索了Self的程序设计。他们提出了traits的概念,用对象实现了名字(对象名或方法名)的管理,用动态继承实现模式转换。

尽管Self系统一次运行在一个进程中,但Self系统实际上可以分成两个部分:Self虚拟机和Self世界(Self world)。Self世界是一个Self对象库,Self程序就是Self世界里的对象,Self虚拟机用来执行这些Self程序。当Self程序从终端文件或者图形用户界面输入到系统中来时,Self系统把源程序解析转化为Self对象。Self对象包括数据对象和方法对象,方法对象的代码部分是用一种指令非常简单的字节码(bytecode)表示的,字节码由虚拟机来解释。在实现Self系统的过程中,设计研究人员发展出了一种动态自适应编译技术。这种技术的采用提高了Self代码的执行效率。对经常执行的方法,虚拟机将进一步把字节码转化为本机代码。Self虚拟机还提供了一些可供调用的原语,用来实现算术运算、对象复制、输入输出等。

Self同Smalltalk一样既是一个编程语言,也是一个集成开发环境运行环境。Self也拥有一个图形用户界面Morphic,Self的编程环境也是基于Morphic来实现的。Self在精简语言概念的同时也把大量的工作转交给环境来处理。如可见性(visibility),模块与代码的管理都是由环境来处理的,语言中的反馈机制也同环境密切相关。

基于原型的编程语言[编辑]

传统的基于类的面向对象语言,基于了根深蒂固的二元性:

  1. 定义对象的基本特质和行为。
  2. 对象实例是类的特定体现。

例如,假设类Vehicle(车辆)的对象有一个“名字”,和进行各种动作的能力,比如“开车上班”和“运送建材”。Bob's car是类Vehicle的特定对象(实例),它的“名字”是“Bob's car”。在理论上,你可以向Bob's car发送消息,告诉它去“运送建材”。

这个例子展示了这种方式的一个问题:Bob's car,恰巧是一个运动车,(在任何意义上)不能装载和运送建材,但这是建模Vehicle所必须拥有的能力。通过使用子类来建立特殊化的Vehicle,可产生一个更有用的模型;例如Sports Car(运动车)和Flatbed Truck(平板卡车)。只有类Flatbed Truck的对象需要提供“运送建材”的机能;运动车,不适合这种工作,它只需要“快速行驶”。但是,这种深入建模在设计期间需要更多的洞察力,洞察那些可能只在引起了问题时才显现出的事情。

这个问题是在原型这个概念背后的动机因素之一。除非你能必然性的预测出一组对象和类在遥远未来时所要有的特质,你不能恰当的设计好一个类的层级。程序最终需要增加行为实在是太频繁了,而系统的很多节段将需要重新设计(或重新构建)来以不同的方式迸发出对象。早期的面向对象语言如Smalltalk的实验,显示出这种问题反反复复的出现。系统趋向与增长到一定程度后就变得非常僵化,因为在编程者的代码下的深层的基本类,逐渐成为一个简单的“错误”。 没有变更起初的类的容易方式,严重的问题就会出现。

动态语言如Smalltalk,允许通过周知的按照类的方法进行这种变更;即通过改变类,基于它的对象就可以改变它们的行为。但是,进行这种变更必须非常小心,因为基于相同类的其他对象可能把它当作“错误行为”:“错误”经常是依赖于场景的。(这是脆弱基类问题的一种形式)。进一步的说,在语言如C++中,这里的子类可以从超类分别的编译,对超类的变更实际上可以破坏预编译的子类方法。(这是脆弱基类问题的另一种形式,也是脆弱二进制接口问题的一种形式。)

在Self和其他基于原型的编程语言中,消除了在类和对象之间的这种二元性。

不再有基于某种“类”的一个对象“实例”,在Self中,你可以复制一个现存的对象,并改变它。所以Bob's car可以通过制作现存的Vehicle对象的副本来建立,并增加“快速行驶”方法,建模它恰好是一辆保时捷911的事实。主要用来制作副本的基本对象叫做“原型”(prototype)。这种技术被称为是一种非常简化的机制。如果一个现存的对象(或对象的集合)被证明是个不适当的模型,编程者可以简单的建立有正确行为的一个修改的对象,并转而使用它。使用现存对象的代码不会改变。

发展简史[编辑]

Self语言的最初设计是由David Ungar和Randy Smith于1986年在施乐帕洛阿托研究中心提出的,并在1987年的OOPSLA'87的论文SELF: The Power of Simplicity上给出了描述。

1987年初Craig Chambers, Elgin Lee和Martin Rinard在Smalltalk上给出了Self的第一个实验性解释器

1987年夏Self项目在Stanford大学正式开始,1988年夏给出了第一个有效率的实现,并发布了1.0和1.1两个版本。在第一个版本中包括内存管理系统编译器

1991年初Self项目移至Sun Microsystems Laboratories Inc.,并且在1992年发布了2.0版。在第二个版本中采用了新的编译技术,并引入了多重继承

1993年1月Self 3.0版发布。在这个版本中包括了一个实验性的图形用户界面,简化了上个版本中多重继承的设计,引入了可见性概念,并采用了更新的编译技术。

1995年7月Self 4.0版发布。在这个版本中包括了一个全新的图形用户环境Morphic,提供了工具transporter用于保存对象,改进了虚拟机,改善了内存管理,在环境的层次上引入了模块的概念,取消了语言层次上的可见性概念。

1995年之后Self的发展基本已经停滞,但在发展Self过程中探索出的一些技术在别的系统中得到了应用。在Self的实现中采用的各种编译优化技术直接导致了Java Hotspot虚拟机的产生;在Smalltalk的一个实现Squeak中采用了Self图形用户界面Morphic的设计方案,放弃了标准Smalltalk中采用的MVC的方案。

站外链接[编辑]