Smalltalk: Концепция объектно-ориентированного программирования

А.Г. Иванов, Ю.Е. Кремер

Компьютер Пресс, N 4, 1992 г.

1. Введение

"Наша информационная среда (LPE) приобрела свою мощность, дружественный интерфейс и расширяемость благодаря использованию Смолтока - самой передовой системы для разработки пользовательских интерфейсов на сегодняшний день".

Тригр Реенсканг, Центр Индустриализации, Осло [2]

"Если в вашем мышлении произошел сдвиг от процедурного к объектно-ориентированному программированию, вы выберете Смолток как идеальную среду для разработки прикладных программ".

Бил Сайдэм, обозреватель "Computer Language" [3]

За последние два года подобные отзывы стали частым явлением в западной прессе, свидетельствующим о признании Смолтока мировой компьютерной общественностью, как не просто конкурентоспособного языка для разработки сложных программ, но и потенциального лидера среди систем программирования вообще.

Smalltalk/V - версия Смолтока, разработанная фирмой Digtalk Inc. для машин линии IBM-PC, становится мировым бестселлером No 1 1991 года. Вариант этой системы для MS Windows занимает первое место в конкурсе систем программирования в этой среде, проводимом журналом PC Week. Другой вариант - для OS/2 Presentation Manager (PM) - по мнению председателя Microsoft Corp. Била Гейтса "сделает PM преемником MS/DOS". Наконец, поразительный по мощности и уникальным возможностям Smalltalk/Objectworks (версия фирмы ParcPlace Systems для всех популярных мощных компьютеров и операционных систем) завершает прорыв Смолтока в мир коммерческих программных систем.

Дату появления языка на свет обычно связывают с публикацией в августовском номере журнала Byte за 1981 г. серии статей, посвященных только что разработанной в научно-исследовательском центре PARC (Palo Alto Research Center) фирмы Xerox, версии Smalltalk-80. Смолток-80, который до сих пор считается неофициальным стандартом языка, явился результатом проводимой с начала 70-х годов в PARC (ныне ParcPlace Systems Inc.) работы по созданию системы программирования, поддерживающей абсолютно новую по тому времени и многообещающую концепцию объектно-ориентированного программирования (ООП). Новая система, помимо ООП, предлагала целый букет новых технологических идей: графический интерфейс с перекрывающимися окнами, иерархическое выставление меню, использование "мыши" и пр. Эти идеи были активно приняты и легли в основу современных интерфейсов Macintosh, Microsoft Windows, Presentation Manager и Unix X Window System. Смолток является "дедушкой" Си++, объектного Паскаля и других современных языков, поддерживающих "наследование", "инкапсуляцию" и "полиморфизм", и в отличие от своих "внуков" целиком построен на принципах ООП (см. рис.1).

Закономерен вопрос: почему же тогда за прошедшие десять лет Смолток даже отчасти не претендовал на ту популярность, которую приобрел, скажем, Си++?

Во-первых, и это главная причина, Смолток нуждается в мощной аппаратной поддержке. Первая версия Смолтока 80 работала на рабочей станции фирмы Xerox, сделанной на процессоре М68010 и стоившей 100000 долларов (к слову, Macintosh фирмы Apple построен по принципу этой машины). Естественно, мало кто мог позволить себе такую роскошь. Перспективы расширились с появлением и распространением относительно доступных по цене рабочих станций фирм Sun, Apple, HP и DEC, а также новых моделей IBM PC с памятью свыше 2Мб и PS-2. Естественно, что технические трудности на Западе обернулись непреодолимым препятствием в СССР.

Второй причиной является чисто психологическая трудность перехода на новый тип мышления в программировании, требуемый Смолтоком, в отличие от, например, объектного Паскаля, в котором программист может просто не использовать средства ООП.

За прошедшие десять лет, однако, ситуация изменилась. Рывок в микропроцессорной технологии обеспечил Смолтоку достаточную аппаратную поддержку. Многотиражное распространение гибридных языков типа Си++, успешно работающих как на супер, так и на маломощных ПК, последующее появление объектно-ориентированных баз данных, активная пропаганда ООП его апологетами, а также появление в 1986 г. массовой учебной версии для линии IBM PC (алфавитно-цифровая система Methods фирмы Digitalk Inc., выросшая затем в Smalltalk/V) привели ко всеобщему признанию ООП как передовой технологии программирования, применение которой в условиях современного кризиса ПО (когда цена оператора порой сравнима с ценой микропроцессора) многими рассматривается как необходимость.

