Loading AI tools
З Вікіпедії, вільної енциклопедії
Smalltalk (вимовляється [смо́лток]) — об'єктно-орієнтована мова програмування з динамічною типізацією, розроблена в Xerox PARC Аланом Кейем, Деном Інгаллсом, Тедом Кеглером, Адель Голдберг у 1970-х роках. Мова була представлена як Smalltalk-80 і з тих пір широко використовується. Smalltalk продовжує активно розвиватися і збирає навколо себе співтовариство користувачів. Smalltalk істотно вплинула на розвиток багатьох інших мов, таких як: Objective-C, Actor, Java та Ruby. Багато ідей 1980-х і 1990-х із написання програм з'явилися в співтоваристві Smalltalk. До них можна віднести рефакторинг, шаблони проектування (стосовно ПЗ), карти Клас-Обов'язки-Взаємодія і екстремальне програмування в цілому. Засновник концепції Вікі, Ворд Каннінгем, також входить в співтовариство Smalltalk.
Smalltalk | |
---|---|
![]() | |
Парадигма | об'єктно-орієнтована |
Дата появи | Розробка почалася у 1969 Випуск 1980 |
Творці | PARC, Алан Кей, Ден Інгаллс, Тед Кеглер, Адель Голдберг |
Розробник | PARC, Алан Кей, Ден Інгаллс, Тед Кеглер, Адель Голдберг |
Останній реліз | ANSI Smalltalk (19 травня 1998)[1] |
Система типізації | динамічною типізацією |
Основні реалізації | Squeak, VisualWorks |
Під впливом від | LISP, Simula |
Вплинула на | Objective-C, Actor, Self, Oak, Java, Dylan (мова програмування), AppleScript, NewtonScript, Python, Ruby, Scala |
Звичайні розширення файлів | .st |
Smalltalk була розроблена групою дослідників, очолюваною Аланом Кеєм в дослідницькому центрі Xerox PARC. Перша реалізація, відома як Smalltalk-71, була створена за декілька місяців, як результат суперечки про те, що мова програмування, заснована на ідеї посилки повідомлень, підказаною Симулою, повинна реалізовуватися на «сторінці коду». Пізніша версія, дійсно використана для дослідницької роботи, відома зараз як Smalltalk-72. Її синтаксис і модель виконання сильно відрізнялися від сучасного Smalltalk, настільки, що її треба розглядати як іншу мову.
Після істотних переробок які зафіксували декілька сторін семантики виконання для збільшення ефективності, була створена версія відома, як Smalltalk-76. У цій версії додалися успадкування, синтаксис ближчий до Smalltalk-80, і середовище розробки, що включає більшість інструментів, знайомих зараз Smalltalk-ерам.
У Smalltalk-80 були додані метакласси, що робило фразу «все — об'єкти» істинною шляхом пов'язання з індивідуальними класами властивостей і поведінки (наприклад, підтримка різних способів створення екземплярів). Smalltalk-80 був першою версією, доступною за межами PARC, — спочатку як Smalltalk-80 Version 1, розданий невеликій кількості компаній і університетів для «експертної оцінки». Пізніше (у 1983) були випущені загальнодоступна реалізація, відома як Smalltalk-80 Version 2, — як образ (незалежний від платформи файл, що містить об'єкти) — і специфікації віртуальної машини.
Зараз існує дві реалізації Smalltalk, що є прямими нащадками Smalltalk-80. Це Squeak і VisualWorks.
Основними ідеями Smalltalk'а є:
Smalltalk також використовує інші сучасні ідеї:
Однією з несподіваних особливостей Smalltalk є те, що традиційні конструкції: if-then-else, for, while, тощо не є частиною мови. Всі вони реалізовані за допомогою об'єктів. Наприклад, рішення ухвалюється за допомогою посилки повідомлення ifTrue: логічному об'єктові, і передає управління фрагменту коду, якщо логічне значення істинне. Є всього три конструкції:
Щоб краще зрозуміти, як працює механізм обміну повідомленнями, можна уявити кожен об'єкт як вебсервер, що відповідає на запити. При цьому, на запити можна просто видавати заздалегідь зумовлену відповідь, аналог цьому — видача вебсторінки, розташованої за певним шляхом; можна перенаправити запит-повідомлення іншому об'єктові, аналог — проксі-сервер; змінити запит за певними правилами, аналог — техніка URL rewriting. Якщо для реакції на повідомлення немає зумовленого методу, то викликається метод #doesNotUnderstand:, так само, як вебсервер відкриває сторінку з повідомленням про помилку, якщо сторінка за заданим шляхом не існує.
Наступний приклад показує пошук голосних в рядку та ілюструє стиль Smalltalk. Символ "|" визначає змінні, «:» визначає параметри, а символи «[» і «]» можна, спершу, сприймати, як аналог фігурних дужок «{» і «}» в С-подібних мовах:
| aString vowels |
aString := 'This is a string'.
vowels := aString select: [:aCharacter | aCharacter isVowel].
У останньому рядку посилається повідомлення select:
з аргументом у вигляді блоку коду. Далі йде код в базовому класі Collection
який виконує роботу:
| newCollection |
newCollection := self species new.
self do: [:each |
(aBlock value: each)
ifTrue: [newCollection add: each]].
^newCollection
Він відповідає на повідомлення шляхом перебору своїх елементів (це метод do:
) виконуючи код aBlock
для кожної літери; коли виконується aBlock (aCharacter isVowel)
, він створює логічне значення, якому потім посилається ifTrue:
. Якщо це значення true
, буква додається в рядок, що повертається. Позаяк select
визначено в абстрактному класі Collection
, його можна використовувати так:
| rectangles aPoint|
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].
У цьому прикладі показано дві сторони Smalltalk.
Transcript show: 'Привіт, світе!'
Перше, це «посилка повідомлення». У Smalltalk всі обчислення проводяться шляхом посилки повідомлень об'єктам. В даному випадку повідомлення — це «show: Привіт, світе!», і воно посилається «Transcript». Для обробки цього повідомлення буде викликаний метод Transcript "show: ", який має розглянути свій аргумент (рядок «Привіт, світе!») і відобразити цей аргумент на Transcript. (Зауважте, що у вас має бути відкрите вікно Transcript, щоб побачити результат.)
Друге, цей приклад показує основний синтаксис посилки повідомлення в Smalltalk'е: <ОДЕРЖУВАЧ ПОВІДОМЛЕННЯ> <ПРОБІЛ> <ПОВІДОМЛЕННЯ>. На відміну від C++, немає крапок після одержувача, і немає дужок навколо аргументів.
Object subclass: #MessagePublisher
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Smalltalk Examples'
Це просте визначення класу з визначенням ім'ям і категорії. Часто середовище розробки надаватиме вам велику частину коду з цього прикладу.
publish
Transcript show: 'Hello, world!'
Це визначення методу з ім'ям «publish». Тіло методу таке ж як в простому прикладі.
У цьому прикладі створюється екземпляр MessagePublisher («MessagePublisher new»), потім йому посилається повідомлення «publish». Зверніть увагу, що для створення об'єкта використовується не ключове слово мови (як в C++, Java, C#), а посилається звичайне повідомлення «new» до класу «MessagePublisher». Повідомлення для створення об'єктів іноді перевизначають. Наприклад якийсь абстрактний клас може у відповідь на «new» повертати екземпляр один з своїх конкретних класів.
MessagePublisher new publish