(Translated by https://www.hiragana.jp/)
Smalltalk - 维基百科,自由的百科全书 とべ转到内容ないよう

Smalltalk

本页使用了标题或全文手工转换
维基百科ひゃっか自由じゆうてき百科ひゃっかぜん
Smalltalk
编程范型めんこう对象反射はんしゃしき
設計せっけいしゃAlan KayDan IngallsえいDan IngallsAdele GoldbergえいAdele Goldberg (computer scientist)
じつ作者さくしゃAlan KayDan IngallsえいDan IngallsAdele GoldbergえいAdele Goldberg (computer scientist)Ted KaehlerえいTed KaehlerDiana MerryえいDiana Merry、Scott Wallace、Peter DeutschXerox PARC他人たにん
发行时间1972ねん,​52ねんまえ​(1972開發かいはつはじめ於1969ねん
とうぜん版本はんぽん
  • ANSI Smalltalk (1998ねん5がつ19にち)[1]
編輯維基數據鏈接
かたたい系統けいとうつよ動態どうたい
作用さよういき词法せい态)
けい统平だいXerox Alto[2][3]
操作そうさけいまたが平台ひらだい
主要しゅようさく產品さんぴん
AmberえいAmber Smalltalk, DolphinえいDolphin Smalltalk, GemStone/SえいGemstone (database), GNU Smalltalk, Pharo, Smalltalk/X, Squeak, VisualAgeえいVisualAge, VisualWorksえいVisualWorks
衍生ふくかたりげん
Self, GNU Smalltalk
啟發けいはつげん
Lisp,[4] Simula,[4] EulerえいEuler (programming language),[4] IMPえいIMP (programming language),[4] PlannerえいPlanner (programming language),[4] Logo[5],Sketchpad,[4] ARPAnet,[4] Burroughs B5000えいBurroughs large systems[4]
影響えいきょうげん
AppleScript, CLOS, Dart, Dylan, Erlang, EtoysえいEtoys (programming language), Falcon, Go, Groovy, Io, Ioke, Java, LassoえいLasso (programming language), LogtalkえいLogtalk, NewspeakえいNewspeak (programming language), NewtonScript, Object REXXえいObject REXX, Objective-C, PHP 5, Perl 6, Python, Ruby, Scala, Scratch, Self

Smalltalkいち动态类型反射はんしゃしきてきめんこう对象编程语言。Smalltalkゆかりもぐさ伦·凯、Dan Ingalls、Ted Kaehler、Adele Goldbergとう于1970年代ねんだいざいほどこせ帕羅おく研究けんきゅう中心ちゅうしん开始开发。

Smalltalk对其它众てきほどじょ设计语言てき生起せいきいたりょう极大てき推动作用さよう特別とくべつObjective-CCLOSPythonRubyひとし。1990年代ねんだい涌现てき许多软件开发思想しそうとくえき于Smalltalk,れい设计しき敏捷びんしょう编程だい码重构[6]ひとし

がいじゅつ

[编辑]

Smalltalk许多ほどじょ设计语言不同ふどう,它不仅仅いち门语ごと下面かめん从几个不同ふどうてき角度かくどらいかい释Smalltalk。

  • 一种面向对象的程序设计语言:它是一种面向对象的语言,包含ほうがん语言てき语法语义。一些编译器可以透过Smalltalkげんほどじょ产生行文こうぶんけん。这些编译通常つうじょう产生いち种能ざいきょ拟机うえ运行てき进制だい码。Smalltalk语言本身ほんみ非常ひじょうせい炼。
  • 一种程序设计环境:这里ゆびてきいち提供ていきょう许多对象まとけい统,而不ぼう种特ことてき开发环境。许多语言不同ふどう包括ほうかつC++),Smalltalk带有いち个巨だいてき相当そうとう标准てき类库。这些使つかいとく开发Smalltalkほどじょてき效率こうりつ非常ひじょうだかざい其它语言(れいAdaCPascalちゅう通常つうじょうさく为语げんてきいち部分ぶぶんてきこうのうれい条件じょうけん判断はんだん,循环とう),ざいSmalltalkよし特定とくていてき提供ていきょう
  • 一个应用开发环境(ADE):よし于Smalltalkてき历史原因げんいん,它具有ぐゆう一个非常优秀的高度集成、开放てき应用开发环境。よし于开发环さかいちゅうてき浏览、监视以及调试みやこゆかりどう样的げんほどじょ衍生出来できてき不同ふどうてき版本はんぽん间也具有ぐゆう相当そうとうこのみてきけんようせい。此外,这些工具こうぐてきみなもとほどじょ以在ADE直接ちょくせつそん

历史

[编辑]
Smalltalk-76
VisualWorksえいVisualWorks派生はせい于Smalltalk-80 v2てきしょう业实现
Pharo,从Squeak v3.9ふんまたてき派生はせい于Smalltalk-80 v1てき开源实现

最早もはやてきSmalltalk原型げんけいゆかりもぐさ伦·凯于1970年代ねんだいはつ提出ていしゅつらいSimula 67)、うみ龟绘图らいLOGO)以及图形よう户界めんらいSketchpadとうさき驱系统)ひとし概念的がいねんてきゆうつくえ组合,构成りょうSmalltalkてき最初さいしょてき蓝图[5]

ざい1971ねんいた1975ねん间,もぐさ伦·凯在Xerox PARCてきしょう组,ざいXerox Alto计算机上きじょう,设计并实现了だいいち真正しんせいてきSmalltalk语言けい统,へんやくよしDan Ingallsせめ主要しゅようさく。这个けい统被しょう为Smalltalk-71あずかSmalltalk-72,具有ぐゆう以下いか几个わざ术创しん

  • 语言完全かんぜんもと消息しょうそく交换Simula 67てき类的概念がいねん
  • 语言ぼつゆう固定こていてき语法,语法分析ぶんせきよし本身ほんみ完成かんせい

开发环境てき革新かくしん相当そうとう迅速じんそく。虽然とう时的くらい图显しめせじゅうふんのぼる贵,ただしもぐさ伦·凯却说服りょうPARC,让他使用しよう这些图显しめせ,这使とくもぐさ伦·凯和てきしょう组,のう够实现不同大どうだい小和おわ字体じたいてき文字もじ使用しようまどこう环境,以及一些对图像处理的高端支持。Smalltalk-72かげ响了えんじ员模がたてき发展[7],它的语法执行模型もけいあずか现代てきSmalltalk变体ゆう显著てき异。

ざい1975いた1976ねん间,もぐさ伦·凯小组认识到应当对执ぎょう效率こうりつ规模进行优化。于是们在许多重要じゅうよう方面ほうめんおもしん设计りょうSmalltalkけい统,しょう为Smalltalk-76,它在语言上ごんじょう

  • 引入りょう继承和子わこ类的概念がいねん[8]
  • 确定りょう语言てき语法,这使とく编译のう够产せいだかこう执行、せい炼的进制だい码。
  • ひしげさと·たい斯勒设计りょう类浏览器,这极大地だいちひさげだかりょうSmalltalkほどじょ员的编程效率こうりつ

前述ぜんじゅつてき所有しょゆうSmalltalkけい统,みやこただしざい特殊とくしゅてきかたけんじょう实现てきちょくいた1977ねんいたり1978ねん,Bruce HornTed KaehlerSmalltalk-76移植いしょくいたXerox NoteTakerえいXerox NoteTakerうえ,它是よしIntel 8086处理てい显示しょ组成てきかたけん环境。虽然这种かたけん环境ただせい产了10だいただし它证あきらりょうざい通常つうじょうてき处理じょう实现Smalltalkてき可能かのうせい