Со второй половины 80-х годов начинают проводиться конференции, отчасти или целиком посвященные вопросам ООП. На конференции OOPSLA'89 ведущие специалисты IBM Брюс Мартин и Нейт Эдвардс проводят панельную дискуссию, посвященную возможности научно-технической революции в ПО, обусловленную технологией ООП. Появляются новые журналы с чисто объектно-ориентированной тематикой, а с сентября 1991 г. выходит журнал Smalltalk Report, издающийся в Оттаве, Канада. В 1991 г. конференции, посвященные ООП, проходят одна за другой: ECOOP в Женеве; TOOLS USA,91 в Санта-Барбаре, США; IFIP в Квебеке; TOOLS'91 в Париже, "Конференция разработчиков Smalltalk/V" в Лос Анжелесе; SCOOP-Europe в Лондоне, OOPSLA в Финиксе, США и др. Причем Смолток - в центре внимания многих из них. Наконец, в сентябре в Братиславе, Чехоcловакия, прошла первая восточноевропейская конференция по ООП EastEurOOPe, знаменующая вступление Восточной Европы в мир ООП. Открывала конференцию Адель Голдберг, президент ParcPlace Systems и автор Смолтока-80, а над сценой зала, где проходила конференция, висел огромный разноцветный воздушный шар - символ Смолтока.

В условиях возможно приближающегося бума, вероятно, уместно будет напомнить, что из себя представляет Смолток и какие принципы лежат в его основе.

2. Концептуальная основа языка Смолток

Объектно-ориентированное программирование - это средство, парадигма для написания "хороших программ".

Бьярн Страуструп, автор Си++, Bell Lab [4]

Что такое "хорошая программа"? Это программа, которая безотносительно к тому, как и на чем она была написана, обладает следующими очевидными качествами:

  1. Допускает повторное использование для разработки других программ.
  2. Расширяема, т.е. требует минимальных затрат на перепрограммирование при внесении дополнительных свойств или модификации существующих.
  3. Надежна.
  4. Мобильна, т.е. подразумевает минимальные затраты при переносе на другие платформы.
  5. Дешева. Затраты на реализацию проектов бывают столь высоки, что порой от них приходится просто отказываться.

Принципы ООП представляют лучший из известных ответов на вопрос "как писать хорошие программы?" Этот ответ вытекает из бесчисленных дискуссий, статей, научных отчетов и материалов конференций и опыта разработки ПО за последнее десятилетие. Более или менее полная аргументация - скорее предмет книги, а не статьи; прекрасный пример такой книги - "Конструирование Объектно-Ориентированного ПО" [5] Бертранда Мейера (Б. Мейер - президент Interactive Software Engineering Inc. и автор объектно-ориентированного языка Эйфель). Здесь будет уместно привести принадлежащее Мейеру определение:

"Объектно-ориентированный дизайн - это построение программных систем как структурированных наборов реализаций абстрактных типов данных".

За этим емким определением стоит ряд общепринятых понятий в теории ООП, главными из которых являются инкапсуляция, наследование свойств и динамическое связывание.

Попробуем дать пояснение к определению Мейера, попутно введя эти основные понятия:

Основная мысль заключается в построении (разработке) программы из классов объектов, которыми она манипулирует, а не из функций, которые над ними (объектами) выполняются. Под классом подразумевается реализованный абстрактный тип данных, а под объектом - конкретные данные, т.е. экземпляр данного типа (класса). Например, 5 - экземпляр класса ЦелоеЧисло, а 'привет' - экземпляр класса Строка. Что касается функций, то они определяются свои - над каждым типом данных, при этом сами данные (объекты) оказываются доступными только через эти функции, составляющие официальный интерфейс данного класса, другими словами, реализация типа полностью скрыта (инкапсуляция).

Слово набор отражает принцип модульности, по которому должны проектироваться классы - как компоненты системы, не зависимые друг от друга. Так, что если вы в дальнейшем меняете что-то в одном компоненте вы не должны будете модифицировать другие - принцип, трудно реализуемый на практике, и Смолток дает лучшие средства для его соблюдения.

Инкапсуляция способствует соблюдению этого принципа, но не является панацеей. Очень важным качеством является полиморфизм, т.е. возможность не определять заранее в программах для данного класса (функциях) используемые типы, а дать им возможность определиться самим во время выполнения и, как следствие, дать возможность определиться функциям, над ними выполняемым (динамическое связывание).

Наконец, слово структурированность отражает наличие важных связей между классами, в частности наследование, которое дает возможность избежать дублирования программ или описаний в одном классе, если они уже реализованы в другом.

Еще раз подчеркнем, что процесс программирования в рамках концепции ООП мыслится как "конструирование" ПО из уже существующих и вновь созданных на их основе компонент, а эти компоненты - реализации абстрактных типов данных (или, по другому, классы).

И еще: сразу отметим, что ООП - программирование в терминах "объект" и "класс" - адекватно способу естественного человеческого мышления, ибо человек мыслит "образами" и "абстракциями".

Уже из приведенного определения в достаточной степени явствует, что разработанная таким образом программа будет и доступной к повторному использованию; и расширяемой, поскольку состоит из независимых компонент; и надежной, поскольку старые компоненты уже отлажены, а новые допускают независимое тестирование; и относительно дешевой, поскольку не надо программировать с самого начала и сам процесс программирования идет легче; и мобильной, поскольку зависимые от платформы части скорее всего будут "упрятаны" в небольшое количество низкоуровневых компонент.

