Smalltalk: различия между версиями
imported>VitalikBot м Использование шаблона {{improve}}; langs: de |
imported>DenisKrivosheev Шаблон:Smalltalk |
||
| Строка 1: | Строка 1: | ||
= {{- | {{Карточка языка программирования | ||
| name = Smalltalk | |||
| logo = | |||
| semantics = [[Объектно-ориентированное программирование|объектно-ориентированная]] | |||
| paradigm = [[язык программирования]] | |||
| class = | |||
| year = Разработка начата в 1969 г., стал доступен для широкого использования в 1980 | |||
| designer = [[Кэй, Алан Куртис|Алан Кэй]], [[Голдберг, Адель (программист)|Адель Голдберг]], Дэн Ингаллс, [[Xerox PARC]] | |||
| latest_release_version = Smalltalk-80 version 2 | |||
| latest_test_version = {{start date and age|1980}} | |||
| typing = динамическая | |||
| implementations = [[Pharo]], [[Squeak]], [[VisualWorks]], [[GNU Smalltalk]] | |||
| dialects = | |||
| influenced_by = [[Simula]], [[Sketchpad]], [[Lisp]], [[Лого (язык программирования)|Logo]]| | |||
| influenced = [[Objective-C]], [[AppleScript]], [[C Sharp|C#]], [[Dylan (язык программирования)|Dylan]], [[Groovy]], [[Io (язык программирования)|Io]], [[Java]], [[Lisaac]], [[NewtonScript]], [[Python]], [[Ruby]], [[Scala (язык программирования)|Scala]], [[Self]], [[C++]] | |||
}} | |||
'''Smalltalk''' ({{IPA|[ˈsmɔːltɔːk]}}) — [[Объектно-ориентированное программирование|объектно-ориентированный]] [[язык программирования]] с [[Динамическая типизация|динамической типизацией]], основанный на идее [[Обмен сообщениями|посылки сообщений]], разработанный в [[Xerox PARC]] [[Алан Кэй|Аланом Кэем]], [[Дэн Ингаллс|Дэном Ингаллсом]], [[Тед Кэглер|Тедом Кэглером]], [[Голдберг, Адель (программист)|Адель Голдберг]], и другими в [[1970-е|1970-х годах]]. Представляет собой интегрированную среду разработки и исполнения, объекты которой доступны для модификации через неё саму, и программирование в которой в итоге сводится к модификации её собственного поведения. Язык был представлен как Smalltalk-80. | |||
Smalltalk является одним из многих объектно-ориентированных языков, основанных на языке [[Симула]]<ref>Язык Симула был также объектно-ориентированным, предшествовал и был признан оказавшим влияние на язык Smalltalk, но он являлся языком моделирования, а не языком общего назначения.</ref>, который сам оказал большое влияние на развитие таких объектно-ориентированных языков, как: [[Objective-C]], [[Actor]], [[Java]], [[Erlang]]<ref>{{книга|заглавие = Программирование в Erlang|автор = Чезарини Ф., Томпсон С.|оригинал = Erlang Programming|страниц = 488|страницы = 200|isbn = 978-5-94074-617-1|год = 2012|место = М.|издательство = ДМК Пресс|ref=Чезарини, Томпсон}}</ref>, [[Groovy]], [[Ruby]] и многих других. Многие идеи [[1980-е|1980-х]] и [[1990-е|1990-х]] по написанию программ появились в сообществе Smalltalk. К ним можно отнести [[рефакторинг]], [[шаблоны проектирования]] (применительно к ПО), [[CRC-карта|карты «класс — обязанности — взаимодействие»]] и [[экстремальное программирование]] в целом. Основатель концепции [[вики]] [[Каннингем, Уорд|Уорд Каннингем]] также входит в сообщество Smalltalk. | |||
== Основные идеи == | |||
Основными идеями Smalltalk являются: | |||
* Всё — объекты, и всё их взаимодействие — через посылку сообщений. Строки, целые числа, логические значения, определения классов, [[блок кода|блоки кода]], [[стек]]и, память, составляющие самой интегрированной среды разработки и исполнения — всё представляется в виде объектов. У объектов есть методы и состояние. Любому объекту может быть послано любое сообщение. При отправке сообщения среда исполнения всегда ищет у объекта-получателя подходящий метод и выполняет его, а если не находит — выполняет у объекта-получателя специальный метод для неопознанных сообщений. Объект-получатель сам определяет, является ли полученное сообщение правильным, и что надо сделать, чтобы его обработать. | |||
* Всё доступно для изменения. Если вы хотите изменить саму интегрированную среду разработки и исполнения, вы можете сделать это в работающей системе, без остановки, перекомпиляции и перезапуска. Если вам необходима в языке новая управляющая конструкция языка, вы можете добавить её. В некоторых реализациях вы можете также изменить синтаксис языка или способ работы сборщика мусора. | |||
* Динамическая типизация — это означает, что вы не указываете типы переменных в программе, что делает язык гораздо лаконичней (как объяснено выше, является ли операция правильной, определяет объект-получатель, а не компилятор). | |||
Smalltalk также использует другие современные идеи: | |||
* [[Сборка мусора (программирование)|Сборка мусора]] встроена в язык и незаметна разработчику. | |||
* [[JIT-компиляция|Dynamic translation]]: современные коммерческие [[виртуальная машина|виртуальные машины]] компилируют [[байткод]]ы в машинные коды для быстрого выполнения. | |||
* Выполнение кода в виртуальной машине. Программы Smalltalk обычно компилируются в байткоды и выполняются виртуальной машиной, что позволяет выполнять их на любом оборудовании, для которого существует виртуальная машина. | |||
Одной из особенностей Smalltalk является то, что даже такие традиционные конструкции, как if-then-else, for, while, и т. д. не являются частью языка. Все они реализованы с помощью [[Объект (программирование)|объектов]]. Например, решение принимается с помощью посылки сообщения <code>ifTrue:</code> логическому объекту, и передаёт управление фрагменту текста, если логическое значение истинно. | |||
Собственно встроенных синтаксических конструкций в языке немного: | |||
* посылка сообщения объекту с возможной передачей ему других объектов; | |||
* [[присваивание (программирование)|присваивание]] объекта переменной; | |||
* возвращение объекта из метода; | |||
и несколько синтаксических конструкций для определения объектов-литералов и временных переменных. | |||
Аналогом механизма обмена сообщениями Smalltalk является сеть интернет: можно представить каждый объект как веб-сервер, отвечающий на запросы. При этом, сервер на запросы может просто выдавать заранее предопределённый ответ, например веб-страницу, расположенную по определённому пути; может перенаправить запрос-сообщение другому объекту, аналог — прокси-сервер; может изменить запрос по определённым правилам, аналог — техника url rewriting, и конечно же, может сформировать абсолютно новую страницу, соответствующую данным, переданным с сообщением. Если для реакции на сообщение у объекта нет предопределённого метода, то среда вызывает у получателя метод #doesNotUnderstand:, так же, как веб-сервер возвращает страницу с сообщением об ошибке, если задан несуществующий путь к веб-странице. | |||
Краткий обзор синтаксических элементов: | |||
= | Отдельно стоящей парой символов <code>|</code> окружается список имён переменных, которые будут временными. Символ <code>:</code> при передаче сообщения ставится после имени сообщения или его аргумента, перед передаваемым с ним значением, а символы <code>[</code> и <code>]</code> ограничивают блок команд, а точнее — литерал анонимной функции. Но их можно, для начала, воспринимать их как аналог фигурных скобок <code>{</code> и <code>}</code> в Си-подобных языках. В начале такой анонимной функции до символа <code>|</code> можно перечислить требуемые ею аргументы. Её результатом будет последнее вычисленное ею выражение. Символ <code>.</code> завершает отдельную команду, символ <code>;</code> — разделяет сообщения, которые нужно последовательно передать одному и тому же объекту. Пара символов <code>:=</code> обозначает присваивание в переменную, имя которой расположено перед ней, объекта-литерала или объекта-ответа на сообщение, расположенного после неё. | ||
==== | Следующий пример, показывающий нахождение гласных в строке, иллюстрирует стиль Smalltalk. | ||
<source lang="smalltalk"> | |||
| aString vowels | | |||
aString := 'This is a string'. | |||
vowels := aString select: [:aCharacter | aCharacter isVowel]. | |||
</source> | |||
В последней строке примера объекту-строке посылается сообщение <code>select:</code> с аргументом — анонимным блоком кода, принимающим один аргумент, и возвращающим то, что вернёт обработчик события isVowel переданного этим аргументом объекта. При обработке сообщения select вызывается метод <code>select:</code> из класса <code>Collection</code> (одного из предков класса <code>String</code>, к которому относится объект, создаваемый строковым литералом во второй строке примера). Текст этого метода показан ниже: | |||
<source lang="smalltalk"> | |||
select: aBlock | |||
| newCollection | | |||
newCollection := self species new. | |||
self do: [:each | | |||
(aBlock value: each) | |||
ifTrue: [newCollection add: each]]. | |||
^newCollection | |||
</source> | |||
Он осуществляет принимает на вход анонимную функцию aBlock, создаёт новую коллекцию, аналогичную себе, и вызывает перебор своих элементов (это метод <code>do:</code>), выполняя переданный ему блок <code>aBlock</code> для каждого элемента; когда блок выполняется (в примере — <code>aCharacter isVowel</code>), он создаёт логическое значение, которому затем посылается сообщение <code>ifTrue:</code>. Если это значение <code>true</code>, то буква добавляется в возвращаемую строку. В конце созданная коллекция возвращается ответом на сообщение, на что указывает символ возвращения в качестве ответа <code>^</code>. Из-за того что <code>select:</code> определён в абстрактном классе <code>Collection</code>, мы также можем использовать его ещё и так: | |||
<source lang="smalltalk"> | |||
| 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]. | |||
</source> | |||
==== | == История == | ||
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]].<ref>[http://wiki.cs.uiuc.edu/VisualWorks/Smalltalk-80+in+a+box Скриншот Smalltalk-80] {{webarchive|url=https://web.archive.org/web/20030419030217/http://wiki.cs.uiuc.edu/VisualWorks/Smalltalk-80+in+a+box |date=2003-04-19 }}</ref> Образ Smalltalk-80 version 2 запущен на Hobbes, виртуальной машине ST-80, реализованной на VisualWorks. | ||
=== | == «Hello, world!» == | ||
{{ | |||
| | === Простой пример === | ||
| | <source lang="smalltalk"> | ||
| | Transcript show: 'Hello, world!' | ||
| | </source> | ||
| | Этот пример показывает две стороны Smalltalk. | ||
| | |||
| | Во-первых, посылка сообщения: в Smalltalk все действия производятся путём посылки сообщений объектам. В данном случае сообщение это <code>show: 'Hello, world!'</code>, и оно посылается объекту <code>Transcript</code>. Для обработки этого сообщения будет вызван метод Transcript <code>show:</code>, который должен рассмотреть свой аргумент (строку 'Hello, world!') и отобразить этот аргумент на transcript (заметьте, что у вас должно быть открыто окно ''Transcript'', чтобы увидеть результат). | ||
| | |||
| | Во-вторых, этот пример показывает основной синтаксис посылки сообщения в Smalltalk: <получатель сообщения> <пробел> <сообщение>. В отличие от [[C++]], нет точек после получателя, и нет скобок вокруг аргументов. | ||
| | |||
| | === Пример объекта === | ||
| | |||
| | ==== Определение класса ==== | ||
<source lang="smalltalk"> | |||
Object subclass: #MessagePublisher | |||
instanceVariableNames: '' | |||
classVariableNames: '' | |||
poolDictionaries: '' | |||
category: 'Smalltalk Examples' | |||
</source> | |||
Это простое определение класса с определением имени и категории. Обычно среда разработки предоставляет заготовку с большей частью текста этого примера. | |||
==== Определение метода ==== | |||
<source lang="smalltalk"> | |||
publish | |||
Transcript show: 'Hello, world!' | |||
</source> | |||
Это определение метода с именем <code>publish</code>. Тело метода такое же, как в простом примере. | |||
==== Вызов метода ==== | |||
<source lang="smalltalk"> | |||
MessagePublisher new publish | |||
</source> | |||
В данном примере создаётся экземпляр класса <code>MessagePublisher</code> (<code>MessagePublisher new</code>), затем ему посылается сообщение <code>publish</code>. Обратите внимание, что для создания объекта не используется ключевое слово языка (как в C++, Java, C#), а посылается обычное сообщение <code>new</code> классу <code>MessagePublisher</code>. Сообщения для создания объектов иногда переопределяют. Например, некий абстрактный класс может в ответ на <code>new</code> возвращать экземпляр одного из своих конкретных подклассов. | |||
== Реализации == | |||
{{Список примеров|дата=2015-05-27}}<!-- реализаций очень много, и даже что сейчас есть — это не все, их отбор должен быть сведён к обобщающему источнику--> | |||
{{кол}} | |||
* {{нп3|VisualWorks}}<ref>[http://smalltalk.cincom.com/ Cincom Smalltalk сайт] {{Wayback|url=http://smalltalk.cincom.com/ |date=20080827223058 }}, [http://wiki.cs.uiuc.edu/VisualWorks Wiki] {{webarchive|url=https://web.archive.org/web/20061210204111/http://wiki.cs.uiuc.edu/VisualWorks |date=2006-12-10 }}, [http://www.cincomsmalltalk.com/blog/blogView Cincom Smalltalk Blog] {{Wayback|url=http://www.cincomsmalltalk.com/blog/blogView |date=20050113071947 }}</ref> | |||
* [[Squeak]] — современная открытая реализация Smalltalk с полноценной средой разработки (окна, редактор и т. д.). Один из основателей — [[Алан Кей]]. | |||
* [[Self]] | |||
* [[Pharo]]<ref>{{Cite web |url=http://pharo-project.org/ |title=Pharo Smalltalk сайт |access-date=2022-05-19 |archive-date=2020-05-11 |archive-url=https://web.archive.org/web/20200511042700/https://pharo-project.org/ |url-status=live }}</ref> | |||
* [[ObjectStudio]]<ref>[http://ostudio.swiki.net/1 net.net — One of the Internet’s premiere addresses<!-- Заголовок добавлен ботом -->]{{Недоступная ссылка|date=2018-05|bot=InternetArchiveBot }}</ref> | |||
* [[IBM VisualAge]] for Smalltalk<ref>{{Cite web |url=http://www-4.ibm.com/software/ad/smalltalk/ |title=IBM — VisualAge Smalltalk — Product Overview<!-- Заголовок добавлен ботом --> |access-date=2005-01-10 |archive-date=2002-04-08 |archive-url=https://web.archive.org/web/20020408181139/http://www-4.ibm.com/software/ad/smalltalk/ |url-status=live }}</ref> | |||
* [[Dolphin Smalltalk]] | |||
* [[Smalltalk/X]]<ref>{{Cite web |url=https://www.exept.de/en/smalltalk-x.html |title=Smalltalk/X — an object-oriented IDE<!-- Заголовок добавлен ботом --> |access-date=2018-02-18 |archive-date=2022-04-13 |archive-url=https://web.archive.org/web/20220413115401/https://www.exept.de/en/smalltalk-x.html |url-status=live }}</ref> | |||
* [[GNU Smalltalk]]<ref>{{Cite web |url=http://smalltalk.gnu.org/ |title=GNU Smalltalk {{!}} The Smalltalk for those who can type<!-- Заголовок добавлен ботом --> |access-date=2007-10-01 |archive-date=2020-03-01 |archive-url=https://web.archive.org/web/20200301085203/http://smalltalk.gnu.org/ |url-status=live }}</ref> | |||
* {{нп3|Smalltalk MT}}<ref>{{Cite web |url=http://www.objectconnect.com/ |title=Object Connect Home<!-- Заголовок добавлен ботом --> |access-date=2005-01-10 |archive-date=2021-02-26 |archive-url=https://web.archive.org/web/20210226063402/http://objectconnect.com/ |url-status=live }}</ref> | |||
* [[LSW Vision-Smalltalk]]<ref>{{Cite web |url=http://www.lesser-software.com/lswvst.htm |title=LSW Vision-Smalltalk 2008<!-- Заголовок добавлен ботом --> |access-date=2005-01-10 |archive-date=2005-01-09 |archive-url=https://web.archive.org/web/20050109091855/http://www.lesser-software.com/lswvst.htm |url-status=live }}</ref> | |||
* [[Ambrai Smalltalk]]<ref>{{Cite web |url=http://ambrai.com/ |title=Ambrai Smalltalk<!-- Заголовок добавлен ботом --> |access-date=2005-04-11 |archive-date=2005-04-05 |archive-url=https://web.archive.org/web/20050405080527/http://www.ambrai.com/ |url-status=live }}</ref> | |||
* [[Huemul Smalltalk]]<ref>{{Cite web |url=http://www.guillermomolina.com.ar/huemul/ |title=Sitio Web de Guillermo Adrián Molina<!-- Заголовок добавлен ботом --> |access-date=2008-05-06 |archive-date=2008-05-18 |archive-url=https://web.archive.org/web/20080518160223/http://www.guillermomolina.com.ar/huemul/ |url-status=live }}</ref> | |||
{{конец кол}} | |||
== Примечания == | |||
{{примечания|2}} | |||
== Литература == | |||
* {{книга|автор=Роберт У. Себеста.|часть=2.15. Объектно-ориентированное программирование: язык Smalltalk|заглавие=Основные концепции языков программирования|ссылка=https://archive.org/details/libgen_00052588|оригинал=Concepts of Programming Languages|ответственный=Пер. с англ|издание=5-е изд|место=М.|издательство=[[Вильямс (издательство)|Вильямс]]|год=2001|страницы=[https://archive.org/details/libgen_00052588/page/n109 109]—112|страниц=672|isbn=5-8459-0192-8 (рус.), ISBN 0-201-75295-6 (англ.)|тираж=5000}} | |||
* {{книга | |||
|заглавие = Объектно-ориентированное программирование. Язык Smalltalk | |||
|автор = Ю. А. Кирютенко, В. А. Савельев. | |||
|isbn = 5-9502-0097-7 | |||
|страниц = 328 | |||
|год = 2007 | |||
|место = М. | |||
|издательство = Вузовская книга | |||
|ссылка = https://squeak.ru/books/oop-Smalltalk.pdf | |||
|archive-url=https://web.archive.org/web/20160304125106/https://squeak.ru/books/oop-Smalltalk.pdf|archive-date=2016-03-04}} | |||
* {{статья |заглавие=Special Issue on Smalltalk |издание=[[Byte (журнал)|BYTE]] |издательство=McGraw-Hill |том=6 |номер=8 |ссылка=https://squeak.ru/books/byte1981.pdf |язык=en |месяц=8 |год=1981 |тип=magazine |archive-url=https://web.archive.org/web/20160507104645/https://squeak.ru/books/byte1981.pdf |archive-date=2016-05-07 }} | |||
== Ссылки == | |||
{{викиучебник|Smalltalk в примерах}} | |||
* [http://www.smalltalk.org/ Основной сайт]{{ref|en}} | |||
* [http://stephane.ducasse.free.fr/FreeBooks/ Книги о Smalltalk] | |||
* [http://www.math.rsu.ru/smalltalk/ Smalltalk в России] | |||
* [http://www.squeaksource.com/ SqueakSource] — [[Monticello]]-репозиторий для [[Squeak]] и [[Pharo]] | |||
* [http://polyglot.squeak.googlepages.com/sli.pdf Смолток. Язык и его реализация]{{pdf|2.4}} | |||
* [https://web.archive.org/web/20080314042323/http://www.math.rsu.ru/smalltalk/smalltalk80/ Язык программирования Smalltalk-80], перевод книги А. Голдберг и Д. Робсона | |||
* [http://www.smalltalk.ru/downloads/ansi-standard.pdf Стандарт ANSI Smalltalk]{{pdf|1.2}} | |||
* [http://www.europrog.ru/paper/js1978-02e.pdf An Overview of the Programming Language Smalltalk-72 by John Shoch]{{dead link|число=12|месяц=10|год=2016}} | |||
* [http://www.europrog.ru/paper/di1978-01e.pdf The Smalltalk-76 Programming System. Design and Implementation by Dan Ingalls] {{dead link|число=12|месяц=10|год=2016}} | |||
* [http://www.math.rsu.ru/smalltalk/info4.ru.html Smalltalk: Концепция объектно-ориентированного программирования], А. Г. Иванов, Ю. Е. Кремер, [[Компьютер Пресс]], № 4, 1992 | |||
{{внешние ссылки}} | |||
{{rq| | |||
{{стиль статьи|дата=2015-05-27}} | |||
{{проверить факты|дата=2015-05-27}} | |||
}} | }} | ||
{{Smalltalk}} | |||
{{Объектно-ориентированные языки}} | |||
[[Категория:Объектно-ориентированные языки программирования]] | |||
[[Категория:Языки с динамической типизацией]] | |||
[[Категория:Языки программирования с автоматическим управлением памятью]] | |||
[[Категория:Smalltalk|*]] | |||
Текущая версия от 20:22, 6 марта 2026
Шаблон:Карточка языка программирования Smalltalk ({{#if: | [ˈsmɔːltɔːk] | [ˈsmɔːltɔːk] }}) — объектно-ориентированный язык программирования с динамической типизацией, основанный на идее посылки сообщений, разработанный в Xerox PARC Аланом Кэем, Дэном Ингаллсом, Тедом Кэглером, Адель Голдберг, и другими в 1970-х годах. Представляет собой интегрированную среду разработки и исполнения, объекты которой доступны для модификации через неё саму, и программирование в которой в итоге сводится к модификации её собственного поведения. Язык был представлен как Smalltalk-80.
Smalltalk является одним из многих объектно-ориентированных языков, основанных на языке Симула<ref>Язык Симула был также объектно-ориентированным, предшествовал и был признан оказавшим влияние на язык Smalltalk, но он являлся языком моделирования, а не языком общего назначения.</ref>, который сам оказал большое влияние на развитие таких объектно-ориентированных языков, как: Objective-C, Actor, Java, Erlang<ref>Шаблон:Книга</ref>, Groovy, Ruby и многих других. Многие идеи 1980-х и 1990-х по написанию программ появились в сообществе Smalltalk. К ним можно отнести рефакторинг, шаблоны проектирования (применительно к ПО), карты «класс — обязанности — взаимодействие» и экстремальное программирование в целом. Основатель концепции вики Уорд Каннингем также входит в сообщество Smalltalk.
Основные идеи
Основными идеями Smalltalk являются:
- Всё — объекты, и всё их взаимодействие — через посылку сообщений. Строки, целые числа, логические значения, определения классов, блоки кода, стеки, память, составляющие самой интегрированной среды разработки и исполнения — всё представляется в виде объектов. У объектов есть методы и состояние. Любому объекту может быть послано любое сообщение. При отправке сообщения среда исполнения всегда ищет у объекта-получателя подходящий метод и выполняет его, а если не находит — выполняет у объекта-получателя специальный метод для неопознанных сообщений. Объект-получатель сам определяет, является ли полученное сообщение правильным, и что надо сделать, чтобы его обработать.
- Всё доступно для изменения. Если вы хотите изменить саму интегрированную среду разработки и исполнения, вы можете сделать это в работающей системе, без остановки, перекомпиляции и перезапуска. Если вам необходима в языке новая управляющая конструкция языка, вы можете добавить её. В некоторых реализациях вы можете также изменить синтаксис языка или способ работы сборщика мусора.
- Динамическая типизация — это означает, что вы не указываете типы переменных в программе, что делает язык гораздо лаконичней (как объяснено выше, является ли операция правильной, определяет объект-получатель, а не компилятор).
Smalltalk также использует другие современные идеи:
- Сборка мусора встроена в язык и незаметна разработчику.
- Dynamic translation: современные коммерческие виртуальные машины компилируют байткоды в машинные коды для быстрого выполнения.
- Выполнение кода в виртуальной машине. Программы Smalltalk обычно компилируются в байткоды и выполняются виртуальной машиной, что позволяет выполнять их на любом оборудовании, для которого существует виртуальная машина.
Одной из особенностей Smalltalk является то, что даже такие традиционные конструкции, как if-then-else, for, while, и т. д. не являются частью языка. Все они реализованы с помощью объектов. Например, решение принимается с помощью посылки сообщения ifTrue: логическому объекту, и передаёт управление фрагменту текста, если логическое значение истинно.
Собственно встроенных синтаксических конструкций в языке немного:
- посылка сообщения объекту с возможной передачей ему других объектов;
- присваивание объекта переменной;
- возвращение объекта из метода;
и несколько синтаксических конструкций для определения объектов-литералов и временных переменных.
Аналогом механизма обмена сообщениями Smalltalk является сеть интернет: можно представить каждый объект как веб-сервер, отвечающий на запросы. При этом, сервер на запросы может просто выдавать заранее предопределённый ответ, например веб-страницу, расположенную по определённому пути; может перенаправить запрос-сообщение другому объекту, аналог — прокси-сервер; может изменить запрос по определённым правилам, аналог — техника url rewriting, и конечно же, может сформировать абсолютно новую страницу, соответствующую данным, переданным с сообщением. Если для реакции на сообщение у объекта нет предопределённого метода, то среда вызывает у получателя метод #doesNotUnderstand:, так же, как веб-сервер возвращает страницу с сообщением об ошибке, если задан несуществующий путь к веб-странице.
Краткий обзор синтаксических элементов:
Отдельно стоящей парой символов | окружается список имён переменных, которые будут временными. Символ : при передаче сообщения ставится после имени сообщения или его аргумента, перед передаваемым с ним значением, а символы [ и ] ограничивают блок команд, а точнее — литерал анонимной функции. Но их можно, для начала, воспринимать их как аналог фигурных скобок { и } в Си-подобных языках. В начале такой анонимной функции до символа | можно перечислить требуемые ею аргументы. Её результатом будет последнее вычисленное ею выражение. Символ . завершает отдельную команду, символ ; — разделяет сообщения, которые нужно последовательно передать одному и тому же объекту. Пара символов := обозначает присваивание в переменную, имя которой расположено перед ней, объекта-литерала или объекта-ответа на сообщение, расположенного после неё.
Следующий пример, показывающий нахождение гласных в строке, иллюстрирует стиль Smalltalk.
<source lang="smalltalk">
| aString vowels |
aString := 'This is a string'.
vowels := aString select: [:aCharacter | aCharacter isVowel].
</source>
В последней строке примера объекту-строке посылается сообщение select: с аргументом — анонимным блоком кода, принимающим один аргумент, и возвращающим то, что вернёт обработчик события isVowel переданного этим аргументом объекта. При обработке сообщения select вызывается метод select: из класса Collection (одного из предков класса String, к которому относится объект, создаваемый строковым литералом во второй строке примера). Текст этого метода показан ниже:
<source lang="smalltalk">
select: aBlock
| newCollection |
newCollection := self species new.
self do: [:each |
(aBlock value: each)
ifTrue: [newCollection add: each]].
^newCollection
</source>
Он осуществляет принимает на вход анонимную функцию aBlock, создаёт новую коллекцию, аналогичную себе, и вызывает перебор своих элементов (это метод do:), выполняя переданный ему блок aBlock для каждого элемента; когда блок выполняется (в примере — aCharacter isVowel), он создаёт логическое значение, которому затем посылается сообщение ifTrue:. Если это значение true, то буква добавляется в возвращаемую строку. В конце созданная коллекция возвращается ответом на сообщение, на что указывает символ возвращения в качестве ответа ^. Из-за того что select: определён в абстрактном классе Collection, мы также можем использовать его ещё и так:
<source lang="smalltalk">
| 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]. </source>
История
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.<ref>Скриншот Smalltalk-80 Шаблон:Webarchive</ref> Образ Smalltalk-80 version 2 запущен на Hobbes, виртуальной машине ST-80, реализованной на VisualWorks.
«Hello, world!»
Простой пример
<source lang="smalltalk"> Transcript show: 'Hello, world!' </source> Этот пример показывает две стороны Smalltalk.
Во-первых, посылка сообщения: в Smalltalk все действия производятся путём посылки сообщений объектам. В данном случае сообщение это show: 'Hello, world!', и оно посылается объекту Transcript. Для обработки этого сообщения будет вызван метод Transcript show:, который должен рассмотреть свой аргумент (строку 'Hello, world!') и отобразить этот аргумент на transcript (заметьте, что у вас должно быть открыто окно Transcript, чтобы увидеть результат).
Во-вторых, этот пример показывает основной синтаксис посылки сообщения в Smalltalk: <получатель сообщения> <пробел> <сообщение>. В отличие от C++, нет точек после получателя, и нет скобок вокруг аргументов.
Пример объекта
Определение класса
<source lang="smalltalk"> Object subclass: #MessagePublisher
instanceVariableNames:
classVariableNames:
poolDictionaries:
category: 'Smalltalk Examples'
</source> Это простое определение класса с определением имени и категории. Обычно среда разработки предоставляет заготовку с большей частью текста этого примера.
Определение метода
<source lang="smalltalk"> publish
Transcript show: 'Hello, world!'
</source>
Это определение метода с именем publish. Тело метода такое же, как в простом примере.
Вызов метода
<source lang="smalltalk">
MessagePublisher new publish
</source>
В данном примере создаётся экземпляр класса MessagePublisher (MessagePublisher new), затем ему посылается сообщение publish. Обратите внимание, что для создания объекта не используется ключевое слово языка (как в C++, Java, C#), а посылается обычное сообщение new классу MessagePublisher. Сообщения для создания объектов иногда переопределяют. Например, некий абстрактный класс может в ответ на new возвращать экземпляр одного из своих конкретных подклассов.
Реализации
Шаблон:Список примеров Шаблон:Кол
- Шаблон:Нп3<ref>Cincom Smalltalk сайт Шаблон:Wayback, Wiki Шаблон:Webarchive, Cincom Smalltalk Blog Шаблон:Wayback</ref>
- Squeak — современная открытая реализация Smalltalk с полноценной средой разработки (окна, редактор и т. д.). Один из основателей — Алан Кей.
- Self
- Pharo<ref>Шаблон:Cite web</ref>
- ObjectStudio<ref>net.net — One of the Internet’s premiere addressesШаблон:Недоступная ссылка</ref>
- IBM VisualAge for Smalltalk<ref>Шаблон:Cite web</ref>
- Dolphin Smalltalk
- Smalltalk/X<ref>Шаблон:Cite web</ref>
- GNU Smalltalk<ref>Шаблон:Cite web</ref>
- Шаблон:Нп3<ref>Шаблон:Cite web</ref>
- LSW Vision-Smalltalk<ref>Шаблон:Cite web</ref>
- Ambrai Smalltalk<ref>Шаблон:Cite web</ref>
- Huemul Smalltalk<ref>Шаблон:Cite web</ref>
Примечания
Литература
Ссылки
Шаблон:Родственный проект{{#if:||{{#if:Smalltalk в примерах||}}}}
- Основной сайтШаблон:Ref
- Книги о Smalltalk
- Smalltalk в России
- SqueakSource — Monticello-репозиторий для Squeak и Pharo
- Смолток. Язык и его реализацияШаблон:Pdf
- Язык программирования Smalltalk-80, перевод книги А. Голдберг и Д. Робсона
- Стандарт ANSI SmalltalkШаблон:Pdf
- An Overview of the Programming Language Smalltalk-72 by John ShochШаблон:Dead link
- The Smalltalk-76 Programming System. Design and Implementation by Dan Ingalls Шаблон:Dead link
- Smalltalk: Концепция объектно-ориентированного программирования, А. Г. Иванов, Ю. Е. Кремер, Компьютер Пресс, № 4, 1992
Шаблон:Внешние ссылки Шаблон:Rq Шаблон:Smalltalk Шаблон:Объектно-ориентированные языки