ざい1979いたり1980ねん部分ぶぶん受NoteTaker项目的もくてきかげ响,Smalltalkしょう组的注意ちゅういりょく转移いたSmalltalkてき销售ぎょうせいじょうしょう组设计并实现りょうしん一代いちだいてきSmalltalkけい统,这次おさむあらためてき标着じゅう于在标准かたけんじょうてき移植いしょくせいとう方面ほうめんしょう为Smalltalk-80,它包括ほうかつ

  • さいASCII码字しゅう,摒弃りょうはらさきざいSmalltalk-72Smalltalk-76ちゅう使用しようてき特殊とくしゅ
  • 取消とりけしりょう原始げんし方法ほうほう直接ちょくせつそんうちそんてき能力のうりょく而代これてき引入一系列的原始方法提供相应的功能。
  • 引入りょうもとてき概念がいねん[9]
  • 引入MVC模型もけい-视图-ひかえせいけい统以方便ほうべん交互こうごしき应用软件てき开发。

Smalltalk-80ざいPARCそとのう获得いたてきだい一个语言变体,最初さいしょさく为Smalltalk-80版本はんぽん1,给与りょう少数しょうすう公司こうしめぐみひろし苹果りんご公司こうしやすしかつDECかず大学だいがくUC Berkeley),よう同行どうこう评审かずざい它们自己じこてき平台ひらだいじょう实现。きさきざい1983ねん普遍ふへん获得てき实现,さけべ做Smalltalk-80版本はんぽん2,发行为きょ拟机规定映像えいぞう具有ぐゆう对象てい义的独立どくりつ于平だいてきぶんけん[10]

1988ねんXerox PARC为了はたSmalltalk推向场而成立せいりつりょうぶん公司こうしParcPlace Systems。ANSI Smalltalk从1998年来ねんらい标准てき语言参考さんこう[11]

两个とうぜん流行りゅうこうてきSmalltalk实现变体,这些最初さいしょSmalltalk-80映像えいぞうてききさきだいSqueakこれ开源实现,它经よしApple Smalltalk[12]派生はせいSmalltalk-80版本はんぽん1.03[13]VisualWorksえいVisualWorks经由Smalltalk-80 2.5ObjectWorks(しゃParcPlace Systemsてき产品),派生はせいSmalltalk-80版本はんぽん2[10]

めんこう对象编程

[编辑]
Smalltalk-80れいだい码在Squeakしたてき类层级和あずかこれ并行てきもと层级てきしめせ图。其中てきrこれProtoObjectcこれClassmcこれMetaclass。蓝色连接表示ひょうじ实例联系,绿色连接表示ひょうじ继承联系。

如同其他めんこう对象语言,Smalltalk-80(而非Smalltalk-72)てき中心ちゅうしん概念がいねん对象” 。一个对象总是一个“てきいち个“实例”。类是描述它们てき实例てき属性ぞくせい和行かずゆき为的“蓝图”。れい如,いち个GUIまどこう类,声明せいめいまどこう拥有てき属性ぞくせい如标签、位置いちまどこういや见。这个类还声明せいめい其实れい支持しじてき操作そうさ如打开、关闭、うつり动和隐藏。まい特定とくていまどこう对象,对这些属せいゆう自己じこてき值,它们ごと个都のう进行它的类定义的操作そうさ

Smalltalk对象确切てき以做さんけんごと

  1. もちゆうじょう态(引用いんよういた其他对象)。
  2. 接收せっしゅう消息しょうそく本身ほんみある其他对象。
  3. ざい处理一个消息的过程中,发送消息しょうそくいたり本身ほんみある其他对象。

一个对象持有的状态总是私有于这个对象。其他对象ただのうどおり过发动请もとめ消息しょうそくいたり这个对象,らい让它做出查询ある变更这个じょう态。にんなん消息しょうそく以发送给任なん对象:とう接收せっしゅういた一个消息的时候,接收せっしゅうしゃ确定这个消息しょうそくあい适。Alan Kay评论说,つきかん关注于对ぞう消息しょうそくざいSmalltalkちゅうさい重要じゅうようてき概念がいねん:“最大さいだいてきそうほう消息しょうそく传递,它是Smalltalk/Squeak核心かくしんてき全部ぜんぶ所在しょざい(它是わが们在Xerox PARC阶段从未真正しんせい完成かんせいてきぼう种东西にし)。”[14]

不同ふどう于多すう其他语言,Smalltalk对象以在けい统运ぎょうてきどう时进ぎょうおさむあらため。现场编码飞速应用补丁,Smalltalkてきしゅ导编ほど方法ほうほう论,并且它高こうてき主要しゅよう原因げんいん

Smalltalk“纯”めんこう对象编程语言,这意味いみぞうC++Javaざいさく为对ぞうてき值和さく原始げんし类型てき值之间没ゆう别。ざいSmalltalkちゅう原始げんし值比如整すうぬの尔值和字わじ,也是对象,这么说的义在于它们也しょう应类てき实例,而且よう发送消息しょうそくらい调用ざい它们じょうてき运算。编程しゃ以通过あらため变或扩展实现原始げんし值的类,使つかいとく以向它们てき实例てい义新ぎょう为,れい如实现一个新的控制结构,甚至使とく它们现有ぎょう为得以改变。这个ごと实被总结なりつね听到てきいちたん语:“ざいSmalltalkちゅう所有しょゆう东西对象”,它可以更せい确的ひょう达为:“所有しょゆうてき值都对象”,いん为变りょう

いん所有しょゆうてき值都对象,也是对象。まい个类这个类的もとてきいち个实れいもと类都Metaclassもと类类)てき实例,它也对象,并且Metaclass classもと类元类)てき实例。だい码块Smalltalkひょう匿名とくめい函数かんすうてき方式ほうしき,它也对象[15]

Hello, World!れい

[编辑]

Hello, World!ほどじょ,实质じょう所有しょゆう计算つくえ语言てき课本用作ようさくようがく习的だいいち个程じょ,它展示てんじりょう这个语言てきさい基本きほん语法环境。对于Smalltalk,这个ほどじょ极其简单てき书写。した列代れつだい码中,消息しょうそくshow:发送给对ぞうTranscript具有ぐゆうくし文字もじ'Hello, World!'さく为它てき实际さんすう。调用show:方法ほうほう,导致它的实际さんすうそくくし文字もじ'Hello, World!',显示ざいさけべ做“副本ふくほん”(Transcript)てき终端まどこう

Transcript show: 'Hello, World!'.

注意ちゅうい需要じゅよう开Transcriptまどこうらいいた这个れいてき结果。

语法

[编辑]

Smalltalk-80语法相当そうとう极简ぬしてきただもと于了一小把的声明和保留字。こと实上,Smalltalkちゅうただ保留ほりゅうりょうろく个“关键”:truefalsenilselfsuperthisContext。它们てきじゅん确术语是“伪变りょう”,ふく从变りょう标识规则てき标识ただし指示しじりょう编程しゃしょ不能ふのう变更てき绑定。truefalsenil伪变りょう单例实例。selfsuperざい响应一个消息而激活的方法中,ゆびしょう这个消息しょうそくてき接收せっしゅうしゃただし发送给superてき消息しょうそくざい这个方法ほうほうてきてい义类てきちょう类中查找方法ほうほう,而非这个接收せっしゅうしゃてき类中,这允许子类中てき方法ほうほう调用ざいちょう类中てき同名どうめい方法ほうほうthisContextゆびたたえとうまえてきかつ动记录。