Объектно-Ориентированная Система Программирования (ООСП) - это система, поддерживающая объектно-ориентированный стиль. Смолток является именно такой системой. Он полностью отвечает концепции ООП. Кто-то может оспаривать это утверждение, указывая на наличие в Смолтоке иерархического наследования, вместо множественного. Оставим дискуссию о его необходимости в Смолтоке, как и дискуссию о необходимости отсутствия контроля типов в ООП, за пределами этой статьи. Несомненно то, что Смолток - наиболее концептуально целостная и самая изящная и всех существующих на сегодняшний день ООСП.

Ниже приведем вкратце еще несколько важных принципов, спорных в отношении своей обязательной принадлежности к ООП, но с блеском реализованных в Смолтоке:

3. Введение в Смолток

"В идеале, средства программирования (библиотеки, отладчики, измерение производительности, изобразительные средства и т.п.) интегрируются в унифицированную среду программирования, лучшим примером которой является Смолток"

Бьярн Страуструп [4]

Формально любую среду программирования можно разделить на три составляющие: язык, средства программирования (в обычном понимании - библиотеки) и интерфейс (визуализация ввода-вывода, отладчики, инспекторы, редакторы, средства работы с файловыми системами и т.п.)

Все три составляющие в Смолтоке объединены в единую среду - набор классов, доступный для расширения и модификации. Описание третьего компонента - интерфейса - не входит в задачу этой статьи. Отметим лишь, что обладая редактором, не уступающим любому сверхсовременному уровня исходных текстов, и оконной графикой, не уступающей любой современной Windows, вместе с дополнительными инструментами интерфейс Смолтока вполне может претендовать на лидерство среди существующих для супер-ПК интерфейсов.

3.1. Язык

Смолток включает в себя несколько больше, чем охвачено в рамках этого раздела, но не намного, ибо Смолток - отвечая своему имени - действительно "маленький" язык.

Основные Понятия
объект
структура данных с конкретной информацией, например - конкретное число - 555. Простые объекты - базовые единицы системы - это числа, байты и символы. Сложные состоят из простых и других сложных. Каждый объект принадлежит какому-либо классу
класс
описатель структуры и функционирования объекта (или абстрактный тип данных, описывающий состав и поведение каждого объекта данного типа). Чтобы создать конкретный объект, классу (который тоже является объектом), надо послать сообщение новыйЭкземпляр
экземпляр класса
синоним объекта
метод
программа, реализующая некоторую функцию, определенную над объектами данного конкретного класса
сообщение
вызов метода
имя сообщения
имя сообщения, например открытьФайл:для:вКаталоге:

Весь синтаксис Смолтока сводится к посылке объекту сообщения, например 5 факториал - сообщение факториал посылается объекту 5. Поскольку объект 5 - целое число, в классе ЦелоеЧисло находится и выполняется метод с именем факториал. В Смолтоке сотни классов и тысячи методов. Все они имеют имена (часто довольно длинные), отражающие их семантику. Например, 'привет' вывестиНаПринтер выводит строку 'привет' на принтер. Это значительное улучшает читаемость программ. В данной статье все примеры в целях лучшей читаемости и экономии места приведены на русскоязычном Смолтоке.

унарное сообщение
сообщение без аргументов, имя которого состоит из одного слова, например 5 факториал
бинарное сообщение
сообщение с одним аргументом, имя которого состоит из одного или нескольких специальных символов, напр. 5 + 10 (сообщение + с аргументом 10)
составное сообщение
сообщение с одним или несколькими аргументами, имя которого состоит из нескольких слов, оканчивающихся двоеточием, например:
ДискВ открытьФайл: 'tmp' для: #запись вКаталоге: '\rus\user'
выражение
синтаксическая единица - последовательность сообщений, заканчивающаяся точкой, например 6 * (8 - 5) факториал. Порядок вычисления: сначала вычисляются выражения в круглых скобках, затем - последовательно - унарные, бинарные и составные сообщения. Вычисление сообщений одинакового приоритета ведется слева направо. Результатом вычисления в приведенном примере будет целое 36. Любой метод всегда возвращает объект. Результатом вычисления выражения всегда является объект, возвращенный последним выполненным методом.
имена переменных
имена, используемые для ссылок на объекты. Имена могут быть глобальными и локальными. Локальные существуют только на время выполнения метода, в котором они определены; они начинаются со строчной буквы. Глобальные существуют постоянно и начинаются с прописной буквы.
имена переменных экземпляра
в методах, определенных в конкретном классе, используются для ссылок на элементы содержимого объектов этого класса. Их имена начинаются со строчной буквы. Это, если хотите, названия полей в структуре объекта. Например, в классе Прямоугольник определены две переменные экземпляра - верхнийЛевыйУгол и нижнийПравыйУгол. Это означает, что объект прямоугольник состоит из двух объектов. Фактически это должны быть экземпляры класса Точка. Точки, в свою очередь, состоят из двух целых чисел, x и y. Таким образом, физически, в памяти, каждый объект - это набор ссылок на другие объекты. Такой подход обусловливает значительную экономию памяти. В языке существуют также индексированные переменные экземпляра. Если объект состоит, скажем, из четырех, а в классе указана одна именованная переменная, то остальные три являются индексированными, а доступ к ним осуществляется путем посылки объекту сообщения вПозиции: индекс, а не указанием имени. Массив, например, - целиком индексируемый объект
имена переменных класса
глобальные имена, отличающиеся тем, что определены только в данном классе и доступны только из методов этого класса
суперкласс/подкласс
классы связаны отношением наследования. Подкласс наследует свойства своего суперкласса. Например Строка наследует свойства Массива, поскольку строка - это массив символов. Массив, в свою очередь, наследует от Набора, ибо он - разновидность набора; при этом Строка, как следствие, тоже наследует от Набора (иерархическое наследование). Класс не может иметь более одного непосредственного суперкласса (т.е. в языке нет множественного наследования).
Наследовать свойства
значит наследовать имена переменных класса и экземпляра, и методы. Методы, которые нежелательно наследовать, могут быть переопределены.

