Smalltalk - предвестник Java и .NET

"Основная проблема в сообществе программистов на С++ - это попытки использовать стандартный С++ либо как облагороженный С, либо как Smalltalk для бедных".

Бьярн Страуструп,
создатель языка программирования C++

Объектно-ориентированное программирование покорило мир. Технологии Java и .NET прочно завоевали рынок и пока не собираются его никому уступать. А ведь идеи, лежащие в их основе, придуманы давно, и именно Smalltalk вдохновил создателей этих технологий...


Немного мыслей по поводу объектов

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

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

 

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


Что такое Smalltalk?

Прежде чем говорить о роли Smalltalk'а в развитии ООП, стоит, как мне кажется, рассказать о том, что же такое этот самый Smalltalk собой представляет.

Smalltalk - это объектно-ориентированный язык программирования с динамической типизацией. Что значат слова о динамической типизации? В некоторых языках программирования (например, том же C++) типизация переменной выполняется в момент её объявления. То есть, тип переменной известен заранее, что накладывает на её использование определённые ограничения. То есть, даже в весьма гибком C++ нельзя присвоить переменной типа short int целую строку. В более строго типизированных языках (Паскаль, Ада) гибкость в работе с переменными теряется ещё больше - правда, в угоду надёжности программы. В Smalltalk всё иначе: тип переменной определяется во время операции присваивания, то есть за время выполнения программы одна и та же переменная может успеть "примерить" на себя несколько разных типов.

Как это получается? Концептуально всё очень просто - каждая переменная в Smalltalk является объектом. Объекты обмениваются между собой сообщениями - собственно говоря, в этом и состоит выполнение программы. Что интересно, объектами являются не только переменные, но и многое другое - например, память. Такой подход нашёл своё применение и во многих современных технологиях. Например, в Windows все окна обмениваются друг с другом и с самой операционной системой сообщениями, а во многих современных языках программирования, активно используемых в промышленных масштабах, все типы данных - объектные.

Каждая переменная в Smalltalk является объектом. Объекты обмениваются между собой сообщениями - собственно говоря, в этом и состоит выполнение программы. Что интересно, объектами являются не только переменные, но и многое другое - например, память.


Идеи, ещё идеи!

Но, конечно, динамическая типизация - не единственная (и даже не самая главная) идея, сумевшая сделать Smalltalk знаменитым.

Во-первых, модель объектов, обменивающихся сообщениями, приводит к довольно необычным результатам: в Smalltalk нет ключевых управляющих конструкций наподобие циклов, инструкций выбора (if) и других подобных вещей. Почему? Потому что в Smalltalk это реализуется с помощью всё тех же вездесущих своеобразных Smalltalk'овских объектов. Например, в конструкции выбора посылается сообщение для проверки на истинность специализированным объектом, который возвращает код, который должен отправиться на выполнение также в виде специфического объекта. Объекты, кстати, могут не только отвечать на сообщения, но и перенаправлять их - то есть, метафора сообщений довольно глубока и несколько отличается от объектной метафоры, которая используется в том же, например, C++.

Во-вторых, Smalltalk изначально был задуман и реализован как язык, программы на котором выполняются некоторой виртуальной машиной. Ничего не напоминает? Ну да, конечно, Java и .NET - так и видно, как из-за их могучих плеч высовывается Smalltalk. Конечно, нельзя сказать, что Smalltalk был пионером в области виртуальных машин - однако, несмотря на это, во многом именно Smalltalk, как хранилище удачных идей и концепций программирования, повлиял на возникновение виртуальных машин для других языков программирования. Вместе с виртуальной машиной в Smalltalk есть и сборщик мусора - вещь, полезность которой все уже давно успели осознать и оценить.

В-третьих, Smalltalk разрабатывался таким образом, чтобы всё можно было с максимальной лёгкостью менять и перестраивать. Как сказал когда-то один из гуру экстремального программирования Кент Бек, "Smalltalk, с его акцентом на человеческом аспекте программирования, был той питательной средой, на которой выросло Экстремальное Программирование. Smalltalk всё еще не имеет себе равных по уменьшению стоимости изменений в течение всего времени жизни проекта. А это то, без чего существование XP невозможно". Собственно, это просто ещё одно следствие уникальной, безумно удачной объектной модели Smalltalk. Благодаря минимуму встроенных в язык конструкций и механизмов можно легко добавлять собственные (что мешает добавить второй объект для if, который, скажем, будет работать как switch из С++?). Думаю, если экстремальное программирование и дальше будет активно использоваться и развиваться, эта особенность Smalltalk'а окажется ещё более востребованной.

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


