科技: 人物 企业 技术 IT业 TMT
科普: 自然 科学 科幻 宇宙 科学家
通信: 历史 技术 手机 词典 3G馆
索引: 分类 推荐 专题 热点 排行榜
互联网: 广告 营销 政务 游戏 google
新媒体: 社交 博客 学者 人物 传播学
新思想: 网站 新书 新知 新词 思想家
图书馆: 文化 商业 管理 经济 期刊
网络文化: 社会 红人 黑客 治理 亚文化
创业百科: VC 词典 指南 案例 创业史
前沿科技: 清洁 绿色 纳米 生物 环保
知识产权: 盗版 共享 学人 法规 著作
用户名: 密码: 注册 忘记密码?
    创建新词条

历史版本5:Smalltalk 返回词条

目录

简介回目录

Smalltalk 被公认为历史上第二个 面向对象 的 程序设计语言 ,和第一个真正的集成开发环境 (IDE)。Smalltalk由Alan Kay,Dan Ingalls,Ted Kaehler,Adele Goldberg等于70年代初在Xerox PARC开发。

Smalltalk对其它众多的程序设计语言的产生起到了极大的推动作用,主要有:Objective-C,Actor, Java 和Ruby等。90年代的许多软件开发思想得利于Smalltalk,例如Design Patterns, Extreme Programming和Refactoring等。Ward Cunningham,一位Smalltalk程序员发明了 WikiWiki 。

什么是Smalltalk回目录

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

一种面向对象的程序设计语言:它是一种面向对象的语言,包含语言的语法和语义。一些编译器可以通过Smalltalk源程序产生可执行文件。这些编译器通常产生一种能在虚拟机上运行的二进制代码。Smalltalk语言本身非常精炼。

一种程序设计环境:这里指的是一种提供许多 对象 的系统,而不是某种特殊的开发环境。和许多语言不同(包括C++),Smalltalk附带有一个巨大的、相当标准的类库。这些 类 使得开发Smalltalk程序的效率非常高。在其它语言(例如 Ada , C 和 Pascal )中通常被作为语言的一部分的功能(例如条件判断,循环等),在Smalltalk由特定的类提供。

一个应用开发环境(ADE):由于Smalltalk的历史原因,它具有一个非常优秀的高度集成、开放的应用开发环境。由于开发环境中的浏览器、监视器以及调试器都由同样的源程序衍生出来的,不同的版本之间也具有相当好的兼容性。此外,这些工具的源程序都可以在ADE直接存取。

Smalltalk中的对象

在Smalltalk中所有的东西都是对象,或者应该被当作对象处理。例如下面的表达式:

2 + 3.

应当被理解为:向对象2发送消息+,参数为对象3。

纯面向对象使得Smalltalk在语言结构方面有许多与其他语言不同的特点,例如在Smalltalk语言中没有条件语句,取而代之的是一些发送给对象true或者false的消息,因此它们不属于语言部分,而属于Smalltalk的类库;也没有循环重复语句(C语言中的for while),Smalltalk用向数字对象或块对象发送消息来实现重复执行。

Smalltalk的历史

最早的Smalltalk原型由Alan Kay于70年代初提出。类(来自Simula-67)、海龟绘图(来自MIT的 LOGO )以及 图形界面 等概念的有机组合,构成了Smalltalk的最初的蓝图。

在1971年到1975年之间,Kay在Xerox PARC的小组设计并实现了第一个真正的Smalltalk语言系统。这个系统具有以下几个技术创新:

语言完全基于Simula的类和消息的概念。

语言没有固定的语法,语法分析由类本身完成。

开发环境的革新相当迅速。虽然当时的位图显示器十分昂贵,但是Kay却说服了PARC让他使用这些位图显示器,这使得Kay和他的小组能够实现不同大小和字体的文字,使用多窗口环境,以及一些对图像处理的高端支持。

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

引入了继承和子类的概念。

确定了语言的语法,这使得编译器能够产生高效、可执行、精炼的二进制代码。

Larry Tesler设计了浏览器,这极大地提高了Smalltalk程序员的编程效率。

前述的所有Smalltalk系统都是在特殊的硬件上实现的,直到1977-78年,Bruce Horn 和 Ted Kaehler 把Smalltalk-76移植到由Intel 8086处理器和自定显示器所组成的硬件环境(被称为NoteTaker)上。虽然这种硬件环境只生产了10台,但是它证明了在通常的处理器上实现Smalltalk的可能性。