Процесс программирования на Смолтоке заключается в программировании классов, т.е. описании типов объектов. Технически, запрограммировать класс - это:

  1. указать, чьим подклассом он является;
  2. указать имена переменных класса;
  3. указать имена переменных экземпляра;
  4. определить (запрограммировать) методы и таким образом специфицировать поведение объектов данного класса.
присваивание
указание, на какой объект ссылается данная переменная (точнее, ее имя). Примеры:
ЧислоПродаж := 1550.
точкаА := точкаБ + точкаВ
литералы
существует несколько классов, объекты которых могут представляться в программах явно, без использования переменных. Это Числа (10; 16r5A ; 8e); Строки ('привет'); Массивы (#(5 'привет' 16r5A) - массив из трех элементов); Символы ($A; $#) и Блоки. Программа - это тоже объект, ее удобно иногда задавать явно, например для организации циклов. Она выделяется квадратными скобками и называется блоком. Пример: [:счетчик | счетчик факториал - 1 ]. Здесь счетчик - временная переменная блока.

Выполнение Смолток-программы - это последовательное выполнение посылок сообщений объектам. Во время выполнения определяется, какой объект получил то или иное сообщение. В классе этого объекта ищется метод, соответствующий данному имени сообщения. Если он найден, то выполняется, если нет - ищется в суперклассе и так по иерархии до самого старшего класса, Объект, описывающего общие свойства всех объектов (например - иметь размер). Если имя сообщения не найдено и там, фиксируется ошибка. Это самый распространенный, едва ли не единственный тип ошибок в Смолток-программах.

сам (self)
элемент языка, используемый для обозначения в методе самого объекта - получателя соответствующего этому методу сообщения. Часто для выполнения какого-либо метода, объекту приходится посылать сообщения самому себе
супер (super)
элемент языка, дающий неочевидное, но иногда очень полезное средство использовать метод суперкласса вместо переопределенного в своем классе. Отличается от сам только тем, что метод ищется, начиная с ближайшего суперкласса

Мы привели практически все понятия языка. Перед тем, как перейти к примеру программы, заметим, что это - необходимый и достаточный минимум. Любой программист заметит отсутствие в языке конструкций организации циклов и условий. Дело в том, что модель объект-сообщение достаточна для организации подобных конструкций средствами языка. В системе есть классы Истина и Ложь, имеющие единственные экземпляры. В обоих классах определено сообщение еслиИстина: с блоком в качестве аргумента. Соответствующий метод в классе Истина просто выполняет этот блок, а в классе Ложь - вообще ничего не делает. Такое сообщение посылается объекту - результату вычисления выражения (в частности - просто результату посылки какого-либо сообщения). Пример:
(числоА < 100) еслиИстина: [Терминал звонок]
заставляет терминал пищать, если числоА меньше 100. Круглые скобки здесь необязательны.

Примеры
Пример 1.

Предположим, перед окончанием работы вы хотите отправить нескольким адресатам сообщение типа: 'До свидания! Ю.К.' Этих адресатов, допустим, четыре - два удаленных терминала (ваш компьютер включен в сеть), окно системной информации на вашем экране, и дисковый файл почты.

Пусть все эти адресаты - уже существующие в системе объекты разных классов. Если их нет, их надо будет создать.

Первое, что вы делаете, это создаете новый объект - множество объектов-адресатов. Поскольку вы захотите, чтобы этот новый объект жил долго, вы заведете для него глобальную переменную:
Адресаты := Множество новыйЭкземпляр.

Компилятор сам включит Адресаты в число глобальных переменных. Теперь вы заполняете вновь созданное множество нужными объектами:
Адресаты добавитьЭлемент: УдаленныйТерминал1.
(затем, аналогично, ФайлПочты и т.д.). Теперь сама программа, вариант 1:
| сообщение | сообщение := '01.12.91 17:30 До свидания! Ю.К.'. Адресаты дляВсехЭлементовВыполнить: [ :элемент | элемент поместитьНабор: сообщение]
Временные переменные (здесь одна - сообщение) указываются в вертикальных черточках. Метод дляВсехЭлементовВыполнить: определен в классе Набор и наследуется Множеством. Он выполняет заданный аргументом блок столько раз, сколько элементов содержится в наборе - последовательно, для каждого элемента этого набора. Сообщение поместитьНабор: определено во всех нужных нам классах. Методы разных классов выполняют, по сути, одну и ту же функцию, но делают это, разумеется, по-разному: одно дело вывести строку в окно, и совсем другое - отправить ее в коммуникационный порт. Какие методы когда будут работать - определится динамически, во время выполнения программы, в зависимости от того, какому классу будет принадлежать обрабатываемый в данный момент объект.

Для того, чтобы пользоваться этой программой в дальнейшем и сделать ее применимой для разных строк передаваемого текста, ее можно определить в классе Строка.

Вариант 2 (метод класса Строка):
отправитьВсемАдресатам "Отправить всем элементам множества Адресаты строку-получатель в качестве сообщения" Адресаты дляВсехЭлементовВыполнить: [ :элемент | элемент поместитьНабор: сам ]

В кавычках дан комментарий. Теперь вы сможете пользоваться этим методом для разных строк, например:
'Привет!' отправитьВсемАдресатам.

Эта программа иллюстрирует замечательное преимущество динамического связывания. Предположим, вы хотите выводить вашу строку еще и на принтер. Все, что надо сделать, это выполнить:
Адресаты добавитьЭлемент: Принтер.
Нет необходимости что-либо менять в программах. Затраты на модификацию минимальны.

Метод отправитьВсемАдресатам не отражает преимуществ наследования. Поэтому приведем еще один пример.

Пример 2.

Предположим у вас разработана система моделирования транспортного движения в городе - классы типа Улица, Перекресток, Светофор и т.п. и, конечно, Автомобиль. У класса Автомобиль, очевидно, есть подклассы: Легковой, Автоцистерна и т.п. Теперь вам понадобилось внести в работу системы снегоуборочную машину. Вы определяете класс СнегоУборочнаяМашина как подкласс класса Автомобиль и программируете только специфические для нее свойства - в остальном она будет работать также, как и все остальные автомобили. Не надо заботиться и о выделении памяти: как объект вообще, машина наследует от класса Объект соответствующие методы. Перепрограммирование других классов системы также не требуется.

3.2. Средства Программирования

Средствами программирования в Смолтоке являются все его классы (в т.ч. и те, которые реализуют интерфейс системы) - их несколько сотен.

Классы образуют древовидную иерархию по принципу подкласс-суперкласс. Старшим в иерархии является класс Объект, описывающий свойства, общие для всех объектов. Остальные - его подклассы - описывают поведение всех мыслимых потенциально полезных программисту типов данных - от самого низкого до самого высокого уровня (целые и комплексные числа, точки, рамки, окна, меню, словари, файлы, каталоги, потоки и т.п.). Все компоненты интерфейса (отладчики, редакторы, файл-сервер и т.п.) - объекты соответствующих классов иерархии. Они также целиком и по частям могут быть использованы как составные части пользовательских программ. Поддержка настолько мощна, что даже не для всех задач есть необходимость создавать новые классы. При необходимости же, их легко строить.

"Программисты приобретают уверенность в том, что если в системе отсутствует то или иное средство, они легко смогут его создать"

Брайан Фут, профессор Иллинойского университета, США

4. Реализация

4.1. Основной Принцип

Принцип реализации Смолтока проиллюстрирован на рис.2


  -------------------------------------------     -----------
 |           ВИРТУАЛЬНАЯ МАШИНА              |   |ВИРТУАЛЬНАЯ|
 | -----------   -------------   ----------  |   |  ПАМЯТЬ:  |
 ||Примитивные| |Интерпретатор| |Управление| |   |           |
 ||  методы   | |  байт-кодов | | памятью  | |   |  Объекты  |
 | -----------   -------------   ----------  |   |           |
 |                                           |   |           |
  ------------------------------------------      -----------


   -------------------------------        -----------------
  |      П Р О Ц Е С С О Р        |      |   ОПЕРАТИВНАЯ   |
  |                               |      |   П А М Я Т Ь   |
   -------------------------------        -----------------

     Рис. 2  Смолток: Принцип реализации

Всем объектам системы, в т.ч. классам и методам, поставлены в соответствие их номера. Эти номера - виртуальные адреса объектов, образующие адресное пространство виртуальной памяти. Отображение виртуальной памяти в физической называется образом системы.

Виртуальная машина (ВМ) - это программно реализованный 8- битовый процессор, интерпретирующий так называемые байт-коды. Байт-коды - это инструкции ВМ, а Смолтоковские методы - это программы в байт-кодах, другими словами компилятор Смолтока транслирует программы в промежуточный код, который затем интерпретируется ВМ. Типичный пример инструкции ВМ - "послать объекту, находящемуся в n-й позиции контекста, сообщение, имя которого находится в m-й позиции области литералов метода, с аргументом в k-й позиции контекста". Таким образом, язык Смолток относится к языку ВМ примерно как ассемблер к машинным кодам.

Примитивные методы - это методы Смолтока, написанные на других языках (обычно на ассемблере, например "умножение"). Это - низкоуровневый интерфейс Смолтока с внешним миром; через них осуществляется работа с ресурсами вычислительной системы, связь с другими программными средствами (например, базами данных). Пользователь может включить свои программы, написанные на других языках, в виртуальную машину в качестве примитивных методов.

Такой подход к реализации естественным образом вытекает из принципа построения системы. Отсюда же - и ее технические характеристики:

4.2. Технические характеристики

Компактность

Одной из характерных особенностей системы, сразу же бросившейся в глаза при появлении первой ее версии - удивительная компактность в исходных текстах. Первая версия Смолток-80 по своей функциональной нагрузке была сравнима со своим современником ОС UNIX. И та, и другая, включали редакторы, компиляторы, отладчики, сетевое ПО и т.п; в UNIX было больше языков, но в Смолтоке - больше графики. Исходные тексты UNIX (версия BSD 4.2) содержали 435000 строк, а Смолтока - только 40000.


       ---------------------

             U N I X
1м20см
           435000 строк

                                             Smalltalk-80
                                          ___________________

                                      ___________________
        _____________________         _____40000_строк___ 12см


     Рис. 3. Исходные тексты UNIX BSD 4.2 и Smalltalk-80

Требования к объему оперативной памяти

Виртуальная машина c образом системы находятся в оперативной памяти и, естественно, занимают там значительное место. Например, Smalltalk/V для IBM PC AT - 170 Килобайтов. При этом каждый метод занимает всего десятки байтов, поэтому даже сложные прикладные задачи не приводят к значительному увеличению образа.

Скорость выполнения прикладных программ

Скорость компиляции в Смолтоке необыкновенно высока. Маленькая Смолток-программа транслируется в байт-код и изменившая свое поведение система готова к выполнению. Стадия редактирования связей отсутствует. Этого, к сожалению, нельзя сказать о скорости самих прикладных программ, которые интерпретируются ВМ.

Разработчики Смолтока оспаривают интерпретационный характер системы. Они называют Cмолток системой динамической компиляции. Главный аргумент - наличие в последней версии Smalltalk/Objectworks кэш-памяти, хранящей активные программы в машинном коде. Действительно, в современном мире динамических библиотек и скоростных загрузчиков различие между компилятором и интерпретатором становится все менее важным, а скоростные качества Смолтока за последнее время заметно улучшены.

"Хорошо написанная Смолток-программа обычно работает так же быстро, как ее эквивалент на Си, а за время, которое вы сэкономите (на программирование) вы сможете написать еще две или три"

Абдул Наби, директор оффиса Knowledge Systems Corp., США

Это, в общем справедливое, утверждение необходимо прокомментировать. В больших прикладных системах часто образуются "узкие места" - слишком медленно работающие компоненты; они перепрограммируются, например, на Си или ассемблере). Их содержание в проекте, как правило, незначительно - доли процента.