うちけんてき语言构造ただゆう消息しょうそく发送、赋值、方法ほうほうかえしかいかずぼう些对ぞうてき文字もじ语法。从它最初さいしょさく为给所有しょゆうねん龄儿わらわてき语言开始,标准てきSmalltalk语法以更ぞうえい语,而非主流しゅりゅう编码语言てき方式ほうしき使用しよう标点符号ふごう。语言あまり下部かぶ份,包括ほうかつよう条件じょうけんもとめ值和迭代てきひかえせい结构,みやこゆかり标准Smalltalk类库实现ざいないけん构造うえ性能せいのうじょうてき原因げんいん,实现以识别并特殊とくしゅ处理ぼう些这种消いきただし这只优化而并硬性こうせい规定にゅう语言语法。

谚语“Smalltalk语法适合いち明信あきのぶへん”,しょひさげ及的Ralph JohnsonえいRalph Johnson (computer scientist)てき一个代码片段,展示てんじりょう一个方法的所有基本标准语法元素[16]

exampleWithNumber: x
  | y |
  true & false not & (nil isNil) ifFalse: [self halt].
  y := self size + super size.
  #($a #a 'a' 1 1.0)
    do: [ :each |
      Transcript 
        show: (each class name);
        show: (each printString);
        show: ' ' ].
  ^x < y

文字もじ

[编辑]

しもれつれい诠释りょうさい常用じょうようてき对象,以在Smalltalk-80方法ほうほうちゅううつし文字もじえいLiteral (computer programming)值。

かず和字わじ

[编辑]

しもれつすうてきぼう可能かのうれい

42
-42
123.45
1.2345e2
2r10010010
16rA000

さいきさき两个项目ぶん别是二进制和十六进制数。ざいrまえてきすうそこすうある基数きすう基数きすう必须てき幂;れい36rSMALLTALK一个有效的数值,とう价于じゅう进制てき80738163270632

书写时带ゆうぜん导的もと

$A

くし

[编辑]

くしつつみ围在单引ごう内的ないてき序列じょれつ

'Hello, world!'

ようざい一个字符串中包括一个引号,使用しよう另一个引ごうらい转义

'I said, ''Hello, world!'' to them.'

そう引号需要じゅよう转义,いん为单引号かいていくし

'I said, "Hello, world!" to them.'

两个相等そうとうてきくしくし相等そうとう,如果它们包含ほうがん完全かんぜんしょうどうてき以是驻留ざいないそん不同ふどう位置いちちゅうてき不同ふどう对象。

符号ふごう

[编辑]

じょりょうくし,Smalltalkゆういち类叫做符号ふごうえいSymbol (programming)Symbolてき序列じょれつ对象。符号ふごう证是唯一ゆいいつてきぼつ有作ゆうさく为不どう对象てき两个相等そうとうてき符号ふごうよし此,符号ふごう非常ひじょうえき于比较,并经常用じょうよう于语げん构造ちゅう如用さく消息しょうそく选择

符号ふごううつし#跟随くし文字もじえいstring literal如:

#'foo'

如果一个序列不包含空白或标点字符,还可以写为:

#foo

かず

[编辑]

れい如定义了四个整数的一个数组:

#(1 2 3 4)

很多实现支持しじれつ节数组(ByteArrayてき文字もじ语法,れい如定义了四个整数的字节数组:

#[1 2 3 4]

其他

[编辑]

さいきさき重要じゅうようてき块(匿名とくめい函数かんすう文字もじ):

[... いち些smalltalkだい ...]

很多Smalltalk方言ほうげん为其对象实现りょう额外てき语法,ただし上述じょうじゅつてき所有しょゆう方言ほうげんほん质上支持しじてき

变量声明せいめい

[编辑]

ざいかく种Smalltalkちゅう共同きょうどう使用しようてきゆう两种变量:实例变量临时变量。其他变量かずゆう关术语依赖于特定とくてい实现,れいVisualWorksえいVisualWorksゆう类共とおる变量和名わみょうそら间共とおる变量,而Squeakかず很多其他实现,ゆう类变りょういけ变量全局ぜんきょく变量。

ざいSmalltalkちゅう临时变量声明せいめいざい方法ほうほう(见后)ない声明せいめいてき变量。它们声明せいめいざい方法ほうほうてき顶部,さく为由竖杠つつみ围的そらかくぶんへだたてき名字みょうじれい如:

| index |

声明せいめい一个临时变量名叫index包含ほうがんはつはじめnil

个变りょう以在いち组竖ゆずりはない声明せいめい

| index vowels |

声明せいめいりょう两个变量:indexvowels所有しょゆう变量ようはつはじめくしてき索引さくいん变量,はつはじめnullあるはつはじめ0てきByteArray,此外てき所有しょゆう变量はつはじめnil

命名めいめい约定,实例变量、临时变量、方法ほうほうある块的さんすう,应当以小写字しゃじはは开头,指示しじ它们具有ぐゆう私有しゆう作用さよういき,它们あいしょう为局变量。而全きょく变量、类变りょういけ字典じてん、类名字みょうじ,应当以大写字しゃじはは开头,它们あいしょう为共とおる变量。

赋值

[编辑]

变量どおり:=语法らい指定していいち个值。如:

vowels := 'aeiou'

指定していくし'aeiou'いたり前面ぜんめん声明せいめいてきvowels变量。这个くし个对ぞうざい单引ごう间的序列じょれつ文字もじくしてき语法),ざい编译时间よし编译创建。