Smalltalk-80

在1979-80年,部分受NoteTaker项目的影响,Smalltalk小组的注意力转移到Smalltalk的销售可行性上。小组设计并实现了新一代的Smalltalk系统,这次修改的目标着重于在标准硬件上的移植性等方面,包括:

采取 ASCII 码集,摒弃了原先在Smalltalk-72和-76中使用的特殊字符。

取消了原始(primitive)方法直接存取内存的能力。取而代之的是引入一系列的原始方法提供相应的功能。

引入了元类的概念。

引入MVC(Model-View-Controller)系统以方便交互式应用软件的开发。

程序实例

数学计算

(15 * 19) + (37 squared)

可以理解为:向15发送消息'*',参数为19;向37发送消息squared; 最后向15*19的结果发送消息'+',参数为37 squared的结果。

Objects、Smalltalk、Dynabooks和Squeak:Objects的由来回目录

1、针对物体编程1

“面向对象编程”是一个时下流行的口号。很多人希望在他们的程序中使用它,甚至有些不懂编程的人也煞有介事的说“使用了对象技术”。这其实是我们时代的一个标志,伟大的科技突飞猛进,人们知道一些名词,却不知道这些词的由来和它们的意思。

我们今天所知道的英文“Object”,国内翻译为“对象”,英文词典上给出的第一个解释是“物体”。它于20世纪60年代末,70年代初出现在计算机科学领域。想像一下当时的计算机科学的样子,窗口(英文Windows)是用玻璃制造的,老鼠(英文Mouse)代表一种啮齿动物。微软还不存在,比尔盖茨还在上中学。那时候良好的编程方法是“结构化编程”,人们那时候热衷谈论它就像今天人们谈论“对象”一样。占优势的就是好的东西,这个观念即使在今天也一样,所以在你的第一堂编程课上(即使当时使用的是一种面向对象编程语言),你学习如何使用结构化编程的方法来向问题发动进攻。

当你最开始学习计算机编程时,你大概被教导要按照如下的过程来做:

定义你的程序要完成什么任务。
把这个任务分解成许多越来越小的部分(通常分解到函数),直到你分解到能实现它们为止。
定义这些函数需要处理的数据结构。
通过定义每个函数要接受什么样的输入和将会怎样输出来设计函数间如何相互动作。
将这些函数组织为一个一个的组件(例如“单元”,甚至“类”)。
为每个函数添加代码并实现它们需要的数据结构。
你是否定义了抽象数据类型以及是否使用了与上面所列的稍微不同的顺序并不重要。通常,这不是一个“针对物体的过程(Object-Oriented process)”。最大的区别在于上面的做法可以用“关注过程”来概括。你关注程序会做(Do)什么:包括任务和函数。数据被定义成某种可被程序操作的东西。我们可以称上面的做法为“面向动词的过程”。

一个针对物体的过程(Object-Oriented process)通常从定义名词开始,这些名词是存在于一个与你要开发的程序相关的世界中。作为一个针对物体的设计者,你需要识别出程序世界中的物体。你定义这些物体应该知道什么(这些物体的数据),这些物体能够做什么(这些物体的行为和动作),并且你还定义这些物体之间如何互相作用。大而言之,你开发的这些定义用来为现实世界建模,小而言之,你的程序将实现模型世界中的功能。程序必须实现功能的这一部分世界被称为程序的“领域”。如果你打算开发一个学生注册系统用于在新学期开学时使用,你需要当作物体的来处理的东西包括学生、老师、课程、先修课程等等,它们都是与学生注册有关的基本事物。

针对物体的方法是结构化方法之外的另一种途径。你不再从分析程序的任务开始,而是从程序涉及的世界开始。最终,你同样以进行某种结构化的分析作为结束,只不过这时的分析是针对某个给定物体的行为结构。并且这种层次的分析发生在整个过程中很晚的后期。

针对物体的开发过程通常按照这样的顺序进行:

