Новые слова давно забытой песни,

 

Новый символ, новый виток.

 

Идет волна, держитесь вместе,

 

Или, как страус, головою в песок...

 

Константин Кинчев

 

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

 

Работы над Smalltalk начались в 1970 году в исследовательской лаборатории корпорации XEROX, а закончились спустя 10 лет, воплотившись в окончательном варианте Smalltalk-80, оказавшемся родоначальником наиболее полноценной объектной идеологии.

 

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

 

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

 

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

 

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

 

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

 

Smalltalk выделяется двумя ключевыми особенностями, позволяющими ему рассчитывать на роль ведущего средства разработки. Во-первых, его синтаксис базируется исключительно на понятии объекта и очень компактен. Даже само название языка в переводе на русский звучит примерно как "малоразговорчивый". В самом деле, в Smalltalk отсутствуют привычные, отделенные по смыслу друг от друга понятия оператора, данных или процедуры. Абсолютно все, что входит в язык, является объектами, а сами объекты общаются друг с другом исключительно с помощью сообщений. Например, выполнение выражения I + 1 вызывает посылку сообщения + (прибавить) с параметром 1 объекту I. Больше никаких управляющих структур, за исключением условного "оператора", на самом деле тоже являющегося методом класса Boolean, в языке нет, хотя их можно очень просто смоделировать.

 

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

 

Интересно, что до сих пор не разработан стандарт этого языка, хотя на ближайшее время обещан выход ANSI-стандарта. Пока же все разработчики ориентируются на версию Smalltalk-80, которая в силу прекрасной продуманности семантики уже 15 лет не нуждается в изменениях. Однако точно известно, что в стандарт не войдут описания интерфейсных классов, классов работы с графикой и платформно-зависимых элементов. Особенно важна независимость от платформы, которая позволяет, например, использовать в языке числа неограниченной длины. Для придания Smalltalk большей гибкости в нем имеется возможность использования чисел с различными системами счисления (программисты привыкли к десятичной, двоичной и шестнадцатиричной системам, а "сишники"  -  еще и к восьмеричной), в диапазоне от 2 до 36. Почему 36, в принципе, понятно  -  количество символов, являющихся в различных системах счисления аналогами цифр, ограничено латинским алфавитом. Любимый пример поклонников Smalltalk, иллюстрирующий выразительные возможности представления чисел, выглядит так: 36rSMALL. TALKe255.

 

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

 

Во-вторых, Smalltalk является полностью переносимым на уровне двоичных кодов. Дело в том, что этот язык является интерпретируемым. Программа на Smalltalk компилируется в так называемый байт-код, когда отдельная команда виртуального ассемблера занимает ровно один байт (8 бит). Эта идея была придумана и впервые воплощена Питером Дойчем в одной из реализаций Лиспа и с тех пор получила широкое распространение  -  можно вспомнить, например, Паскаль с компиляцией в известный P-код. Получаемый байт-код может исполняться интерпретатором на любой платформе, где реализована виртуальная Smalltalk-машина, включающая в себя набор объектов в терминологии языка, описывающих процессы компиляции и интерфейса с пользователем. Естественным ограничением здесь является скорость исполнения программ (интерпретации байт-кода), но для некритичных по времени задач с учетом роста производительности компьютеров быстрота и качество разработки проекта выходят на первый план.

 

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

 

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

 

Из бесплатных версий наиболее солидно выглядит GNU-версия языка, полностью соответствующая неофициальному стандарту Smalltalk-80. Из коммерческих просто необходимо выделить комплект IBM VisualAge for Smalltalk. Фирма IBM многие годы поддерживала и совершенствовала этот продукт, который сегодня является безусловным лидером на рынке,  -  в чем, в чем, а в профессионализме и умении заглядывать далеко в будущее этой компании не откажешь (хотя она, похоже, заглядывает в будущее подчас слишком далеко, упуская из виду текущие тенденции рынка). Прекрасная среда визуальной разработки VisualAge позволяет создавать программы для OS/2, Windows и AIX. Имеется набор интерфейсных объектов, объектов для работы с базами данных и для интеграции в программу мультимедийной информации.

 

Другим ведущим продуктом в этой нише является Visual Smalltalk, выпускаемый альянсом фирм ParcPlace-Digitalk. Визуальная среда разработчика позволяет создавать программы для Windows 3.1, Windows NT и OS/2.

 

Сегодня языками, массово используемыми для создания коммерческих приложений, являются Бейсик и Паскаль. Недостатки их очевидны и общеизвестны. Это, соответственно, отсутствие полноценной объектной идеологии, излишне "низкоуровневый" код и трудность отладки, невысокая эффективность для ряда задач. Однако из-за огромных вложений в их "раскрутку" и искусственного спроса (из-за незнания руководителями других технологических возможностей) на программистов, владеющих этими языками, погибнуть им, конечно, не суждено. Но уже зарождается новое поколение языков, которые наверняка определят все развитие компьютерной индустрии. Это будут усовершенствованные версии Java, предназначенные не только для Internet, интерактивные языки виртуального моделирования типа VRML, встроенные языки различных систем работы с хранилищами данных (например, SQL Windows), языки быстрой разработки приложений, интегрированные с CASE-системами, различные диалекты декларативных языков на основе Пролога. Для задач, требующих интенсивных вычислений, можно будет использовать параллельные версии подобных языков, благо появление первых недорогих мультипроцессорных персоналок, наподобие Pentium Pro с четырьмя (пока!) процессорами, не за горами. С их массовым распространением на рынке быстро возникнут и относительно дешевые параллельные системы программирования. Сначала это будет, конечно, апробированный на суперкомпьютерах FORTRAN и, возможно, Модула или Ада, а затем появятся реализации и других языков. И не вызывает сомнения, что среди этой "новой волны" одно из наиболее достойных мест займет Smalltalk.

 

Сергей Бобровский

 

С Сергеем Бобровским можно связаться по адресу: sergei95@glas.apc.org

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