ざい最初さいしょてきParc Place映像えいぞうちゅう,现在划线(_てき字形じけいざい时是ひだりこう头(字形じけい(就像1963ねん版本はんぽんASCIIだい码中样)。Smalltalk最初さいしょ接受せつじゅひだりこう头,さく为唯いちてき赋值さん。一些现代代码仍然包含充当赋值的下划线,かい让人想起そうき这种最初さいしょてき用法ようほう多数たすう现代てきSmalltalk实现接受せつじゅよう么下划线,よう么冒ごう等号とうごう语法。

消息しょうそく

[编辑]

消息しょうそくSmalltalkちゅうさいもと础的语言构造。所有しょゆうひかえせい结构实现为消息しょうそく发送。Smalltalkかけしょうてきさいよう动态分派ぶんぱ单一分派ぶんぱ策略さくりゃく,这是しょう对于其他一些面向对象语言使用的分派ぶんぱ而言てき

一元いちげん消息しょうそく

[编辑]

しもれつれい发送消息しょうそくfactorialいたりすう42

42 factorial

ざい这种じょう况下,42さけべ做这个消いきてき接收せっしゅうしゃ”,而factorial消息しょうそくてき选择接收せっしゅうしゃどおり过返かい一个值来相应这个消息(这个じょうがたちゅう42てき阶乘)。どう其他事物じぶついち样,消息しょうそくてき结果以赋值给いち个变りょう

aRatherBigNumber := 42 factorial

上面うわつらてきfactorial一元いちげん消息しょうそくいん为只わたる及了いち个对ぞうそく接收せっしゅうしゃ

关键消息しょうそく

[编辑]

消息しょうそく以承载额外的がいてき对象さく为实际参すう如:

2 raisedTo: 4

ざい这个ひょう达式ちゅうわたる及了两个变量:2さく接收せっしゅうしゃ4さく为消いきてき实际さんすう消息しょうそく结果,あるようSmalltalkてき说法,回答かいとう认定为16。这种消息しょうそくさけべ做“关键消息しょうそく消息しょうそく以有个实际参すう使用しよう如下语法:

'hello world' indexOf: $o startingAt: 6

它的回答かいとうざい接收せっしゅうしゃくしちゅうoてき索引さくいん,从索引さくいん6开始查找。这个消息しょうそくてき选择indexOf:startingAt:,构成两个份或关键

这种关键实际さんすうてき交织图改进代码的读性,いん为实际参すうゆかりぜん导于它们てき关键らいかい释。れい如,よう建立こんりゅう一个矩形的表达式使用C++あるJava类语ほう以写为:

new Rectangle(100, 200);

清楚せいそ这些实际さんすうふん别是什么。あずかこれ相反あいはんざいSmalltalkちゅう,这个だい码可以写为:

Rectangle width: 100 height: 200

这个じょう况下接收せっしゅうしゃRectangle类,回答かいとう这个类的具有ぐゆう指定してい宽度高度こうどてきいち个实れい

二元にげん消息しょうそく

[编辑]

さいきさき多数たすう特殊とくしゅ字母じぼ以被用作ようさくしょ谓的“二元にげん消息しょうそく”。这些まこと许了数学すうがく逻辑さん以传统形しき书写:

3 + 4

它发送消息しょうそく+接收せっしゅうしゃ3具有ぐゆう4さく为实际参すう传递(回答かいとうはたこれ7)。类似てき

3 > 4

はた消息しょうそく>发送给3具有ぐゆう实际さんすう4回答かいとうはたこれfalse)。

注意ちゅうい,Smalltalk-80语言自身じしん包含ほうがん这些さんてき含义。上述じょうじゅつてき结果,ただ这些消息しょうそくてき接收せっしゅうしゃ(这里すう值实れい),为了响应消息しょうそく+>而定义并かえしかいてき。这个つくえせいてき副作用ふくさよう运算じゅう消息しょうそく>以被其他对象しょ理解りかいまこと使用しようがたa > bまとひょう达式らい较它们。

おもて达式

[编辑]

一元消息可以一个接一个的写成方法ほうほう链式调用

3 factorial factorial log

它发おくfactorialいた3接着せっちゃく发送factorialいた前面ぜんめんてき结果6接着せっちゃく发送logいた前面ぜんめんてき结果720,产生さい终的结果2.85733

一个表达式可以包括多次消息发送。ざい这个じょう况下,おもて达式すえ一个简单的优先级次序来分析。一元消息有最高的优先级,ずいきさきげん消息しょうそくさいきさき关键消息しょうそくれい如:

3 factorial + 4 factorial between: 10 and: 100

もとめ值如

  1. 3接收せっしゅう消息しょうそくfactorial回答かいとう6
  2. 4接收せっしゅう消息しょうそくfactorial回答かいとう24
  3. 6接收せっしゅう消息しょうそく+具有ぐゆう24さく为实际参すう回答かいとう30
  4. 30接收せっしゅう消息しょうそくbetween:and:具有ぐゆう10100さく为实际参すう回答かいとうtrue

さいきさきてき消息しょうそく发送てき回答かいとうせい个表达式てき结果。

组合

[编辑]

ざい需要じゅようてき时候使用しよう圆括ごう以改变求值的次序じじょれい如:

(3 factorial + 4) factorial between: 10 and: 100

はたあらため变表达式含义,しゅさき计算3 factorial + 4产生10接着せっちゃく10接收せっしゅうだいfactorial消息しょうそく,产生36288003628800接着せっちゃく接收せっしゅうbetween:and:回答かいとうfalse

注意ちゅういよしげん消息しょうそくてき含义,硬性こうせい规定にゅうSmalltalk-80语法てき,它们全部ぜんぶ认为ゆう相等そうとうてき优先级,并简单的从左いたりみぎらいもとめ值。よし此,使用しようげん消息しょうそくてきSmalltalkひょう达式てき含义,可能かのう不同ふどう于传统释义:

3 + 4 * 5

もとめ值为(3 + 4) * 5,产生35よういた预期回答かいとう23,必须使用しよう圆括ごうらい显式てきてい义运さん次序じじょ

3 + (4 * 5)

复合

[编辑]

以点ごうぶんへだたてき表示ひょうじしき按顺じょ执行。注意ちゅういざい量定りょうてい义和ずいきさきてきひょう达式间没ゆうてんごう。一个表达式序列的值,さいきさきてきひょう达式てき值。じょりょうさいきさきてきひょう达式そと所有しょゆうてきひょう达式てき值都ゆるがせりゃく注意ちゅういてんごうぶんへだた而并终结いん此最终的てんごう选的。

しもれつ假想かそうれい子中こなか,书写りょういち序列じょれつてきひょう达式,まい个都ようてんごうぶんへだた。这个れいくびさき建立こんりゅうWindowてきいち个新实例,そん储它ざいいち个变りょうちゅう接着せっちゃくこう它发送两个消息しょうそく

| window |
window := Window new.
window label: 'Hello'.
window open

级联

[编辑]

如果ぞう上述じょうじゅつれい这样,はた一序列消息都发送给相同的接收者,它们也可以写为方法ほうほう级联调用具有ぐゆうようぶんごうぶんへだたてき单独消息しょうそく

Window new
  label: 'Hello';
  open

这种はた前面ぜんめんれいてきおもしん为一个单一表达式,避免りょう对将しんまどこうそん储在临时变量てき需要じゅようすえ平常へいじょうてき优先级规则,しゅさきむこうWindow类发送いちげん消息しょうそくnew接着せっちゃくむかいnew回答かいとうてき个对ぞう,发送label:open

使用しようyourself消息しょうそくらいかえしかい一个级联消息的接收者。

だい码块

[编辑]

これ头等对象だい码块そく匿名とくめい函数かんすう以被ひょう达一个文字もじ值(它是いち个对ぞういん所有しょゆう值都对象)。这是どおり过方くくごう达成てき

[ :params | <消息しょうそくひょう达式> ]

这里てき:paramsだい码可以接受せつじゅてき形式けいしきさんすうてきれつひょう。结果てき块对ぞう形成けいせいいち闭包:它可以在任ざいにんなん时间访问它外围的词法作用さよう域内いきないてき变量。这意味いみれつSmalltalkだい码:

[:x | x + 1]

理解りかい为:あるようλらむだ演算えんざんおもて达为: :

块可以通过发送给它们value消息しょうそくらい执行。块有いち个参すうようvalue:ゆう2个参すう使用しようvalue:value:,以此类推ちょくいた4个参すう,对多于4个参すう使用しようvalueWithArguments:并将さんすうさく为数组传递。れい如下めんてきひょう达式:

[:x | x + 1] value: 3

以被もとめ值为:あるようλらむだ演算えんざんひょう达为:

块返かいつねしょう回答かいとう)其主体しゅたいてきさいきさき一个表达式的值,じょゆういち个由显式てき^指示しじてきかえしかい,这时かえしかい这个かえしかいひょう达式てき值。ざい内部ないぶてきかえしかい充当じゅうとうりょういち种逃(escape)つくえせいざい一个嵌套的块表达中的返回表达式,はた终止ざい字面じめん上包うわづつみ围的方法ほうほう

块的文字もじ表示ひょうじいち种创しん,它一方面允许特定代码有更重大的可读性;它允许涉及迭だいてき算法さんぽう一更清晰和简洁的方式编码。典型てんけいてきざいぼう些语ごとちゅう使用しよう循环うつしなりてきだい码,以在Smalltalkちゅう使用しよう块简洁的书写,ゆう时在单一いちぎょうこれないさら重要じゅうようてき,块允许使用しよう消息しょうそくらいひょう达控せい结构,いん为块推延りょう计算,而多态可以用らい选择交替こうたいしゃ(alternative)。所以ゆえんざいSmalltalk 80ちゅうif…then…else书写实现为:

expr ifTrue: [ expr为真时求值的语句 ] ifFalse: [ expr为假时求值的语句 ]

さいいちれいこう一个搜集发送消息select:

positiveAmounts := allAmounts select: [:anAmount | anAmount isPositive]

注意ちゅうい这与函数かんすうしき编程ゆう关,这里てき计算しき抽象ちゅうしょうなりりょうこう阶函すうselect:とう价于ざいいち个适とうてきはこうえてきだか阶函すうfilter[17]

ひかえせい结构

[编辑]