针对物体的分析(Object-Oriented Analysis): 针对物体的分析用来定义出一个基于物体模型的领域,程序将在这个领域中活动。这样的分析会产生一系列含有数据和行为的物体,以及这些物体之间的关系。我们称这种针对物体的分析为关注问题的分析。
针对物体的设计(Object-Oriented Design):针对物体的设计关注于解决方案。你把在前面分析中了解到的问题一一对应到某种语言的实现上。目标是最后得到一个详细描述。其详尽程度足以用来指导进行具体的实现。
针对物体的编程(Object-Oriented Programming):这一步才真正根据前面的设计构建程序。
理解针对物体开发的好办法之一是了解它的由来,并且了解它为什么与结构化开发不同?如何与结构化开发不同。本章的以下部分将带领读者回到过去,回到物体(Object)这个概念诞生的时代,解释“针对物体的开发”是如何出现的,并告诉读者Squeak是多么适合我们学习。
 
2、Object的诞生
有两个软件对“针对物体编程”的诞生产生了重大的影响。其中一个根本就不是一个程序设计语言,而是一个很棒的图形编辑器,这个图形编辑器名叫“绘图板(Sketchpad)”,是在1963年由麻省理工学院(MIT)的Ivan Sutherland创作的。据我们所知,Sketchpad是世界上第一个针对物体的图形编辑器。

在Sketchpad中,不仅可以在画布上描画彩色的点,(这些点最终被组合成图形),每个Sketchpad中创建的图形都是彼此不同的物体。更为惊人的是,可以在Sketchpad中定义“主样图(master drawing)”,从每个主样图,可以定义一系列“实例图(instance drawing)”。每个实例图都和主样图保持一致,如果更改了主样图,所有的实例图都会同时做出同样的改变。从某种意义上讲,Sketchpad甚至比许多运行在高速计算机上的现代高端图形编辑器还要优秀。Sketchpad的速度惊人的快,用户甚至可以在虚拟画布上绘制达三分之一英里尺寸的巨大图形。

(图)图1:Ivan Sutherland正在使用Sketchpad图1:Ivan Sutherland正在使用Sketchpad