Мобильность прикладных программ

Здесь Смолток - безусловный лидер. Он намного мобильнее, чем, скажем, Си. Кроме того, что в Смолтоке машинно-зависимые части "упрятаны" в небольшое количество стандартных примитивных методов, что обеспечивает более высокую переносимость на уровне исходных текстов, он предлагает нечто большее - переносимость на уровне двоичных файлов. Техническое решение очевидно - образ системы, заключающий в себе все объекты, на каждом компьютере интерпретируется соответствующей виртуальной машиной. Последняя версия фирмы ParcPlace - Smalltalk/Objectworks R.4 - полностью реализует эту идею.

"Изумительно было видеть, как прикладная система для Open Look (Sun) переносится в оконную среду Macintosh за 5 мин."

Джон Раймер, аналист Patricia Seybols's Office [6].

Smalltalk/Objectworks R.4 более чем в 5 раз дороже предыдущей версии. "Тотальная" переносимость - основная причина этого беспрецедентного скачка в цене.

4.3. Требования к аппаратуре

Жадная до памяти и небыстрая система может, тем не менее, в усеченном виде, успешно работать на IBM PC AT и даже XT (как, например, Smalltalk/V). Однако для коммерческих приложений необходим минимальный объем памяти 4 Мб и более мощная аппаратура (см. 6. Версии). Требования к аппаратуре и функциональные качества системы определяют сферу ее применения.