ざいSmalltalkちゅうひかえせい结构ぼつゆう特殊とくしゅてき语法。它们转而实现为发おくいた对象じょうてき消息しょうそく。以条件じょうけん执行为例,ぬの尔类Booleanてい义了ifTrue:ifFalse:ifTrue:ifFalse:ifFalse:ifTrue:方法ほうほう如向一个布尔对象,发送ifTrue:消息しょうそく,并传递一个代码块作为实际参数,这个块被执行とう且仅とうぬの接收せっしゅうしゃ为真。下面かめんよういち个例子来こらい展示てんじ

result := a > b
  ifTrue: [ 'greater' ]
  ifFalse: [ 'less or equal' ]

块也もちいらい实现,よう户定义控せい结构、まい举器访问しゃ异常处理插拔てきぎょう为和很多其他しき

迭代

[编辑]

下面かめんれい,从一个字くしちゅう过滤其中しょ含有がんゆうてきもとおと

| aString vowels |
aString := 'This is a string'.
vowels := aString select: [:aCharacter | aCharacter isVowel].

ざいさいきさきいちぎょうこうくし对象aString发送いちselect:消息しょうそく,它具有ぐゆういち个代码块[:aCharacter | aCharacter isVowel]さく为实际参すう。这个だい码块,表示ひょうじいち个测试,だい码块文字もじはた用作ようさくいち个谓词函すう,它回答かいとうtrueとう且仅とう这个くしてきいち元素げんそaCharacter,应当包括ほうかつざい满足这个测试てきさがせしゅうなか

くしString响应select:消息しょうそくよう调用てきselect:方法ほうほうてい义并实现ざいさがせしゅうCollectionなか[18];它将给select:てき实际さんすう选择块,传送给形しきさんすうaBlockしかきさきはた绑定りょう选择块的aBlock嵌入かんにゅういた迭代块的だい码之ちゅうさい这个迭代块作为向くし自身じしん发送てきdo:消息しょうそくてき实际さんすう,从而はた这个くししょ包含ほうがんてきまい个字さく为实际参すう传送给这个迭だい块,而各做いちもとめ值。ざいもとめ值迭だい块的时候,つうvalue:消息しょうそくはた迭代元素げんそ传送给aBlockところ绑定てき选择块,它回答かいとういち个布尔值;接着せっちゃくこう它发おくifTrue:消息しょうそく,如果这个ぬの尔值对象true,则将这个增加ぞうかいたようかえしかいてきくしちゅう

くしString响应do:消息しょうそくよう调用てきdo:方法ほうほうてい义在迭代类Iterableなか[19],而实现在序列じょれつさがせしゅうSequenceableCollectionなか[20],这个类是Iterable类的类和String类的ちょう类。

异常处理

[编辑]

Smalltalkてき异常处理つくえせいException类及其子类比如Error类,类似于CLOSてき异常处理样式,使用しよう块作为处

[ いち些运さん. 
  Error signal: 'an error occurred'.
  另一些运さん
] on: Error do: [ :ex | 
  处理だい. 
  ex return ]

异常处理てきex实际さんすう提供ていきょう对挂おこり运算てきじょう态的访问,如它てき栈帧、くだりごう接收せっしゅうしゃ实际さん数等すうとう,并且どおり过发おくex proceedex rejectex restartあるex returnこれいち,还可ようらいひかえせい计算怎样继续。

[编辑]

类通过实れい量定りょうてい义它てき实例てき结构,つう过方法定ほうてい义它てき实例てきぎょう为。まい方法ほうほうゆうさけべ做选择子てきいち名字みょうじ,它在这个类之ない唯一ゆいいつ性的せいてき

てい

[编辑]

下面かめん平凡へいぼんてき类定义[21]

Object subclass: #MessagePublisher
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
  category: 'Smalltalk Examples'

多数たすう这种てい义经つねよし编程环境らいはまたかし。这里てき类定义是给Object类的いち个消いきようらい建立こんりゅう它叫做MessagePublisherてきいち个子类。

ざいSmalltalkちゅう类是头等对象,它可以就ぞうにんなん其他对象いち接收せっしゅう消息しょうそく,并可以在执行时间动态てき创建。Object类在おさむいた这个subclass:instanceVariableNames:classVariableNames:poolDictionaries:category:消息しょうそく时,はら则上くびさきざいもとObject classちゅう查找对应方法ほうほうはて而上さかのぼ继承链在其超类Class类中找到对应方法ほうほう实现。

ざいSmalltalkちゅう实例变量えいInstance variable这个实例てき私有しゆう变量,它可以在てい义它们的类的にんなん实例方法ほうほうちゅう,还有ざい它的类中てい义的方法ほうほうちゅうつう名字みょうじらい访问。ざい需要じゅよう于一个类てき所有しょゆう实例、这个类本身ほんみ它的类之间,きょうとおるぼう个数すえてき时候,よう使用しよう类变りょうえいClass variable,它是よし这个类和它的所有しょゆう实例どもとおるてき私有しゆう变量。いけ变量ざい以没ゆう继承关联てき个类间共とおるてき变量。いけ变量最初さいしょそん储在字典じてんちゅう,现在它们应当てい义为专门てき类(SharedPoolてき类)てき类变りょう

category指示しじゆう关的类的“ぐん组”,ざい现代Smalltalk版本はんぽんPharoちゅうがえだいpackageつつみけい统是利用りよう简单てき命名めいめい约定,组织SqueakPharoみなもとだい码的简单而轻りょう级的方式ほうしき

ざい一个类所对应的もとちゅうてい义的实例变量さけべ做类实例变量,まい个类ゆう自己じこ私有しゆうてき类实れい变量,类将继承这些类实れい变量,ただし类会拥有这些变量てき它们自己じこてき私有しゆう复本,类和它们てき类不ぶんとおる类实れい变量。れい如,以定义一个类实例变量叫做countらい跟踪一个给定的类有多少实例。

不能ふのう直接ちょくせつ访问它的实例てき实例变量,而实れい不能ふのう访问它们てき类的类实れい变量。如果需要じゅようてき话必须定义变异あずか访问

方法ほうほう

[编辑]

とう一个对象接收到一个消息的时候,调用ひきはい这个消息しょうそく名字みょうじてきいち个方ほう所有しょゆう方法ほうほうこう开的きょてき(也就动态查找まと)。方法ほうほうぶん组入指示しじ它们图的协议(protocol)これちゅう

为一个类增加方法涉及到Behavior类,其中てきcompile:方法ほうほう,编译一个方法源代码并返回一个CompiledMethod类的实例;addSelector:withMethod:方法ほうほうはた给定てき一个编译过的方法增加到方法字典中。ざいBehavior类的ClassDescription类中,compile:classified:方法ほうほう,编译一个方法的源代码,并为这个方法ほうほうゆびじょう给定てき归类(对于方法ほうほうしょう为协议)。

对象负责ざい运行时间动态てき确定,执行哪个方法ほうほうらい响应いち个消いきつきかんざい很多语言ちゅう,这可能かのうゆう时或总是)ざい编译时间せい态确じょうてきした列代れつだい码定义一个方ほうpublish,并且这个てい义将ざい这个对象おさむいたpublish消息しょうそくてき时候发生。

publish
  Transcript show: 'Hello World!'

しもれつ名字みょうじ#quadMultiply:and:てき方法ほうほうえんじしめせりょう接收せっしゅう个实际参すう并返かいいち个值:

quadMultiply: i1 and: i2
  "这个方法ほうほうはた给定てき两个すう相乘そうじょう并对结果じょう以4."
  | mul |
  mul := i1 * i2.
  ^mul * 4

执行にんなんぜん导了^脱字だつじあるてきひょう达式,导致这个方法ほうほう于这いちてん退出たいしゅつ,并返かい这个ひょう达式てき值。终止而没ゆう显式かえしかいぼう个表达式てきいち个方ほうはた隐含てきかえしかい自身じしん