(来自http://www.sun.com/960710/feature3/sketchpad.html)2

另外一个软件是一门程序设计语言,它被设计用来更方便的实现仿真。该语言名叫Simula,是1966年在挪威被开发出的。在Simula中,可以定义一个行为,并且从一个行为可以创建任意多的工作过程。这在本质上与Sketchpad中的主样图和实例图非常相似。虽然Simula仍然是一种通用的过程化编程语言,但是用户已经可以使用它创建一些物体来模拟真实世界了。

每一个Simula语言中的过程都是一个不同的物体:它拥有自己的数据和自己的行为,并且,在未经许可的情况下,任何物体都不能扰乱其他物体的数据和行为。这对于一个用于仿真的语言非常重要。因为现实世界中的物体是不能扰乱其他物体内部的。例如你不能摸到一个动物的体内,你也不能进入墙壁的内部改动里面电线。这种物体具有自身的数据和行为,并且未经许可,它们不能被其他物体访问的概念被称为封装。

每一个Simula中的物体都可以彼此同时自己动作。这是建立仿真中很重要的一个部分。在同一个房间中的两个人可以同时说话、做事。世上根本不存在一个时间共享系统来为每个人的说话和做事划定时间段。(想想世上有这么一个协调者宣称:“好的,现在轮到你呼吸,现在你可以发一个音节,现在你……”)在现实世界中,任何时候都有事情同时发生。任何支持仿真的系统至少要支持模拟多个并发的过程。

1966年,这两个想法在犹他大学的学生艾伦.凯(Alan Kay)的头脑中碰撞出了火花。Alan是计算机系的一名研究生,他刚刚听说了Sketchpad,并且他正在想办法让Simula能够在学校的机器上运行。他发现了这两者之间的联系,实际上,他发现了如何建立稳定的大型系统的关键(钥匙)。使用一台计算机的最好办法就好比这台计算机的内部有成千的小计算机——每个都是独立的,但是彼此之间却按照清晰的规则相互作用。

这个仿真的比喻非常了不起。在某种意义上,所有的软件都是对真实世界的某一部分的仿真,而软件设计者的工作就是对真实世界建模。由于程序员生活在真实世界中,他可能会很好的理解自己的所处的一切。如果一个程序是针对真实世界建立的清晰模型,那么日后对此程序进行维护时,很可能它将是非常容易被理解和读懂的。真实的世界将是负责维护的程序员和原作者之间的共同框架和桥梁。

Alan在本科时的专业课之一是生物学。生物学专门研究如何制造复杂的事物。例如一个病菌大约含有120兆字节的信息,而其大小却只有正常细胞的500分之一,我们的身体中有大约10的13次方(1013)之多的这些病菌。现在想想任何人类制造的人工部件。有哪些能够按比例增加千倍?百万倍?万亿倍?如果你用你家的宠物狗窝做元件,你能把一个狗窝复制几百万个,然后把它们固定在一起,从而盖出一座舒适坚固的摩天大厦么?也许互联网是目前人类构造出的最接近这一数量级的事物,经过了这么多年的惊人膨胀,它仍然能够正常运转。Alan考虑如何能够具有这种能力,从而良好的控制软件的增长和复杂度的膨胀而不造成意外。

Alan认为“物体”可以做到这点。每个物体可以比作一个生物细胞:独立、不可分割,但是可以和它的同类在某种规则和机制(例如吸取养分,排出废物等等)下互相作用。通过组合成千上万的这些细胞,我们就可以构建出非常复杂和稳定的系统,而系统本身可以增长并且允许被重用。

复杂性:每个物体都执行自身的操作而不扰乱别人的接口,通过这点来解决复杂性的问题。

稳定性:由于一个物体的损失并不会损坏其他物体,其仅仅影响依赖于这个物体提供服务的某些物体。因此可以保证系统的稳定性。损失掉的物体可以很快得到补充,在肌体中,通过产生一个新细胞来补充;在计算机系统中,通过产生一个新物体来进行补充。在“针对物体”的系统中,我们管这种用来定义如何产生同种新物体的“蓝图”叫做“类”。

增长性:通过自始至终使用同样的结构和通讯机制,可以支持系统的增长。所有的生物系统都由细胞组成。如果所有的软件都统一由物体构成,那么对比传统的结构分析方法,就可以构建更加巨大的系统。进一步,可以像细胞组成器官一样,物体也可以进行组合。一个物体可以通过集合3,包含其他很多物体。

重用性:最后,由于每个物体都通过尽量减少和其他物体的联系来履行自己本身的职责,所以重用性得以发挥。如果设计者进行了精心的努力,对应真实世界中的物体设计出了良好的软件物体模型,这些模型就很可能在将来有更多的用场。同样的物体在真实世界中会表现出丰富多彩的形态,例如:铅笔、支票、客户。只需要良好的建立这些物体模型一次,就可以在将来一遍一遍再次使用它们。

3、一台给所有年龄孩子的个人电脑
FLEX是最早的针对物体编程的系统,它是Alan Kay的学位论文的中心内容。Sketchpad是一个针对物体的绘图系统,而Simula是第一个针对物体的程序设计语言。FLEX计算机是一个完整的个人电脑,它基于物体并且完全可编程(可以由程序设计,修改,控制——译者)。尽管它不是最早的个人电脑,但是个人电脑的概念在那时仍然非常前卫,甚至会招致某些人的嘲笑。在上世纪60年代后期(1960年代后期),计算机极其巨大,大小能充满整个屋子,完全是高精尖的阳春白雪。很难想像一个普通人能够拥有一台价格超级昂贵的巨型机器怪物。但是Alan和其他一些先驱者已经发现了现今非常著名的“摩尔定律1”的威力:随着芯片集成度的提高,计算机会变得非常便宜。Alan希望他的FLEX计算机能够被个人使用,并且希望它能成为Alan自己的一个研究平台,通过这个平台他可以研究普通人如何使用个人电脑。

那时已经可以给出FLEX这样的计算机应该具备什么功能的需求列表。它可以被编程,具有一个灵活可扩展的语言。当然Sketchpad和Simula都进入了这张需求列表,尽管它们都不可能在16K内存16位字长(word)的FLEX上运行。如图2所示,FLEX被设计为可以支持徒手画图。另外Douglas Engelbart的NLS(oNLine Systems)也进入了这个需求列表。

1 戈登·摩尔(Gordon Moore)定律,简称摩尔定律。虽然严格来说,摩尔定律仅仅提到了同样价格下芯片中的晶体管数量会翻倍,但是摩尔定律的效果就是每18个月,计算能力就会增加一倍,而价格却维持不变。

Douglas Engelbart认为计算机会“增加人类的智力”,他希望计算机能帮助使用者更好的感知并应对其所在的真实世界。Engelbart在1968年演示NLS时,极具震撼地向观众展示了他如何使用定位设备(Engelbart发明了鼠标),多面板的视图,图形处理,甚至连接实况视频,进行交互协作!

(图)图2:Alan Kay绘制的Flex示意图图2:Alan Kay绘制的Flex示意图

图2:Alan Kay绘制的Flex示意图(来自《Smalltalk的早期历史(Early History of Smalltalk)》)

在FLEX的相关工作中,Alan同样从Seymour Papert和他在MIT的同事们所作的先驱性工作中了解到了一种专门为儿童们学习编程开发的一种程序设计语言:Logo。同样,在那时,这和个人计算机一样非常超前。儿童们会希望计算机这种强大的庞然大物做什么呢?Logo的开发者们通过让孩子们编写程序来探索计算机显示出的问题(图形和符号)和知识。孩子们可以用程序控制一个“海龟”图形,通过一句一句的命令让海龟画图。

通过这些,Alan发现了个人计算机的角色就是个人动态媒体。计算机是可供人们来探索的(Logo),可供人们绘画的(Sketchpad),甚至可供人们用来模拟真实世界中的任何事物(Simula)。不久,和Adele Goldberg一起,他表述了个人计算机是一种最重要的原始媒体(meta-medium),是第一种可以包含所有其他媒体的东西,它可以包含文字,声音,图形,动画以及其他尚未发明的媒体。这就是在研究FLEX时,Alan眼中的个人计算机。

FLEX并没有达到Alan所有的目标,但是它做到了其中的很多。它自然成为了真正个人计算机的雏形:小巧,甚至可以手持;可以使用键盘或者笔来绘图;可以连接无线网络等等。Alan称这些目标为一台Dynabook,并且他在1972年美国计算机学会(ACM)上发表的论文中说它是一台“给所有年龄孩子的个人电脑”。

1970年,Alan Kay加入了施乐(Xerox)公司设在Palo Alto的新研究中心,他在那里领导学习研究小组(Learning Research Group)发明了Smalltalk。Smalltalk是世界上第一个“针对物体编程”的语言,并且不同于早期的Simula,Smalltalk同现代我们所知道的“面向对象编程”完全一致。Smalltalk不仅具有了Dynabook最初希望的很多特性,而且最终封装了我们今天能够想到的关于个人计算机的所有东西。Smalltalk系统是第一个具有点阵显示器,互相覆盖的窗口,菜单,图标,并且有一个鼠标定位设备。微软的Windows,UNIX的X-Windows和苹果的Machitosh操作系统全部根源于Smalltalk。千真万确,现代用户界面是和针对物体编程手拉手一起进化的。

(图)图3:用硬纸板制作的Dynabook模型图3:用硬纸板制作的Dynabook模型

图3:用硬纸板制作的Dynabook模型

Smalltalk经历了好几个发展阶段。从Smalltalk-71(看起来很像Logo)和Smalltalk-72(首次实现了很多针对媒体的特点,包从绘画到音乐程序,甚至还实现了图标编程语言)开始,Smalltalk-76是Smalltalk发展成的第一个现代Smalltalk。此时Smalltalk的主要实现者和作者是丹·因格斯(Dan Ingalls)。学习研究小组的另一名创始人Ted Kaehler为Smalltalk-72开发了应约系统,Smalltalk版的Logo"海龟",以及Smalltalk的针对物体的内存结构。

图4:Smalltalk-72的用户界面(来自Alan Kay的扫描图形,图像质量尚不令人满意)

(图)Smalltalk-72的用户界面Smalltalk-72的用户界面

Smalltalk-80发布给了一些计算机公司(DEC, Apple, IBM, Tektronix)用于测试Smalltalk的移植性。Smalltalk-80被实现为一个字节码编译器(bytecode compiler)。Smalltalk的代码实际是真正经过编译的,但是它并不被编译为其运行所在的机器(宿主计算机——译者)上的机器语言。反之,Smalltalk代码被编译成一种独特的机器语言,而这种机器语言根本不在任何实际存在的硬件上运行,它运行于一个虚拟机上。而在真正的硬件上,可以非常容易地用这个硬件的机器语言写出一个小巧的程序(一个解释器),用来执行虚拟机上的字节码。这个解释器使得实际的机器看起来和虚拟机一样,因此它可以运行任何为虚拟机编写的程序。这一方案是的优势就是Smalltalk-80具有极高的可移植性4。实际上,所有这些公司都非常轻易地在它们自己的系统上构建了Smalltalk-80。

一个基本的Smalltalk-80实现包含四个文件:

一个虚拟机解释器,可以在实际机器上执行。

一个映像文件,它是一个虚拟机目标代码格式的程序,这个程序包括Smalltalk的编译器,开发环境和相关的工具。

一个源代码文件,包含了映像中所有基本物体需要的Smalltalk源代码。

一个变化(记录)文件,包含了用户增加到映像中的所有物体的Smalltalk源代码。

Smalltalk-80已经成了衡量目前所有Smalltalk的标准。施乐(Xerox)公司将Smalltalk分离出一个名叫ParcPlace公司,该公司将各种不同版本的Smalltalk市场化,包括ObjectWorks以及后来的VisualWorks。原学习研究小组的阿戴尔·戈德堡(Adele Goldberg)负责领导这个新公司并写出了Smalltalk-80的权威性书籍。其他版本的Smalltalk也纷纷由施乐公司以外的其他公司纷纷推出,例如Digitalk公司的Smalltalk/V和Quasar公司的SmalltalkAgents。虽然它们的用户界面代码大相径庭,但是他们都使用极为相似的语法和物体(对象)结构。

4、回到未来
在1995年,艾伦(Alan Kay)、丹(Dan Ingalls)和特德(Ted Kaehler)发现他们在苹果计算机公司再次聚首了,他们都在苹果公司工作。虽然之间的十多年大家天各一方,但是他们发现彼此仍然对Dynabook的梦想充满了兴趣,“一个开发环境,使用其能够构建让不懂技术的人,包括孩子们都能使用——甚至编程——的教育软件”(Ingalls, Kaehler, Maloney, Wallace和Kay, 1997年)。由于Smalltalk的用户界面被很多其他系统复制和借鉴,“个人动态媒体”这一Dynabook的核心思想已经丧失了。他们考虑过使用Java进行开发,但是感觉它不够稳定。Smalltalk虽然非常适合,但是对于真正的Dynabook来说,当时商业化的Smalltalk缺少灵活性。例如商业版本的Smalltalk-80取消了对声音的支持。他们同样希望借助开源软件的力量,当时开源软件已经出项并从根本上改变了人们对于软件开发的认识。

开源软件的思路是把源代码在互联网上自由公开,并且使用彼此贡献的代码(包括修改的bug,增强的功能和改进的设计)来进行开发。最著名的就是Linux操作系统使用了开源软件的开发方法,另外很多著名的软件也采用了开源模型进行开发,包括Apache web服务器和Python程序设计语言。相对于传统的开发方法,开源的明显优势就是拥有全球互联网上巨大的创造力来推动软件。

因此苹果公司的这个小组决定:如果没有合适的Smalltalk,他们就创造一个。毕竟,他们以前都是Smalltalk的创造者。幸运的是,他们不用从零开始——因为他们有多年前苹果公司最初移植的那份Smalltalk-80。这就是本书使用的编程语言Squeak的诞生。

Squeak的哲学就是用Smalltalk实现全部一切。因为Squeak的目标是成为一个成功的开源软件,所以全部一切的代码,包括虚拟机解释器,都是自由开放的。如果某些代码是用C语言写的,而其他部分是用Smalltalk写的(仅仅是举一个假设的例子),系统就会变得难以理解并且难以扩展。但是虚拟机解释器,正如我们上文提到过的,必须使用本地机器语言(native machine language)编写。Squeak团队(Kay, Ingalls和Kaehler还有John Maloney以及Scott Wallace)找到了一个漂亮的解决方案:

他们使用Smalltalk来编写Smalltalk的虚拟机。这实际上并不像它听起来那么难:Adele Goldberg写的Smalltalk-80书中已经描述了用Smalltalk编写虚拟机解释器。他们只需要用键盘打出代码并让它运行就可以了。

他们写了一个小巧的Smalltalk到C语言的转换器(翻译器)。这样即使是必须以编译好的C语言代码也可以使用Smalltalk编写了。

当他们用Smalltalk编写好Smalltalk虚拟机后,他们就可以使用转换器将其变成C语言代码。然后再将其编译成可执行的本地机器语言程序。他们就可以接着从这个新的可执行程序运行映像了。从现在起,几乎所有的Squeak都可以用Squeak本身编写了。

1996年9月,Squeak在互联网上发布了。五个星期内,它就被移植到了几个UNIX的变体、Windows 95和Windows NT上。现在Squeak已经可以运行在数量巨大的各种计算机上,从手持的Windows CE设备和机顶盒到几乎所有的主要的计算平台。Squeak团队现在(在本书写作的时候)迪斯尼(Dsiney Imagineering)工作5,但是苹果公司允许Squeak用户在Squeak上面创造任何东西。但是根据开源软件的传统,任何对基本系统的改进提高必须发布回网络。

在其后的数年,越来越多的Dynabook原始特性在Squeak中出现。Squeak拥有强大的2维和3维彩色图形,多语音采样和声音合成,支持动画甚至视频,以及管理各种媒体格式的工具,包括MIDI、Flash、JPEG和GIF。

作为学习计算机科学的一门语言,Squeak的一个关键性的优点是它不断遵循着“所有一切都用Squeak实现”的哲学。考虑下面的一张图:

(图)图5:Squeak中的一个画线的例子图5:Squeak中的一个画线的例子

图5:Squeak中的一个画线的例子

Line example这个条消息创建了这张图。你在这里看到的是一个条粗线穿过了所有的一组窗口,穿过了标题条,甚至直接进入了桌面。在所有的现代窗口化系统中,着几乎是不可能的。但是Smalltalk-80是这些现代窗口化系统的鼻祖。在Squeak中,描绘窗口的代码是用Smalltalk写成的!画出上面那条粗线使用了同画出窗口线条一样的代码,所以它们互相之间没有什么优先可言。

如果你想研究计算机科学,Squeak提供了其中大量的优秀内容,从图形学到垃圾收集等等。你继承了Smalltalk组织中的全部伟大的开发工具,你能够访问到实现这些特性的上百万字节的源代码,你可以深入编程到任何深度而仍然处于Squeak之中(在其他系统中,如果想深入编程到底层的话,你也许不得不使用C或者汇编了——译者)。如果你打算彻底改造windows(或者Windows)、垃圾回收、甚至虚拟机,所有的相关Squeak代码就在那里,你可以从它们开始。想想看,用Smalltalk写的虚拟机不仅仅是为了让转换器生成C代码的——它同时也是一个可执行的Smalltalk,你可以使用它在现有的虚拟机上调试新的变化和改进(请对比C/C++的办法——交叉编译——译者)。当然,在一个字节码的解释器上解释另一个解释器中运行的字节码程序会非常的慢,但是相对于直接使用机器语言调试器,这是一个好很多的试验环境。Dan Ingalls在OOPSLA(面向对象编程、系统、语言和应用国际学会——译者)的论文上发表过一篇介绍Squeak的论文中写道,Squeak的目标之一就是让任何人都能过仅仅通过单独一门语言来了解全部系统:

Squeak是一个独立实用的Smalltalk,使用它,不管是学者,教授,还是一个好学的学生,都可以查看系统中的任何部分的源代码,包括最原始的图形部分和虚拟机自身,所有的改动立刻生效,而不需要使用任何Smalltalk以外的语言。


--------------------------------------------------------------------------------

5、其他针对物体(面向对象)语言的公共祖先
时光回转到1979年,Bjarne Stroustrup开创了针对物体程序设计语言的一条独立的分支。他希望创造出一种非常高效的Simula版本。Bjarne当时在贝尔实验室(Bell Labs)工作,贝尔实验室中曾经诞生了C语言。他开发出了好几个版本的语言,它们很像C,但是具有针对物体的扩展。1984年,C++诞生了。

C++和Smalltalk都来自与Simula的思想,但是它们采用了截然不同的途径。C++是一种编译型语言,使用了传统的函数概念和基于栈的作用域概念,而Smalltalk是一种动态语言(感觉上更像一个接解释器而不像一个编译器6)并且具有和作用域内函数无关的持久对象(物体)。C++是一种强类型程序语言,所有的变量都有一个类型,并且只有类型正确的值才能存入这些变量中。Smalltalk中根本就没有类型声明,所有的内存都是由系统使用一个称为垃圾回收的进程自动管理的。在Smalltalk中,你不能自己明确地销毁任何变量。

Java是更近一些时期诞生的一门编程语言,它开始合并针对物体(面向对象)编程中的两条线索。1991年,Sun Microsystems公司开始了一项内部项目,该项目的目标是给智能消费类电子设备(从机顶盒到电烤箱的所有产品)创造一种新的语言。James Gosling通过该项目创造了Oak编程语言,——一种高度可移植的针对物体(面向对象)程序设计语言。伴随这Web的发展,很明显一种高度可移植的语言可以用于通过互联网发送可执行的代码。于是这个语言,被命名为Java,就有了一个新的目标。1995年5月,Java正式公布。Java看起来很像C++,甚至比C++还强类型性。然而,Java也有一些解释器相关的特点,它使用编译好的字节码,并且也提供自动内存管理。


--------------------------------------------------------------------------------

习题
通过上面的讲解,针对物体(面向对象)系统的关键特征是什么?考虑使用过的各种类比:物体比作细胞,软件比作模拟(仿真),物体比作微小的计算机。这些类比指出了哪些关键特征?

如果你是一个软件设计者,继承会给你带来哪些好处?生物细胞之间也有继承关系么?很有趣的一点是,最早的Simula和Smalltalk都不具备继承的形式。

生物细胞有类的概念么?

针对物体(面向对象)编程中最重要的方面是什么?在这些列出的内容中:继承,封装,聚合,你认为最重要的一点是什么?


--------------------------------------------------------------------------------

参考文献
本章中的讨论仅仅涉及了影响针对物体(面向对象)编程、Smalltalk和Squeak的一些内容和特点。下面这些参考文献包括了更为详细的内容。

下面的文献详细讨论了Smalltalk的历史:

Kay, A. C. (1993). The early history of Smalltalk. History of Programming Languages (HOPL-II). J. E. Sammet. New York, ACM: 69-95.

Bjarne Stroustrup在下面文献中介绍了C++的历史:

Stroustrup, B. (1993). A History of C++. History of Programming Languages (HOPL-II). J. E. Sammet. New York, ACM: 699-769.

Alan Kay在《科学美国人(Scientific American)》杂志上首次发表了《Joe the Box》一文:

Kay, A. C. (1977). "Microelectronics and the Personal Computer." Scientific American(September): 231-244.

我最喜欢的一篇讨论施乐(Xerox)PARC设想的个人计算机的论文是:

Kay, A., & Goldberg, A. (1977). Personal dynamic media. IEEE Computer,March, 31-41.

OOPSLA国际学会上的关于Squeak的论文《回到未来》的链接:

ftp://st.cs.uiuc.edu/Smalltalk/Squeak/docs/OOPSLA.Squeak.html 原文的参考是:

Ingalls, D., Kaehler, T., Maloney, J., Wallace, S., & Kay, A. (1997). Back to the Future: The Story of Squeak, A Practical Smalltalk Written in Itself, OOPSLA'97 Conference Proceedings (pp. 318-326). Atlanta, GA: ACM.

Eric Raymond发表的可能是最有影响的关于开源运动的论文《大教堂和集市(The Cathedral and the Bazaar)》的链接:
http://www.tuxedo.org/~esr/writings/cathedral-bazaar

Squeak的主网站是:http://www.squeak.org。Squeak讨论区主网站是:http://minnow.cc.gatech.edu/squeak.1.


--------------------------------------------------------------------------------

脚注:

1、Object-Oriented Programming在国内一般翻译为面向对象编程,这一名称让很多初学者望而却步,由于Squeak是给孩子们设计的。所以将其翻译为“针对物体编程”——译者"

2、原书给出的链接已无效,本图来自:http://www-static.cc.gatech.edu/classes/cs6751_97_fall/projects/abowd_team/ivan/ivan.html

3、Aggregation,一般计算机专业书籍翻译为“聚合”,为了让儿童容易理解,这里翻译为“集合”。

4、Java虚拟机的概念正式源自于此,这也就是为什么Java号称“编译一次,到处执行”——译者

5、Squeak团队发展出了巨大的社群,其核心部分现在已经离开迪斯尼,具体请参考:http://minnow.cc.gatech.edu/squeak/723

6、事实上Smalltalk是经过编译的,而且采用了一种称为增量编译的技术——译者

参考文献回目录

→如果您认为本词条还有待完善,请 编辑词条

标签: Smalltalk