История объектно-ориентированного программирования
Сергей Бобровский
Из "древней истории"
Пожалуй, первым компьютерным решением, воплотившим в себе объектный подход, стал программно-аппаратный графический Планшет (Sketchpad: A Man-Machine Graphical Communications System), использовавший оборудование DEC PDP. Его в 1963 г. разработал 25-летний Иван Сазерленд, помогавший в создании симуляторов вертолетов военному научному агентству DARPA, а затем занявшийся в Массачусетском технологическом институте докторской диссертацией и имевший удовольствие общения с Клодом Шенноном. С помощью светового пера и системы выпадающих меню пользователь Планшета мог рисовать различные несложные изображения на аналоговом дисплее, перемещать их и точно располагать в определенных позициях экрана, а также хранить. В качестве понятия класса Сазерленд использовал определение "мастер", разделяя описание и реально существующий на экране объект (экземпляр "мастера").
Иван Сазерленд
Сазерленд также придумал первый прототип нынешних систем виртуальной реальности, ухитрившись спроецировать изображение с двух мониторов непосредственно в глаза человека (как стереоскопический фильм), а было это в 1968 г. Специальные датчики контролировали положение головы и соответственно изменяли прокручиваемые перед глазами ролики. Этот человек защитил восемь патентов по компьютерной графике, занимался шагающими роботами в Калифорнийском университете, а затем работал вице-президентом компании Sun Microsystems.
Основоположниками объектного подхода в программировании считаются норвежцы Оле Джохан Дал и Кристен Нюгорт, авторы языка Симула. В 1952 г. Нюгорт решил заняться моделированием крупных и сложных систем реального мира, в 1957-м получил возможность компьютерной реализации своих замыслов на машине Ferranti MERCURY, но быстро осознал ограниченность машинных языков и Фортрана.
Ferranti MERCURY – версия, созданная Манчестерским университетом в содружестве с компанией Ferranti в ходе работ над компьютером Mark 2. Она отличалась поддержкой операций с плавающей точкой. Память компьютера составляла 1024 слова по 40 бит с временем доступа 10 мкс к 10-битовому слову. Устройство адресации могло работать с 10-, 20- и 40-битовыми словами. Долговременная память насчитывала 4096 40-битных слов и обрабатывала их со скоростью 17,28 мс. Для выявления сбоев выполнялась проверка четности. Программисты решали задачи с помощью языка Mercury Autocode.
Фирма Ferranti продала 19 таких машин, последнюю – в 1963 г.
Кристен Нюгорт
История Симулы началась в 1962 г. с проекта Simulation Language, предназначенного для программного моделирования метода Монте-Карло. Нюгорт, занимавший в то время должность директора по науке Норвежского компьютерного центра (NCC), приступил к созданию языка дискретного моделирования. Он привлек к сотрудничеству Оле Джохана Дала, коллегу по экспериментальной группе Министерства обороны Норвегии, которую возглавлял Йан Гэрвик, основатель информатики в этой стране. Для работ NCC приобрел датский компьютер GIER за 280 тыс. долл.
Одновременно готовились две версии Симулы. Первая, Симула I, формировалась по контракту с подразделением Univac корпорации Sperry Rand для машины UNIVAC 1107 (обошедшейся NCC в 990 тыс. долл.). Американские заказчики желали видеть этот язык фортраноподобным, от чего, впрочем, авторы категорически отказались; в результате прародителем Симулы стал Алгол 60. Последний был выбран благодаря блочной архитектуре, хорошим средствам сокрытия данных, а также вследствие высокой популярности в европейских научных центрах. А работы над вторым вариантом спонсировал NCC.
Оле Джохан Дал
В 1965 г. авторам пришла в голову идея объединить данные с процедурами, их обрабатывающими. После успешного обсуждения возможностей Симулы I на саммите НАТО в 1966 г. решено было продолжить его совершенствование. В язык вошли новые средства моделирования и имитации мультипроцессной работы. Авторы также придумали термины "класс" и "объект". Тогда же возникла и технология наследования – создатели Симулы ввели в язык возможность использования разными классами общих свойств путем указания названия класса в виде префикса. После публичного анонса новая технология вызвала интерес в Дании, Германии и СССР. У нас в конце 60-х появилась реализация Симулы для УРАЛа-16.
Новая версия языка была закончена в январе 1967-го. Он поддерживал проектирование "сверху вниз" с помощью виртуальных процедур и технологии статического и динамического связывания. В NCC была сформирована рабочая группа Simula Standards Group. Вскоре к ней подключился Якоб Палме, специалист Шведского института оборонных исследований. Он добавил в Симулу механизм сокрытия переменных. Первый законченный компилятор обновленной Симулы 67 увидел свет в 1969 г. и работал на машинах Control Data. Затем последовали реализации для UNIVAC 1108 и IBM, но все они, к сожалению, стоили очень дорого, что, вероятно, помешало активному распространению этого прекрасного языка. Однако с его помощью были спроектированы, например, первые СБИС-чипы Intel.
Тем временем Алан Кей (человек, придумавший первый персональный компьютер; см. PC Week/RE, N 39/98, с.25) внимательно изучал идеи, заложенные в Планшет, Симулу и еще два оригинальных языка – LISP, применявшийся для задач искусственного интеллекта, и LOGO, предназначенный для обучения базовым понятиям программирования. В ходе ознакомления с этими языками Кей придумал новую концепцию разработки, в соответствии с которой набор последовательно выполняющихся инструкций мог быть заменен на многомерную среду взаимодействия объектов, общающихся друг с другом путем асинхронного обмена сообщениями. В результате появлялась возможность поддержки подобной среды не одним, а множеством компьютеров, объединенных в сеть. Правда, для своего времени эта идея оказалась слишком революционной.
В конце 50-х годов Кей работал на Денверской военно-воздушной базе "Рандольф" (Randolph), где писал на машинном коде программы для ЭВМ Burroughs 220. Тогда он столкнулся с проблемой передачи сформированных на этой машине данных на компьютеры других баз. Стандартных форматов и ОС в современном понимании для тех ЭВМ не существовало, поэтому Кею пришлось создавать микропрограммы, которые содержали в себе всю необходимую информацию и после запуска на других машинах через простой пользовательский интерфейс самостоятельно разворачивали нужные данные. Такие программы Кей первоначально назвал "модулями", объединявшими данные и код. В 1966 г. он занялся научной деятельностью в области молекулярной биологии в Университете шт. Колорадо, где к нему пришло понимание важности этой идеи. Кей задумал создание системы модулей (возможно, уже тогда он дал им название "объекты"), объединяющих данные и алгоритмы их обработки, способные взаимодействовать друг с другом через определенные разработчиком интерфейсы, но не имеющие представления о том, что происходит за их пределами. При этом он активно использовал аналогии с биологическими объектами и механизмами взаимодействия клеток в живом организме.
Позже Кей перешел в Стэнфордскую лабораторию по искусственному интеллекту, а в 1972 г. устроился на работу в хорошо известный научный центр Xerox PARC, где и воплотил эти идеи в новом объектном языке SmallTalk, первоначально названном им Biological System и смоделированном на Бейсике, а затем реализованном на ассемблере. В процессе этой деятельности он предложил знаменитый термин "объектно-ориентированное программирование" (ООП). Заложенные в SmallTalk идеи ООП и по сей день остались непревзойденными ни в каких других языках и системах.
Если Кея нередко называют отцом SmallTalk, то матерью этого уникального языка можно считать профессора лингвистики Адель Голдберг, работавшую в те годы в тесной связке с Аланом в Xerox PARC. Она написала первую документацию к SmallTalk, а затем несколько книг и большое число статей по методологиям объектного анализа.
Мировую известность получила версия SmallTalk 80, коммерческие реализации которой вышли в 1981 г. Правда, они отличались невысокой производительностью. Впоследствии Кей принимал участие в работе группы Squeak, создавшей реализацию SmallTalk под девизом "Объектно-ориентированному программированию нужна скорость Си". Однако превзойти популярность Си проекту Squeak не удалось. Этот элегантный и шустрый язык, придуманный в лаборатории AT&T Bell при участии программистов Кена Томпсона и Денниса Ритчи (известных ЕС-программистам по легендарной игре Star Trek), добрался до ООП своим путем.
"Средние века" ООП. Хронология
1974 г. Марвин Мински, основоположник теории искусственного интеллекта, предложил идею фрейма, отделившего описание класса (структуры) объекта от его конкретного представления (экземпляра) и быстро завоевавшего популярность в языках искусственного интеллекта. Фрейм стал прямым предшественником современного понятия объектов в Си++.
1976 г. Кринстен Нюгорн создал новый язык BETA, в котором ввел концепцию шаблонов – более высокого уровня абстракций, нежели объекты. Его коллега Оле Джохан Дал еще долгое время работал профессором информатики в Университете Осло. А Нюгорн на некоторое время занялся политикой и активно выступал против вступления Норвегии в Евросоюз.
1980 г. Бьерн Страуструп, продолживший дело своих коллег из лаборатории Bell, дополнил язык Си концепцией классов, основанной на фреймах и объектных механизмах Симулы.
1982 г. В Мехико прошла 8-я Международная конференция по сверхбольшим БД (VLDB), где была предложена концепция объектно-ориентированных БД и рассматривались вопросы расширения существовавших языков запросов к БД новыми, объектными типами данных.
1983 г. Страуструп дал своему творению окончательное название Си++.
Наше время
1986 г. Первая всемирная конференция по объектно-ориентированным системам программирования прошла в Портленде. Возможно, именно прозвучавшие на ней доклады оказали стимулирующее влияние на Уильяма Аткинсона, инженера Apple, который через год после этого спроектировал систему HyperCard, прообраз современных визуальных сред быстрой разработки. Эффективность новой технологии оказалась столь высокой, что уже в 1989 г. одиннадцать компаний, среди которых были 3Com, American Airlines, Canon, Data General, Hewlett-Packard, Philips Telecommunications, Sun Microsystems и Unisys, основали группу OMG (Object Management Group), призванную формировать индустриальные стандарты на объектное программирование и упрощать интеграцию приложений с помощью универсальных кросс-платформных технологий. Эта группа первым делом приступила к выработке единого стандарта компонентной модели CORBA (Common Object Request Broker Architecture) – набора спецификаций, определяющих способы объектно-ориентированного взаимодействия компонентов промежуточного уровня в гетерогенных средах без привязки к конкретным языкам программирования. С самого начала CORBA нацеливалась на поддержку крупных, индустриальных проектов, и этот подход со временем себя полностью оправдал. Сегодня нет другого столь же распространенного независимого стандарта, поддерживающего самые разные ОС и объектные модели.
1992 г. Вышел стандарт CORBA 1.0, определяющий ключевые аспекты функционирования CORBA-систем. В него были включены базовое описание объектной модели, наборы программных интерфейсов поддержки CORBA-систем, а также декларативный язык определения интерфейсов Interface Definition Language (IDL), созданный OMG для описания распределенных интерфейсов.
1993 г. Корпорация Microsoft выпустила первую версию компонентной модели COM (Component Object Model), идея которой была, видимо, позаимствована из модели SOM (System Object Model), уже давно существовавшей в IBM OS/2 (в создании OS/2 Microsoft одно время принимала активное участие). Первоначально COM готовилась только для поддержки технологии встраивания и связывания документов OLE, но быстро выделилась в самостоятельное направление.
В том же 1993-м была предложена компонентная технология Microsoft ActiveX, основанная на элементах управления OLE, пришедших из Visual Basic, где они назывались VBX/OCX.
1994 г. Опубликован стандарт CORBA 2.0, который быстро получил массовое признание, так как представлял собой богатый и глубоко проработанный набор документов и охватывал большинство востребованных рынком задач. В нем были ликвидированы недостатки прежней версии, в результате чего CORBA 2.0 начал поддерживать транзакции и понимать универсальную кодировку Unicode, а также появился набор средств обеспечения безопасности и взаимодействия COM- и CORBA-объектов.
Гради Буч и Джеймс Румбах из Rational Software решили объединить две методологии визуального моделирования Booch и OMT и создать на их основе новый язык UML (Unified Modeling Language).
1995 г. Sun Microsystems свободно распространяет в Интернете элемент технологии Java – среду HotJava, поддерживающую мобильный код, разработку проекта Green, которая к тому времени считалась в Sun практически пропащей, если бы не развитие Сети. Новинку сразу же лицензирует Netscape Communication, а следом за ней к Java проявляют коммерческий интерес десятки компаний, в том числе Microsoft, IBM, Adobe, Borland, Lotus, Oracle.
Корпорация Borland выпустила первую версию среды быстрой визуальной разработки Delphi 1, основанную на концепции библиотек стандартных компонентов.
Microsoft сообщает о новой технологии DCOM – распределенной версии COM, позволившей собирать приложения из компонентов, выполнявшихся на разных компьютерах. Первоначально эта технология называлась Network OLE (сетевое OLE), однако по мере выделения COM в самостоятельное направление решено было отказаться от упоминания OLE в ее названии.
1996 г. Microsoft называет ActiveX новой объектной стратегией, направленной на поддержку Интернета.
1997 г. Sun Microsystems предлагает концепцию Enterprise JavaBeans – технологию создания корпоративных Java-компонентов, которые можно исполнять на серверах приложений, реализуя логику крупных, хорошо масштабируемых и защищенных систем на платформно-независимой основе.
Эксперты OMG осознают не только важность объектных технологий программирования, но и острую потребность в универсальных методологических концепциях проектирования крупных систем. Секретом стабильности системы и высокой отдачи инвестиций специалисты OMG называют независимую UML-модель и приступают к созданию концепции "Архитектура, управляемая моделью" (Model Driven Architecture, MDA). В ее основу закладывается базовая платформно-независимая UML-модель системы, несколько платформно-зависимых моделей и коллекция определений программных интерфейсов. Первую реализацию этой универсальной концепции (так называемое "отображение в объектный стандарт") OMG выполнила, конечно, для CORBA.
2000 г. Microsoft анонсирует новую объектную платформу .NET и новый язык программирования C#, сочетающий лучшие свойства С++ и Java. Он был предложен Microsoft во многом в противовес Java.
2001 г. OMG выпускает спецификацию CORBA 3.0. Она дополнена возможностями асинхронного обмена сообщениями, разработки систем реального времени и создания встраиваемых систем. В ней появились подключаемые компоненты, поддержка XML и средства интеграции различных Интернет-технологий. Была продумана модель сборки системы из компонентов JavaBeans и ActiveX. Стало допустимым в рамках одного компонента описывать множество интерфейсов, а также использовать язык сценариев. Особый акцент в третьей версии CORBA сделан на эффективном взаимодействии с Java.
2002 г. Опубликована последняя официальная версия CORBA 3.0.2.
Что дальше?
Несмотря на многомиллионные вложения, сделанные в 1970-1980 годах коммерческими компаниями и государственными структурами разных стран в универсальные языки программирования (такие, как Алгол, PL/1, Си) и языки логического программирования (прежде всего Prolog), самой распространенной в мире программной технологией остается ООП. Наиболее известным событием нового тысячелетия в этой сфере стал быстро набравший популярность язык программирования C#. Его можно смело считать лучшим на сегодня объектно-ориентированным средством создания графических приложений (формально – для разных платформ, фактически же – только для .NET, так как без среды разработки ценность C# равна нулю). Правда, лучшим C# можно назвать среди небольшого числа коммерческих альтернатив (Java, С++ и, вероятно, Delphi). Если же сравнить его возможности со средствами SmallTalk, то окажется, что ряд сильных идей ООП, заложенных в SmallTalk продвинутыми инженерными умами, оказался в C# упущенным (см. врезку "Оригинальные возможности Smalltalk").
В ближайшее десятилетие развитие ООП будет проходить под влиянием трех концепций: Microsoft .NET (прежде всего .NET Framework и ее подмножества и соответственно реализации C#), Java (все входящие в это понятие технологии) и CORBA. Причем важнейшей особенностью CORBA останется независимость от ОС и языка программирования CORBA-компонентов. Методология MDA станет основной объединяющей платформой моделирования для всех этих технологий, прежде всего в силу своей независимости от конкретного разработчика. Немаловажна и объявленная сквозная поддержка MDA во всех средствах разработки "Швейцарии в мире ПО" – корпорации Borland – и гиганта IBM (особенно учитывая недавнюю покупку Rational Software и развитие проекта Eclipse). Что касается "программирования в малом" (programming in small), то в этой области продолжится совершенствование шаблонов проектирования (высокоуровневого объектного программирования), их внедрение в среды разработки и дальнейшее сочетание шаблонного подхода с активно развивающимся языком моделирования UML, последняя версия которого 2.0 появится со дня на день.
Хочется также надеяться, что со временем в коммерческих оболочках создания ПО на популярных языках программирования все же будут реализованы возможности ООП, предложенные еще 25 лет назад авторами SmallTalk.
Оригинальные возможности Smalltalk
Объекты могут обмениваться сообщениями (одна из ключевых идей ООП).
SmallTalk – это не только язык программирования, но и комплексная стандартизованная ANSI-среда разработки. Она легко переносима между платформами, так как написана на самой себе и при этом очень компактна (например, Squeak "весит" 7 Мб). В нее входят средства создания многооконных приложений, встроенные службы конфигурационного управления и контроля версий, а кроме того, она поддерживает отладку на всех этапах создания и развертывания продукта.
SmallTalk создавался как среда прототипирования (важный принцип ООП, подразумевающий спиральную разработку приложения, быстрое получение и совершенствование действующего прототипа).
Подготовленное с помощью SmallTalk приложение представляет собой один файл, хранящий все состояние системы.
Можно динамически создавать отложенные последовательности действий (блоки), что под силу лишь интерпретируемым системам.
Хотя из SmallTalk, как из Java и C#, удалена возможность множественного наследования, только эта среда позволяет элегантно имитировать его с помощью протоколов обмена сообщениями между классами.
Объект умеет информировать внешнюю среду о попытках неправильного использования самого себя (метод doesNotUnderstand).
В SmallTalk нет разделения между типами и классами, благодаря чему можно избегать ошибок приведения типов. Концепция набора базовых типов, позволяющая выявлять такие ошибки на этапе компиляции, далеко не всегда себя оправдывает, поскольку уводит разработчика от мышления в истинно объектном духе.
Имеются механизмы динамического расширения классов и приведения типов, перезагрузки исключений, расширения возможностей операторов, организации замкнутых выражений и др.
Документацию и комментарии можно встраивать в код.
Статья опубликована в PC Week/RE № 28 от 05.08.2003 г., стр. 10, и № 29 от 12.08.2003 г., стр. 20.