实例

[编辑]

为一个类新建一个实例,要用ようよういたnew方法ほうほう,它定义在Behavior类中。したれつれいだい码:

MessagePublisher new

建立こんりゅう并返かいMessagePublisher类的いち个新实例。它典がたてきかい赋值到いち个变りょう

publisher := MessagePublisher new

ただし是也これや以向一个临时的匿名对象发送一个消息:

MessagePublisher new publish

类方ほう

[编辑]

类方ほう就是ざいいち个类てきもとちゅうてい义的方法ほうほう

如搜しゅうCollectionてき类方ほうちゅう,实例创建方法ほうほうゆうwith:with:with:[22]いちちょくいたwith:with:with:with:with:with:方法ほうほうざい下面かめんてきれい子中こなかはたwith:with:よう于有じょさがせしゅうOrderedCollection,它是SequenceableCollection类的类,而能さい终上さかのぼいたりちょう类搜しゅう类:

| rectangles aPoint collisions |
rectangles := OrderedCollection
  with: (Rectangle left: 0 right: 10 top: 100 bottom: 200)
  with: (Rectangle left: 10 right: 10 top: 110 bottom: 210).
aPoint := Point x: 20 y: 20.
collisions := rectangles select: [:aRect | aRect containsPoint: aPoint].

反射はんしゃ

[编辑]

反射はんしゃ一个计算机科学术语,适用于有能力のうりょく检查它们自己じこてき结构てき软件ほどじょれい如检查它们的分析ぶんせきある输入输出さんすうてきかずすえ类型反射はんしゃ动态、交互こうごしき语言如SmalltalkLispてきいち个特せい具有ぐゆう反射はんしゃてき交互こうごしきほどじょよう么解释的よう么编译的)维护所有しょゆうないそんない对象てきじょう态,包括ほうかつだい码对ぞう自身じしん,这是ざい解析かいせき/编译生成せいせいてき,并且ざい编程じょう访问かずおさむあらためてき

反射はんしゃ也是Smalltalk这种有元ありもと模型もけいてき语言てきいち个特せいもと模型もけい描述这个语言てき模型もけい,开发しゃ使用しようもと模型もけいらい做事,如游历、检查かずおさむあらため一个对象的分析树,ある找到特定とくてい种类てき结构てき所有しょゆう实例(れい如在もと模型もけいちゅうMethod类的所有しょゆう实例)。

Smalltalk-80完全かんぜんてき反射はんしゃしきけい统,ようSmalltalk-80语言实现。Smalltalk-80提供ていきょうりょう结构せい计算せい反射はんしゃしゃ。Smalltalk结构せい反射はんしゃしきけい统,其结构是ゆかりSmalltalk-80对象てい义的。てい义这个系统的类和方法ほうほう也是对象,并且完全かんぜん它们所有しょゆう助力じょりょくてい义的けい统的一部いちぶ份。Smalltalk编译将文まさふみ本源ほんげんだい码编译成方法ほうほう对象,典型てんけいてきCompiledMethodてき实例。つう过把它们そん储入いち个类てき方法ほうほう字典じてん,而增加ぞうかいた这个类。类层级的てい义类てき份,以向けい增加ぞうかしん类。这个けい统是どおり过运ぎょう建立こんりゅうあるてい义类方法ほうほうてきSmalltalk-80だい码来扩展てき。Smalltalk-80けい统是个现场(living)けい统,うけたまわ载着ざい运行时间扩展自身じしんてき能力のうりょく

