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 Аланом Кейем, Деном Інгаллсом, Тедом Кеглером, Адель Голдберг у 1970-х роках. Мова була представлена як Smalltalk-80 і з тих пір широко використовується. Smalltalk продовжує активно розвиватися і збирає навколо себе співтовариство користувачів. Smalltalk істотно вплинула на розвиток багатьох інших мов, таких як: Objective-C, Actor, Java та Ruby. Багато ідей 1980-х і 1990-х із написання програм з'явилися в співтоваристві Smalltalk. До них можна віднести рефакторинг, шаблони проектування (стосовно ПЗ), карти Клас-Обов'язки-Взаємодія і екстремальне програмування в цілому. Засновник концепції Вікі, Ворд Каннінгем, також входить в співтовариство Smalltalk.

Історія

[ред. | ред. код]

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'а є:

  • «Все — об'єкти» — Рядки, цілі числа, логічні значення, визначення класів, блоки коду, стеки, пам'ять — все представляється у вигляді об'єктів. Виконання програми складається з посилань повідомлень між об'єктами. Будь-яке повідомлення може бути послане будь-якому об'єктові; об'єкт-одержувач визначає, чи є це повідомлення правильним, і що треба зробити, щоб його обробити. Все доступно для зміни. Якщо ви хочете змінити інтегроване середовище розробки, ви можете зробити це в працюючій системі, без зупинки, перекомпіляції і перезапуску. Існує можливість розширення мови новими керуючими конструкціями. У деяких реалізаціях ви можете також змінити синтаксис мови або спосіб роботи збирача сміття.
  • Модель-вид-контролер (MVC) — шаблон структури інтерфейсу користувача. (Останнім часом використовують і інші концепції реалізації інтерфейсу користувача — наприклад, Morphic в Squeak і Pollock в 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

Див. також

[ред. | ред. код]

Посилання

[ред. | ред. код]
  1. https://wiki.squeak.org/squeak/172