Краткий обзор языка Smalltalk

advertisement
Краткий обзор языка
Smalltalk
"Я придумал термин "объектно-ориентированный",
и вот что я вам скажу, я не имел ввиду С++."
-- Алан Кей, OOPSLA '97
Smalltalk — объектно-ориентированный язык
программирования с динамической типизацией,
разработанный в Xerox PARC Аланом Кэйем,
Дэном Ингаллсом, Тедом Кэглером, Адель
Голдберг, и другими в 1970-х годах. Язык был
представлен как Smalltalk-80 и с тех пор широко
используется. Smalltalk продолжает активно
развиваться и собирает вокруг себя преданное
сообщество пользователей.
Smalltalk оказал большое влияние на развитие
многих других языков, таких как: Objective-C,
Actor, Java и Ruby. Многие идеи 1980-х и 1990-х
по написанию программ появились в
сообществе Smalltalk.
К ним можно отнести рефакторинг, шаблоны
проектирования (применительно к ПО), карты
Класс-Обязанности-Взаимодействие и
экстремальное программирование в целом.
Основатель концепции Wiki, Вард Каннингем,
также входит в сообщество Smalltalk.
Целью проекта под названием Dynabook было
создание целой среды для персонального
компьютера. Это происходило во время
расцвета деятельности Xerox PARC - тогда были
разработаны персональные компьютеры Alto и
Star, мышь, оконная среда (впоследствии
весьма эффективно использованная Стивеном
Джобсом в фирме Apple для разработки
компьютеров Macintosh), значки для программ,
сети Ethernet и Smalltalk.
В 1972 г. Дан Ингаллс разработал первую
реализацию языка, известную как Smalltalk72. Это была первая практическая версия
языка. Затем в Smalltalk были внесены
некоторые изменения и общепринятым
стандартом описания языка стал Smalltalk-80.
Поскольку официального стандарта не
существует, название Smalltalk применяется
для обозначения набора нескольких
достаточно близких и чрезвычайно
совместимых языков.
Первоначально для выполнения программ на
Smalltalk требовалась целая вычислительная
среда компьютера специального назначения.
По этой причине распространение этого языка
было достаточно ограниченным. Тем не менее
в настоящее время существует несколько
реализаций этой системы общего назначения,
и ее можно легко устанавливать на машины
широкого класса типа рабочих станций UNIX и
PC.
Язык Smalltalk отличается от всех других языков,
описанных на данном сайте, в двух отношениях:
1. Он разрабатывался как целая система, а не как
просто средство для написания программ.
2. Объектная ориентация в этом языке
изначально была встроенной концепцией в
противоположность языкам C++ и Ada, в
которых к уже существующим механизмам
была просто добавлена концепция
наследования.
Основными идеями Smalltalk
являются:
• Всё — объекты. Строки, целые числа, логические
значения, определения классов, блоки кода,
стеки, память — всё представляется в виде
объектов. Выполнение программы состоит из
посылок сообщений между объектами.
• Всё доступно для изменения. Если вы хотите
изменить интегрированную среду разработки, вы
можете сделать это в работающей системе, без
остановки, перекомпиляции и перезапуска.
• Динамическая типизация — это означает, что
вы не указываете типы переменных в
программе, что делает язык гораздо
лаконичней.
• Model-view-controller (MVC) шаблон структуры
пользовательского интерфейса
• Dynamic translation: современные
коммерческие виртуальные машины
компилируют байткоды в машинные коды для
быстрого выполнения.
Smalltalk также использует другие
современные идеи:
• Сборка мусора встроена в язык и незаметна
разработчику.
• Программы Smalltalk обычно компилируются в
байткоды и выполняются виртуальной
машиной (ВМ), что позволяет выполнять их на
любом оборудовании, для которого
существует ВМ.
Одной из неожиданных особенностей Smalltalk
является то, что традиционные конструкции:
if-then-else, for, while, и т. д. не являются
частью языка. Все они реализованы с помощью
объектов.
Например, решение принимается с помощью
посылки сообщения ifTrue: логическому объекту,
и передаёт управление фрагменту текста, если
логическое значение истинно. Есть всего три
конструкции:
• посылка сообщения объекту;
• присваивание объекта переменной;
• возвращение объекта из метода;
"Почему Smalltalk? Потому, что Smalltalk
использует упрощенный вариант английского.
Существительные и глаголы. Объекты - это
существительные. Глаголы - это сообщения,
посылаемые от одних объектов к другим.
Просто, как раз, два, три. Больше не нужно
писать непонятные программы. Значит, почти
каждый может научиться писать программы на
Smalltalk-е"
-- Питер Вильям Лаунт.
Символ | определяет переменные, : определяет
параметры, а символы [ и ] можно, для начала,
воспринимать, как аналог фигурных скобок { и } в
Си-подобных языках:
| aString vowels |
aString := 'This is a string'.
vowels := aString select: [:aCharacter | aCharacter
isVowel].
В последней строке посылается сообщение select:
с аргументом (блоком кода). При этом вызывается
метод select: из класса Collection (одного из
предков класса String).
Простой пример
Transcript show: 'Hello world!’
• Посылка сообщения: в Smalltalk все действия
производятся путём посылки сообщений объектам. В
данном случае сообщение это show: 'Hello world!', и
оно посылается Transcript. Для обработки этого
сообщения будет вызван метод Transcript show:,
который должен рассмотреть свой аргумент (строку
'Hello world!') и отобразить этот аргумент на
transcript.
• Этот пример показывает основной синтаксис посылки
сообщения в Smalltalk: <получатель сообщения>
<пробел> <сообщение>. В отличие от C++, нет точек
после получателя, и нет скобок вокруг аргументов.
Пример объекта
Определение класса
Object subclass: #MessagePublisher
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Smalltalk Examples’
Это простое определение класса с
определением имени и категории. Обычно
среда разработки предоставляет заготовку с
большей частью текста этого примера.
Определение метода
publish
Transcript show: 'Hello, world!’
Это определение метода с именем publish. Тело
метода такое же, как в простом примере.
Вызов метода
MessagePublisher new publish
В данном примере создаётся экземпляр класса
Практически все среды разработки Smalltalk
имеют следующие утилиты/возможности:
• Workspace - окно в котором можно ввести любой код и
выполнить одно из следующий действий:
Evaluate it - выполнить блок кода,
Display it - выполнить и вывести результат,
Inspect it - выполнить и результат просмотреть в
отдельном окне Object Inspector.
• Inspector - позволяет просматривать внутреннее
строение объекта - его значение, внутренние поля,
индексированные поля для объектов с переменной
длиной. Значения полей выводятся в окошке,
аналогичном Workspace, в котором можно ввести любое
выражение, нажать Accept, и полученное значение будет
занесено в поле.
• Class Browser - утилита, в которой, собственно,
и происходит разработка приложений. Class
Browser Она включает в себя три обязательных
элемента (панели): иерархия всех классов в
системе, список полей/методов выбранного
класса, исходный текст выбранного метода
функции поиска:
найти класс по имени/шаблону;
найти методы по имени/шаблону;
найти методы, которые вызывает метод с заданным
именем/шаблоном;
найти методы, содержащие заданный текст и т.д.
• Debugger - также является основным
инструментом разработки. Так как Smalltalk
является динамическим языком, то в нем можно
ввести синтаксически-корректную конструкцию,
которая вызовет ошибку во время выполнения
из-за того, что в объекте-получателе не найден
нужный метод.
В различных реализациях Smalltalk также
имеются свои специфические утилиты для
создания пользовательского интерфейса,
создания отдельного исполняемого файла и т.д.
Реализации
•
•
•
•
•
•
•
•
•
•
•
•
VisualWorks
Squeak — современная открытая реализация Smalltalk с
полноценной средой разработки (окна, редактор и т. д.).
Один из основателей — Алан Кей.
Pharo
ObjectStudio
IBM VisualAge for Smalltalk
Dolphin Smalltalk
Smalltalk/X
GNU Smalltalk
Smalltalk MT
LSW Vision-Smalltalk
Ambrai Smalltalk
Huemul Smalltalk
Squeak — язык программирования, диалект языка
Smalltalk. Имеет кросс-платформенную реализацию
(Windows, Linux, Macintosh).
Первоначально Squeak был разработан группой
программистов Apple Computer, в которую входили
некоторые разработчики Smalltalk-80.
Разработка была продолжена той же группой уже в
Walt Disney Imagineering.
В Squeak реализовано несколько графических
подсистем (в том числе MVC, унаследованная от
оригинального Smalltalk-80, в текущей версии не
поддерживается, работает в версиях младше 3.8).
Однако основной является собственная
графическая подсистема Morphic (портированная
из Self).
Помимо самой среды под открытой лицензией
распространяется книга Squeak by Example.
К недостаткам следует отнести низкую
производительность виртуальной машины,
довольно своеобразный GUI и малое количество
документации.
Download