Немного о синтаксисе Smalltalk

Чтобы разбавить описание возможностей языка, приведу пример программы на нём - ведь язык характеризуется не только возможностями, но и синтаксисом. Эта программа написана на Dolphin Smalltalk. В качестве задачи на интуицию (она для программиста тоже полезна) и логику предлагаю попытаться самим догадаться самостоятельно, что же именно эта программа делает. Правильный ответ - в конце статьи.

Вертикальная палочка определяет переменные, двоеточие определяет параметры, а квадратные скобки, в данном случае, являются аналогом фигурных в C-подобных языках.

Итак, программа:

words := 'ma79ma 9n8e7 mila r1a2m3u' subStrings.
sortedWords := words asSortedCollection: 
[:a :b |
(a reject: [:each | each isDigit])
<= (b reject: [:each | each isDigit])].
sortedWords inject: ''
into: [:a :b |
a = '' ifTrue: [ b ] ifFalse: [ a, ' ', b ] ].


Ну а теперь...

А теперь немного истории. Совсем немного, потому что, хотя история создания Smalltalk, как история любого языка программирования, по-своему интересна и поучительна, но место в газете ограничено.

Местом, где создавался Smalltalk, стал легендарный Xerox Palo Alto Research Center (XPARC). Да-да, этот язык программирования придуман там же, где и графический пользовательский интерфейс, и многие другие ИТшные блага. Основной идеей, легшей в основу языка, была идея создания объектно-ориентированного языка программирования, предельно простого в описании и основанного на модели обмена сообщениями. В качестве основы был взят язык Симула, первый объектно-ориентированный язык программирования, так и не ставший популярным в массах из-за не слишком качественной реализации.

Впрочем, ни первая версия, 1971 года выпуска, ни вторая, 1972-го, не смогли предложить ничего такого, чтобы стать всемирно известными, а потому авторы не выпускали их за пределы XPARC. Сейчас их даже принято относить к отдельному языку программирования, настолько они отличались от того, что в результате кропотливого труда было создано разработчиками языка к 1980 году. В этой версии уже было наследование, метаклассы, и именно эту версию языка впервые увидела широкая общественность.

Сейчас существует несколько разных диалектов Smalltalk и версий его реализации. Самые распространённые - VisualWorks Smalltalk и Dolphin Smalltalk.


Так вот, о прогнозах

Глядя на идеи, реализованные в Smalltalk, и вообще на идеи XPARC'а, реализованные в разных сферах ИТ, можно дать следующий прогноз: всё большее число идей из этого языка программирования будет реализовываться в новых технологиях, изобретаемых крупными софтверными компаниями, а также в новых версиях уже существующих технологий. Хотя, конечно, Smalltalk - не единственный источник вдохновения для современных творцов средств и технологий разработки программного обеспечения, но, тем не менее, вклад его весьма весом, в чём вы могли убедиться сами.

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

Что касается самого Smalltalk'а, то он сейчас очень даже активно применяется и совершенствуется. Для тех, кто заинтересовался этим языком, могу порекомендовать следующие ресурсы: www.smalltalk.ru, www.math.rsu.ru/smalltalk, ru.smalltalk.wikia.com. Все они русскоязычные и содержат массу интересной информации. Есть ещё множество англоязычных ресурсов - в общем, Гугл в помощь!

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


Ответ на задачу

Программу эту я взял отсюда: www.smalltalk.ru/articles/tasks-01.html. Автор её, Alex Baran, сформулировал задачу следующим образом: "Написать функцию, принимающую строку слов, разделенных пробелами. Каждое слово может состоять из латинских букв в нижнем регистре и цифр. Возвращаемым результатом должна быть строка из полученных слов, отсортированных в алфавитном порядке и разделенных пробелами, при этом во время сортировки при сравнении слов цифры должны игнорироваться так, как будто бы их нет. Например, для входной строки ma79ma 9n8e7 mila r1a2m3u результатом работы функции должно быть ma79ma mila 9n8e7 r1a2m3u". Если перейдёте по указанной мною ссылке, найдёте подробный разбор задачи для двух разных диалектов Smalltalk.

Вадим СТАНКЕВИЧ,
dreamdrusch@tut.by

Версия для печатиВерсия для печати

Номер: 

09 за 2008 год

Рубрика: 

Software
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!