Краткий обзор языка 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 и малое количество документации.