5. Области применения

Выделим три основные сферы применения:

  1. Обучение. Пользователи: университеты, колледжи, школы. Цель использования: образование.
  2. Индивидуальное. Пользователи: фирмы разнообразного профиля. Цель использования: решение внутренних задач.
  3. Коммерческое. Пользователи: фирмы-разработчики ПО. Цель использования: разработка ПО для конечного пользователя.

5.1. Обучение

Смолток - чисто объектно-ориентированный язык. Он поддерживает объектно-ориентированный стиль программирования и оказывает сопротивление процедурному. Недостатки программ, написанных на Смолтоке в процедурном стиле, видны особенно отчетливо - они некрасивы, труднее отлаживаются и модифицируются. Поэтому Смолток - идеальная система для обучения объектно-ориентированному программированию.

Любопытно, что авторы Смолтока начинали свою работу, ставя перед собой задачу создать такую систему программирования, которую легко могли бы освоить дети. Сейчас это серьезная мощная система (отнюдь не для детей), однако простота и универсальность лежащих в ее основе концепций, единообразие и легкость доступа практически ко всем компонентам вычислительной системы, для многих может стать ключом к двери в сложный и многообразный мир вычислительной техники. Поэтому Смолток - прекрасная система для обучения программированию вообще.

Относительно дешевая версия Smalltalk ($100) для IBM PC AT фирмы Digitalk, и политика ParcPlace Systems, дающей 90% скидку университетам, делают Смолток широко доступным для использования в этой сфере.