いん为类对象,以向它们ひさげ问比如:“你实现了哪些方法ほうほう?”ある“你定义了什么だん/ふね/实例变量?”。所以ゆえんどおり过能应用于系统中てきにんなん对象てき普通ふつうてきだい码,对象以轻えきてき检查、复制、(序列じょれつ,诸如此类[23]

Smalltalk-80还提供ていきょう计算せい反射はんしゃ有能ゆうのうりょく观察けい统的计算じょう态。ざい派生はせい最初さいしょSmalltalk-80てき语言ちゅう,一个方法的当前活动(activation),以作为通过伪变量命名めいめいてき一个对象来访问,这个伪变りょうさく为六个保留字之一的thisContextつう过发送消息しょうそくいたりthisContext,一个方法活动可以提问比如:“谁给你发送りょう这个消息しょうそく?”。这些设施使とくゆう可能かのう实现协程ある类似Prologてきかいさかのぼ,而不需要じゅようおさむあらためきょ拟机。异常けい统也使用しよう这个设施实现てき。这个设施さらゆうおもむきてき用法ようほういちざいSeasideえいSeaside (software) webかまちなか,它通过为ごと个编辑的页面そん续体,并在它们间切换来导航いち个web站点,缓解りょう编程しゃ处理Web浏览てきかえしかい按钮てき复杂せい使用しようSeaside编程webふく务器,以使ようさらつね规的编程风格らい完成かんせい[24]

Smalltalk如何いか使用しよう反射はんしゃてきいち个例处理错误てきつくえせいとう一个对象被发送了一个它没有实现的消息的时候,きょ拟机发送给这个对ぞうdoesNotUnderstand:消息しょうそく具有ぐゆう这个消息しょうそくてき实化さく为实际参すう。这个消息しょうそく(它是另一个对ぞうMessageてき实例),包含ほうがん这个消息しょうそくてき选择它的实际さんすうてきいちArrayざい交互こうごしきSmalltalkけい统中,doesNotUnderstand:てきかけしょう实现,开一个错误窗こういちNotifierむかいよう户报つげ错误。つう过它反射はんしゃ设施,よう户可以检查错误在其中发生てき上下じょうげぶんじゅう新定しんじょう义犯错的だい码,并继续,这一切都在这个系统之中,使用しようSmalltalk-80てき反射はんしゃ设施[25][26]

つう建立こんりゅうただ理解りかい(实现)doesNotUnderstand:てきいち个类,建立こんりゅういち个实れい,经由它的doesNotUnderstand:方法ほうほうのう拦截发送给它てきにんなん消息しょうそく。这种实例以叫做透明とうめい代理だいり(proxy)[27]使用しよう这种代理だいりらい实现很多设施,分布ぶんぷしきSmalltalk,这里てき消息しょうそくざい个Smalltalkけい统之间交换,すうすえ库接こう,这里てき对象透明とうめいてき从数すえ库中排除はいじょ错误,还有promiseひとし分布ぶんぷしきSmalltalkてき设计かげ响了如CORBA这样てきけい统。

もと于映ぞうてき持久じきゅうそん

[编辑]

多数たすう流行りゅうこうてき编程けい统,はたしずか态的ほどじょだい码(以类てい义、函数かんすうある过程てき形式けいしき),ふん离于动态てきある运行时间てきほどじょじょう态(如对かたどある其他形式けいしきてきほどじょすうすえ)。它们ざいほどじょ启动てき时候そう载程じょだい码,而任なんさきまえてきほどじょじょう态必须从配置はいちぶんけんある其他すうすえげん显式てきおもしん建立こんりゅうほどじょ编程しゃ显式保存ほぞんてき设置,ざい每次まいじじゅう启时必须さいつぎ设立。传统てきほどじょざい每次まいじほどじょ保存ほぞんいち个文けん退出たいしゅつ和重かずえ载的时候,还失很多有用ゆうようてきぶん档信いき。这会しつ细节如回退すさ历史あるひかり位置いちもと于映ぞうてきけい统不かいいん为计さんつくえ关闭あるOS更新こうしん,而强制きょうせいしつ所有しょゆう这些东西。

ただし很多Smalltalkけい统,区分くぶんほどじょすうすえ(对象)和代かずよ码(类)。こと实上,类也对象。よし此,多数たすうSmalltalkけい统,そん储整个程じょじょう态(包括ほうかつ类和类对象二しょうじしゃざいいち映像えいぞうえいsystem imageぶんけんなか。这个映像えいぞう接着せっちゃくよしSmalltalkきょ拟机そう载,はた类Smalltalkけい统恢复成さきまえてきじょう[28]。这是受到りょうFLEXてき启发,它是Alan Kay创建てき语言并描じゅつ于他てき科学かがく硕士毕业论文ちゅう[29]

Smalltalk映像えいぞう类似于(じゅう启的)核心かくしん转储,并可以提供与きょうよ核心かくしん转储しょうどうてきこうのう如延迟或远程调试,具有ぐゆう对出错时こくてきほどじょじょう态的完全かんぜん访问。はた应用だい码建为某种形しきてきすうすえてき其他语言Lisp,也经つね使用しようもと于映ぞうてき持久じきゅうそん储。这种持久じきゅうそん储的方法ほうほう,对于快速かいそく开发强力きょうりょくてきいん所有しょゆう开发しんいき如程じょてき解析かいせき树),保存ほぞん利用りよう于调试。ただし它作为一个真实的持久存储机制,也有やゆういち个严じゅうてき缺点けってんくびさき,开发しゃ可能かのう经常おもえよう隐藏实现细节,并使它们ざい运行时间不可ふか获得。法律ほうりつ维护てき原因げんいんまこと许任何人なんにんざい运行时间おさむあらためほどじょ,对于ざい运行时间环境暴露ばくろげんだい码的编译きさきてきけい统,不可避ふかひめんてき介入かいにゅう复杂せい潜在せんざいてき错误。其次,つきかん持久じきゅうそん储机せいえき使用しよう,它缺乏けつぼう多数たすう多用たよう户系统需要じゅようてき真正しんせい持久じきゅうそん储能りょくさいあかり显的进行どう个用户并ぎょう访问しょうどうまとすうすえ库的ごと[30]

实现れつひょう

[编辑]

OpenSmaltalk

[编辑]

OpenSmaltalk VM(OS VM)Smalltalk运行时环さかいてき著名ちょめい实现,很多现代Smalltalk VMもと于或派生はせい[31]。OS VM自身じしん从一组Smalltalkげんだい码文けん(它们さけべ做VMMaker),转译なり原生げんせいC语言げんだい码(つう使用しようさけべ做Slangてき转译[32][33]),它依さい针对特定とくてい平台ひらだいかずかたけん构来编译,实际じょう确使Smalltalk映像えいぞうてきまたが平台ひらだい执行。みなもとだい码可以在GitHubじょう获得并在MIT许可证しも发布。OS VMてき知名ちめい派生はせいしゃゆう

  • Squeakいち个开げんSmalltalk。
  • Pharo Smalltalk,いち个开げんまたが平台ひらだい语言。
  • Croquet VM,Croquet OSてきいち个与Squeakゆう关的Smalltalk VM。
  • Cuis-Smalltalkf[34]いち个开げんてき小型こがた、简洁适用てきSmalltalk。
  • Haver-Smalltalk[35],Cuisてき具有ぐゆうかんせい块系统的扩展。

JavaScript VM

[编辑]
  • PharoJS[36],一个开源的从SmalltalkいたJavascriptてき转译,扩展りょうPharo环境。
  • SqueakJS[37]よう于webてきいち个OpenSmalltalkけんようてきVM,还能运行ろうきゅうてきSqueak应用如EtoysえいEtoys (programming language)あるScratch

其他

[编辑]

まいり

[编辑]

引用いんよう

[编辑]
  1. ^ https://wiki.squeak.org/squeak/172.
  2. ^ Alto I Schematics (PDF). Bitsavers: 54. [21 July 2016]. (原始げんし内容ないよう (PDF)そん档于2021-02-24). 
  3. ^ History of Computers and Computing, Birth of the modern computer, Personal computer, Xerox Alto. [2016-04-19]. (原始げんし内容ないようそん档于2020-12-05). 
  4. ^ 4.0 4.1 4.2 4.3 4.4 4.5 4.6 4.7 Kay, Alan; Stefan Ram. E-Mail of 2003-07-23. Dr. Alan Kay on the Meaning of “Object-Oriented Programming”. 2003-07-23 [2009-01-03]. (原始げんし内容ないようそん于2020-09-16). 
  5. ^ 5.0 5.1 Alan Kay. The Early History of Smalltalk. 1993 [2021-03-06]. doi:10.1145/155360.155364. (原始げんし内容ないようそん档于2011-04-29). What Sketchpad called masters and instances, Simula called activities and processes. Moreover, Simula was a procedural language for controlling Sketchpad-like objects, thus having considerably more flexibility than constraints (though at some cost in elegance) ……. ……
    This Smalltalk language (today labeled -71) was very influenced by FLEXえいFlex (programming language), PLANNERえいPlanner (programming language), LOGO, META IIえいMETA II, and my own derivatives from them. ……
    One of the styles retained from Smalltalk-71 was the comingling of function and class ideas. In other works, Smalltalk-72 classes looked like and could be used as functions, but it was easy to produce an instance (a kind of closure) by using the object ISNEW. ……
    Overlapping windows were the first project tackled (With Diana Merry) after writing the code to read the keyboard and create a string of text. ……
    One of the next classes to be implemented on the Interim Dynabook (after the basics of numbers, strings, etc.) was an object-oriented version of the LOGO turtle implemented by Ted. ……
    Our early “LISP-pair” definition is an example of an abstract data type because it preserves the “field access” and “field rebinding” that is the hallmark of a data structure. …… What I got from Simula was that you could now replace bindings and assignment with goals. ……
    Where does the special efficiency of object-oriented design come from? …… Four techniques used together – persistent state, polymorphism, instantiation, and methods-as-goals for the object – account for much of the power. None of these require an “object-oriented language” to be employed – ALGOL 68 can almost be turned to this style – and OOPL merely focuses the designer’s mind in a particular fruitful direction. ……
    Simula-I had neither classes as objects nor inheritance. Simula-67 added the latter as a generalization to the ALGOL-60 <block> structure. ……
    On the other hand, since things can be done with a dynamic language that the difficult with a statically compiled one, I just decided to leave inhertance out as a feature in Smalltalk-72, knowing that we could simulate it back using Smalltalk’s LISPlike flexibility. ……
    By the time Smalltalk-76 cam along, Dan Ingalis had come up with a scheme that was Simula-like in its semantics but could be incrementally changed on the fly to be in accord with our goals of close interaction.
     
  6. ^ Where Did Refactoring Come From?. sourcemaking.com. [17 December 2013]. (原始げんし内容ないようそん档于2016-03-31). 
  7. ^ Carl HewittえいCarl Hewitt; Peter Bishop, Richard Steiger. A Universal Modular Actor Formalism for Artificial Intelligence (PDF). IJCAI. 1973 [2022-04-11]. (原始げんし内容ないよう (PDF)そん档于2021-02-25). Alan Kay whose FLEX and SMALLTALK machines have influenced our work. Alan emphasized the crucial importance of using intentional definitions of data structures and of passing messages to them. This paper explores the consequences of generalizing the message mechanism of SMALLTALK and SIMULA-67; ……. 
  8. ^ Learning Research Group. How To Use the Smalltalk-76 System (PDF) (报告). Xerox Palo Alto Research Center. October 1979 [2022-03-12]. (原始げんし内容ないよう (PDF)そん档于2022-04-12). To define a new class, select a class category in the first pane of the browse window. This selection specifies the category to which the new class will be added, and causes a template to appear in the largest pane of the browse window, the code pane. ……
    The template presented in the code pane looks as follows
        Class new title: ’NameofClass’
        subclassof: Object
        fields: ’names of fields’
        declare: ’names of class variables’
     
  9. ^ Alan Kay. The Early History of Smalltalk. [2021-03-06]. (原始げんし内容ないようそん档于2011-04-29). The most puzzling strange idea – at least to me as a new outsider – was the introduction of metaclasses (really just to make instance initialization a little easier – a very minor improvement over what Smalltalk-76 did quite reasonably already).
    Peter’s 1989 comment is typical and true: “metaclasses have proven confusing to many users, and perhaps in the balance more confusing than valuable.” In fact, in their PIE system, Goldstein and Bobrow had already implemented in Smalltalk on “observer language”, somewhat following the view-oriented approach Ihad been advocating and in some ways like the “perspectives” proposed in KRL [Goldstein *].
    Once one can view an instance via multiple perspectives even “sem-metaclasses” like Class Class and Class Object are not really necessary since the object-role and instance-of-a-class-role are just different views and it is easy to deal with life-history issues includeding instantiation. This was there for the taking (along with quite a few other good ideas), but it wsn’t adopted. My guess is that Smalltalk had moved into the final phase I memntioned at the beginning of this story, in which a way of doing things finally gets canonized into an inflexible belief structure.
     
  10. ^ 10.0 10.1 Smalltalk-80 v2 image. [2022-02-16]. (原始げんし内容ないようそん档于2022-03-20). 
  11. ^ Draft American National Standard for Information Systems - Programming Languages - Smalltalk (PDF). squeak.org. [2022-02-09]. (原始げんし内容ないよう (PDF)そん档于2021-10-20). 
  12. ^ Apple Smalltalk 80. [2022-05-22]. (原始げんし内容ないようそん于2022-05-30). 
  13. ^ Squeak V1 Sources. [2022-02-24]. (原始げんし内容ないようそん档于2017-06-27). 
  14. ^ Kay, Alan. Prototypes vs Classes (e-mail on Squeak list). October 10, 1998 [2021-03-06]. (原始げんし内容ないようそん档于2021-02-16). 
  15. ^ Goldberg, Adele; Robson, David. Smalltalk-80 The Language. Addison Wesley. 1989: 31, 75–89. ISBN 0-201-13688-0. 
  16. ^ Squeak: A minimalist syntax! (PDF). [2021-03-06]. (原始げんし内容ないよう (PDF)そん档于2018-06-13). 
    Object-Oriented Design with Smalltalk — a Pure Object Language and its Environment (PDF). [2021-03-06]. (原始げんし内容ないよう (PDF)そん档于2021-01-21). 
  17. ^ Goldberg, Adele; Robson, David. Smalltalk-80 The Language. Addison Wesley. 1989: 17–37. ISBN 0-201-13688-0. 
  18. ^ Collection Method Definitions:
    select: aBlock 
      "Answer a new instance of a Collection containing all the elements
       in the receiver which, when passed to aBlock, answer true"
      | newCollection |
      newCollection := self copyEmpty.
      self do:
        [:element | (aBlock value: element) ifTrue: [newCollection add: element]].
      ^newCollection
    
  19. ^ Iterable Method Definitions:
    do: aBlock
      "Enumerate each object of the receiver, passing them to aBlock"
      self subclassResponsibility
    
  20. ^ SequenceableCollection Method Definitions:
    do: aBlock
      "Evaluate aBlock for all the elements in the sequenceable collection"
      1 to: self size do: [:i | aBlock value: (self at: i)]
    

    Interval Method Definitions:

    do: aBlock
      "Evaluate the receiver for each element in aBlock"
      | i |
      i := start. step > 0 
        ifTrue: [[i <= stop] whileTrue: [aBlock value: i. i := i + step]]
        ifFalse: [[i >= stop] whileTrue: [aBlock value: i. i := i + step]]
    
  21. ^ Goldberg, Adele; Robson, David. Smalltalk-80 The Language. Addison Wesley. 1989: 39–53. ISBN 0-201-13688-0. 
  22. ^ Collection Method Definitions:
    Collection class >> with: firstObject with: secondObject 
      "Answer a collection whose only elements are the parameters
       in the order they were passed"
        ^(self new)
          add: firstObject;
          add: secondObject;
          yourself
    
  23. ^ Clark, A.N. Metaclasses and Reflection in Smalltalk. 1997. 
  24. ^ Ducasse, Stéphane; Lienhard, Adrian; Renggli, Lukas. Seaside – A Multiple Control Flow Web Application Framework (PDF). scg.unibe.ch. Software Composition Group Institut fur Informatik und angewandte Mathematik Universitaat Bern, Switzerland. [16 December 2013]. (原始げんし内容ないよう (PDF)そん档于2020-01-31). 
  25. ^ Foote, Brian; Johnson, Ralph. Reflective Facilities in Smalltalk-80. Oopsla '89. 1–6 October 1989: 327–335 [16 December 2013]. ISBN 0897913337. doi:10.1145/74877.74911. (原始げんし内容ないようそん档于2021-03-24). 
  26. ^ Smith, Brian C. Procedural Reflection in Programming Languages. MIT Technical Report. 1982-01-01, (MIT-LCS-TR-272) [16 December 2013]. (原始げんし内容ないようそん档于2015-12-13). 
  27. ^ Denker, Marcus; Peck, Mariano Martinez; Bouraqadi, Noury; Fabresse, Luc; Ducasse, Stéphane. Efficient Proxies in Smalltalk (PDF). [2021-03-07]. (原始げんし内容ないよう (PDF)そん档于2021-03-03). 
  28. ^ Image-Based Persistence. book.seaside.st. [17 December 2013]. (原始げんし内容ないようそん档于2013-12-17). 
  29. ^ Kay, Allen. FLEX – A flexible extendable language. University of Utah MSC Thesis. 1968 [2021-03-08]. (原始げんし内容ないようそん档于2018-07-18). 
  30. ^ Fowler, Martin. Memory Image. martinfowler.com. [17 December 2013]. (原始げんし内容ないようそん档于2021-05-07). 
  31. ^ OpenSmalltalk/opensmalltalk-vm, OpenSmalltalk, 2020-11-03 [2020-11-08], (原始げんし内容ないようそん档于2021-03-10) 
  32. ^ Slang. wiki.squeak.org. [2020-11-08]. (原始げんし内容ないようそん档于2021-06-08). 
  33. ^ A Guide to the S-Lang Language (v2.3.0): Preface. jedsoft.org. [2020-11-08]. (原始げんし内容ないようそん档于2019-08-27). 
  34. ^ Cuis Smalltalk. [2022-02-16]. (原始げんし内容ないようそん档于2022-02-07). 
  35. ^ Haver-Smalltalk. [2022-02-12]. (原始げんし内容ないようそん档于2022-02-12). 
  36. ^ PharoJS. [2022-05-17]. (原始げんし内容ないようそん档于2022-05-01). 
  37. ^ SqueakJS. [2022-05-17]. (原始げんし内容ないようそん档于2022-05-01). 
  38. ^ Smalltalk/X. [2022-02-12]. (原始げんし内容ないようそん档于2022-04-13). 
  39. ^ VA Smalltalk. [2022-02-25]. (原始げんし内容ないようそん档于2022-04-13). 
  40. ^ SmallJ. [2022-05-17]. (原始げんし内容ないようそん档于2021-03-01). 
  41. ^ SmallWorld. [2021-03-07]. (原始げんし内容ないようそん档于2009-02-26). 
  42. ^ TruffleSqueak. [2022-02-12]. (原始げんし内容ないようそん档于2022-04-16). 
  43. ^ www.graalvm.org. [2022-02-12]. (原始げんし内容ないようそん档于2022-03-17). 

延伸えんしん阅读

[编辑]

外部がいぶ链接

[编辑]