Smalltalk

Smalltalk (вимовляється [смолток]) - об'єктно-орієнтований мова програмування з динамічною типізацією, розроблений в Xerox PARC Аланом Кейем, ​​Деном Інгаллс, Тедом Кеглером, Адель Голдберг, і іншими в 1970-х роках. Мова був представлений як Smalltalk-80. Smalltalk продовжує активно розвиватися і збирає навколо себе співтовариство користувачів.

Smalltalk справив великий вплив на розвиток багатьох інших мов, таких як: Objective-C, Actor, Java, Groovy і Ruby. Багато ідей 1980-х і 1990-х по написанню програм з'явилися в співтоваристві Smalltalk. До них можна віднести рефакторинг, шаблони проектування (стосовно до ПО), карти Клас-Обов'язки-Взаємодія і екстремальне програмування в цілому. Засновник концепції Wiki, Вард Каннінгем, також входить в співтовариство Smalltalk.


1. Основні ідеї

Основними ідеями Smalltalk є:

  • Всі - об'єкти. Рядки, цілі числа, логічні значення, визначення класів, блоки коду, стеки, пам'ять - все представляється у вигляді об'єктів. Виконання програми складається з посилок повідомлень між об'єктами. Будь-яке повідомлення може бути надіслане будь-якого об'єкта; об'єкт-одержувач визначає, чи є це повідомлення правильним, і що треба зробити, щоб його обробити.
  • Все доступно для зміни. Якщо ви хочете змінити інтегроване середовище розробки, ви можете зробити це в працюючій системі, без зупинки, перекомпіляції і перезапуску. Якщо вам необхідна в мові нова керуюча структура, ви можете додати її. У деяких реалізаціях ви можете також змінити синтаксис мови або спосіб роботи збирача сміття.
  • Динамічна типізація - це означає, що ви не вказуєте типи змінних в програмі, що робить мову набагато лаконічніше. (Як пояснено вище, чи є операція правильною, визначає об'єкт-одержувач, а не компілятор).
  • Model-view-controller (MVC) шаблон структури інтерфейсу. (Останнім часом використовують і інші концепції реалізації інтерфейсу користувача - наприклад, Morphic в Squeak і Pollock в VisualWorks).
  • Dynamic translation: сучасні комерційні віртуальні машини компілюють байткод в машинні коди для швидкого виконання.

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: з аргументом (блоком коду). При цьому викликається метод select: з класу Collection (одного з предків класу String). Текст цього методу показаний нижче:

 select:  aBlock  |  newCollection  |  newCollection  : =  self  species new.  self  do:  [  :  each  |  (  aBlock  value:  each  )  ifTrue:  [  newCollection  add:  each  ]  ]  . ^ NewCollection 

Він здійснює перебір своїх елементів (це метод do:), виконуючи переданий йому блок 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  ]  . 

2. Історія

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. [1] Образ Smalltalk-80 version 2 запущений на Hobbes, віртуальній машині ST-80, реалізованої на VisualWorks.


3. "Здрастуй, світ"

3.1. Простий приклад

 Transcript  show:  'Здрастуй, світ!' 

Цей приклад показує дві сторони Smalltalk.

По-перше, посилка повідомлення: в Smalltalk всі дії проводяться шляхом посилки повідомлень об'єктам. В даному випадку повідомлення це show: 'Здравствуй, мир!', і воно надсилається Transcript. Для обробки цього повідомлення буде викликаний метод Transcript show:, який має розглянути свій аргумент (рядок 'Здрастуй, світ!') і відобразити цей аргумент на transcript. (Зауважте, що у вас має бути відкрите вікно Transcript, щоб побачити результат.)

По-друге, цей приклад показує основний синтаксис посилки повідомлення в Smalltalk: <одержувач повідомлення> <пробіл> <повідомлення>. На відміну від C + +, немає крапок після одержувача, і немає дужок навколо аргументів.


3.2. Приклад об'єкта

3.2.1. Визначення класу

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

Це просте визначення класу з визначенням імені та категорії. Зазвичай середу розробки надає заготовку з більшою частиною тексту цього прикладу.

3.2.2. Визначення методу

 publish  Transcript  show:  'Hello, world!' 

Це визначення методу з ім'ям publish. Тіло методу таке ж, як в простому прикладі.

3.2.3. Виклик методу

 MessagePublisher  new publish 

У даному прикладі створюється екземпляр класу MessagePublisher ( MessagePublisher new), потім йому надсилається повідомлення publish. Зверніть увагу що для створення об'єкта використовується не ключове слово мови (як в C + +, Java, C #), а посилається звичайне повідомлення new класу MessagePublisher. Повідомлення для створення об'єктів іноді перевизначають. Наприклад якийсь абстрактний клас може у відповідь на new повертати екземпляр одного зі своїх конкретних підкласів.


4. Реалізації


Примітки

  1. Скріншот Smalltalk-80 - wiki.cs.uiuc.edu/VisualWorks/Smalltalk-80 in a box
  2. Cincom Smalltalk сайт - smalltalk.cincom.com /, Wiki - wiki.cs.uiuc.edu / VisualWorks, Cincom Smalltalk Blog - www.cincomsmalltalk.com / blog / blogView
  3. Pharo Smalltalk сайт - pharo-project.org
  4. net.net - One of the Internet's premiere addresses - ostudio.swiki.net / 1
  5. IBM - VisualAge Smalltalk - Product Overview - www-4.ibm.com/software/ad/smalltalk /
  6. Welcome to the home of Dolphin Smalltalk - www.object-arts.com/Home.htm
  7. Smalltalk / X - an object-oriented IDE - www.exept.de / en / products / smalltalk-x / stx-overview
  8. GNU Smalltalk | The Smalltalk for those who can type - smalltalk.gnu.org /
  9. Object Connect Home - www.objectconnect.com/
  10. LSW Vision-Smalltalk 2008 - www.lesser-software.com/lswvst.htm
  11. Ambrai Smalltalk - ambrai.com /
  12. http://www.guillermomolina.com.ar/huemul/ - www.guillermomolina.com.ar/huemul/