5.2. Индивидуальное использование

Применение Смолтока в этой сфере продемонстрируем на конкретном примере.

Однажды авторам пришлось выполнять заказ СП "Элби" на обработку большого количества файлов с текстами словарей. Эти файлы, частично введенные вручную, частично считанные сканером, изобиловали ошибками, перемежающимися буквами латинского и русского алфавитов в словах, несогласованными форматами, нарушенными ссылками, дублями и т.п.

Работа должна была быть выполнена на "слабой" IBM PC AT (640К). Авторы, некогда входившие в группу разработчиков ОС ИНМОС - русифицированной версии UNIX и, следовательно, хорошо знающие язык Си, оценили эту работу в 15 человеко-дней программирования на Си и, затем, около 3-х часов самой обработки. Работа была сделана в ТМООП (русской учебной версии Смолтока для PC AT) за 3 дня. Сама обработка на машине велась 8 часов (см. рис. 4).

_______________________________________ _
Программирование на Си: 120 часов           Работа программы

                              _________ ___
Программирование на Смолтоке  _________ ___ Работа программы


     Рис. 4.  Время,  требуемое на решение частной  задачи  по
              обработке текстовых файлов: выбор средства

В дальнейшем пришлось выполнять еще один подобный заказ, но с измененными требованиями, в частности, был изменен принцип сортировки. Перепрограммирование заняло менее двух часов.

5.3. Коммерческое использование

На рис. 5 (весьма, конечно, условно) изображена зависимость стоимости разработки программ от класса решаемой задачи. Си представляет процедурные языки, Смолток - объектно-ориентированные. Заметим сразу, что гибридные языки вели бы себя соответствующим образом - как нечто среднее, при этом характеристики Си++ почти везде были бы лучше, чем у Си, кроме простых задач, т.к. Си++ дороже Си. Прерывистая линия обозначает некоммерческое использование Смолтока на "слабых" ПК. Для разработки конкурентоспособных программ Смолтоку нужна более мощная аппаратура. Скачки на графиках обозначают необходимость смены аппаратуры на более мощную.


| Затраты:
|    Оборудование
|    Средства программирования
|    Программирование
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|                                            Сложность задачи:
______________________________________________________________
Драйверы устройств Спредшиты,Редакторы Сложные информационные,
                                       экспертн.сист., моделир.

     Рис. 5. Зависимость  стоимости разработки ПО от сложности
             решаемой задачи для ассемблера, процедурных и
             объектно-ориентированных языков

На рисунке не отражены затраты на сопровождение в силу того, что не всякое ПО подразумевает сопровождение. О безусловных преимуществах Смолтока в этом плане уже говорилось в этой статье (расширяемость).

Сложность разработки растет стремительнее сложности задачи. Здесь у Смолтока - лучшая характеристика. Таким oбразом, вступая в область сложных задач мы вступаем в царство ОПП, и чем дальше в сторону сложности, тем весомее претензия Смолтока на "корону".

Итак, сфера коммерческого применения Смолтока - это: интеллектуальные информационные и экспертные системы, системы принятия решений и моделирования, обработка и формирование изображений, сложные программы вообще в управлении и планировании производством, банками, в городском хозяйстве, сельском хозяйстве, географии, геологии, биологии, медицине и т.д.

6. Версии

На западном рынке Смолтока доминируют две фирмы: Digitalk Inc., охватывающая малые модели ПК, и ParcPlace Systems Inc., специализирующаяся по мощным рабочим станциям. Поэтому, фирме, решившей использовать Смолток, не придется разбираться в разнообразии версий. Для каждой платформы существует один - два варианта.

Для пользователей, не владеющих английским языком, в ИПИ РАН разработана русскоязычная версия Смолтока для компьютеров линии IBM PC.

Ниже приводится таблица существующих версий ООСП на базе языка Смолток.

Объектно-ориентированные системы пронраммирования на базе языка Смолток
Версия Платформа Память Диск ОС Оконная
система
Smalltalk Objectworks R.4 Macintosh II или SE/30 с F.P.U 4 Мб 10Мб System 6.0.4 Mulifinder 6.0.4 и 6.0.5 -
Apollo DN3500, 4500 и HP 9000 Series 400 8 Мб 10Мб Domain/OS 10.2 X Window System
DECstation 8Мб 10Мб UWS 2.2D или 4.1 X Window System
HP 9000, Ser. 300 и 400 8Мб 10Мб UX 7.1 или 4.1 X Window System
IBM RISC System/6000 8Мб 10Мб AIX version 3 X Window System
Sun3, Sun4 8Мб 10Мб SunOS 4.0 или 4.1 X Window System
IBM PS-2 и совместимые на 80386 и 486 4Мб 10Мб MS-DOS 3.3 MS Windows 3.0
Smalltalk/V Windows IBM PC AT на 80286 и выше 2Мб 10Мб MS-DOS 3.3 MS Windows 3.0
Smalltalk/V 286 IBM PC AT на 80286 и выше 1Мб 10Мб MS-DOS 2.0 и выше -
Smalltalk/V IBM PC AT и выше 512K 1Мб MS-DOS 2.0 и выше -
Smalltalk/V PM IBM PC AT на 80286 и выше 2Мб 2Мб OS/2 Presentation Manager
Smalltalk/V Mac Macintosh II, Mac SE, Mac Plus 1,5Мб 10Мб System 6.0.4 -
ТМООП русскоязычный Смолток IBM PC XT/AT 512Kб 720Кб Винчест. или 2 НГМД MS-DOS 2.0 и выше -
Smalltalk/Objectworks - торговый знак фирмы ParcPlace Systems
Smalltalk/V - торговый знак фирмы Digitalk
ТМООП - продукт ИПИ РАН

7. Заключение

Последние версии Смолтока для всех популярных суперПК, разработанные за последние годы различными фирмами, дополнительные средства поддержки, в частности, связь со всеми известными СУБД привели ко всеобщему признанию Смолтока как передовой системы программирования. Крупнейшие фирмы, Microsoft и IBM, заключили с ParcPlace и Digitalk соглашения о координации деятельности. Развернута сеть центров обучения технологии объектно-ориентированного программирования.

"Продолжающаяся сильная поддержка IBM и другими компаниями может вытолкнуть Смолток на вершину"

Стюарт Вудринг, аналист Forrester Research Inc., США [7].

8. Литература

[1]
Adele Goldberg, David Robson. Smalltalk-80. The Language and its implementation. Addison Wesley, 1983
[2]
OOPSLA'91. SIGPLAN Notices, V.24, N. 10, 1989, р.327-335
[3]
Computer Language. April 1990
[4]
IEEE Software. March, 1988
[5]
Bertrand Meyer. Object-Oriented Software Construction. Prentice-Hall, 1989
[6]
Journal of Object-Oriented Programming, July-August, 1991
[7]
DATAMATION. July, 1991

НЕОБХОДИМОЕ ПОСЛЕСЛОВИЕ

Готовя данную статью к публикации на страничке "Smalltalk в России", я с удивлением обнаружил, что статья, написанная более 6 лет тому назад не только не утратила, но наоборот приобрела еще большую актуальность. Что изменилось с тех пор? Язык Си++ активно вытесняется Джавой, рынок Смолтока неуклонно растет. Конечно, устарело описание реализаций языка. Фирмы ParcPlace и Digitalk объединились в компанию ObjectShare и выпускают визуальную среду разработки программ VisualWorks/Smalltalk. Вышла на рынок и заняла в нем лидирующую позицию IBM со своим продуктом VisualAge for Smalltalk. На Смолток сделали ставку многие крупные корпорации, такие как Swiss and Europenian Banks, Federal Express, Texas Instruments. И, наконец, совсем недавно о переходе на Смолток заявило Министерство обороны США, начавшее разработку на этом языке крупнейшего проекта взаимодействия объединенных вооруженных сил в глобальном театре военных действий (статью об этом проекте можно найти на вышеуказанной страничке по адресу: www.math.rsu.ru/smalltalk/).

Александр Иванов
5 июня, 1998 г.

Начало страницы

Copyright © А.Г. Иванов, Ю.Е.Кремер, 1992.