Мы перевели статью Хилела Уэйна «Alan Kay did not invent objects» — об Алане Кэе, объектах и том, можно ли современные объектно-ориентированные языки программирования действительно называть ООП. Повествование в тексте ведется от имени автора, оригинал статьи вы можете прочитать здесь.
Многие люди продолжают утверждать, что современные объектно-ориентированные языки в действительности «не совсем объектно-ориентированные», потому что они не соответствуют определению ООП Алана Кэя. В этом есть определенный смысл, хотя я и не согласен с выводом. В последнее время мне часто встречаются люди, которые говорят, что именно Кэй изобрёл объекты. Фактически — это неверно.
Алан Кэй не изобретал объекты. Они были взяты из языка программирования Simula, который использовался в качестве вдохновения для создания руководства к языку программирования Smalltalk-72 Алана Кэя. В известнейшем журнале Byte в 1981 году вышел материал о Smalltalk и ООП, где говорилось, что «фундаментальная идея объектов, сообщений и классов, пришла из Simula». В нём говорилось, что этот механизм позволяет создавать пользователям «объектно-ориентированные системы», при этом авторы утверждали, что «это даже слишком». Однако в Smalltalk хорошо знали систему объектов из Simula и вдохновлялись ею.
При этом создателем мифа о том, что именно Кэй изобрел объекты, является сам разработчик:
«Просто напоминаю вам, что на последней OOPSLA ("Научно-исследовательская конференция для программистов, — прим. Хекслет"), я постарался вам объяснить, что Smalltalk — это не только синтаксис или библиотека классов, но это даже и не сами классы. Мне жаль, что я ввел термин «объекты» для этой темы, поскольку это заставляет многих людей сосредотачиваться на меньшей идее».
Далее он в интервью 1988 года продолжает:
«То есть да, я придумал термин «объекты». Поскольку мы первыми делали объекты и не было никаких других объектов, чтобы радикализировать это».
В дальнейшем Алан Кэй перестал утверждать, что он создал объекты, однако многие люди до сих пор продолжает считать эту цитату правдой.
Это абсолютная правда
В последнее время многие говорят, что ООП — в действительности «не совсем о классах и объектах», а самым важным моментом являются сообщения. В своем интервью 1998 года Алан Кэй также говорил, что «самая большая идея — это обмен сообщениями». Позже он пишет:
«ООП для меня — только сообщения, локальное удержание и защита, скрытое состояние и — в последствии — связывание всего. Это можно сделать в Smalltalk и в LISP. Есть вероятность, что существуют другие системы, где это тоже возможно, но мне о них ничего неизвестно.
Первоначальное ООП считало сообщения важными, но прежде всего для обслуживания объектов. Вот как Дон Ингаллс объясняет ООП в своем введении в Smalltalk-76 :
«Язык Smalltalk является объектно-ориентированным, а не функциональным, и это часто сбивает с толку людей с предыдущим опытом работы в computer science. Например, вычислить +4 означает отправить объекту +4 как сообщение. Принципиальное отличие в том, что все контролирует объект, а не +. Если объект является целым числом 3, то результатом будет целое число 7. Однако, если бы он был строкой «Meta», результат мог бы быть «Meta4». Таким образом, смысл изменяется вместе с объектами этой системы, тогда как код остается абстрактной формой, просто направляя поток сообщений».
Читайте также Большая статья Джо Армстронга: Почему ООП — это плохо.
В своей книге «Microelectronics and the Personal Computer» Кэй говорит о системе «сообщение-действие», в которой «каждое действие принадлежит семье».
«Основная идея при создании программ на Smalltalk заключается в том, чтобы определить классы, которые обрабатывают связи между объектами в созданной нами среде».
При анализе этих ранних материалов создается впечатление, что ООП тогда состояло из трех основных идей — классов, определяющих протокол и реализацию, объектов как экземпляров классов, и сообщений — как средств коммуникации. Однако идея, что объекты и классы были вторичными по отношению к сообщениям, появилась намного позже.
ACM вручила Оле Далю и Кирстену Нюгору премию Тьюринга и назвала их «соавторами ООП». В журнале Byte также говорится, что Simula был объектно-ориентированным языком программирования, а в статье «The Computer Revolution hasn’t happened yet» Кэй называет программу Sketchpad также «объектно-ориентированной». На мой взгляд, это не признает всех заслуг Smalltalk. На мой взгляд, Smalltalk — в отличие других систем:
Не имел не-объектных примитивов. Объектами было все — числа, ошибки, классы и сообщения.
Сообщения можно передать любому объекту, включая другие сообщения.
Методы и реализации были связаны с объектом, а не с сессией.
Последний — самый тонкий и, возможно, самый важный вклад, хотя никто должным образом не объясняет, что делает его таким особенным. В Simula вызов отсутствующего метода вызывает ошибку. Это часть спецификации Simula. В Smalltalk-80, если ни один метод не соответствует сообщению, объект по умолчанию возвращает вызывающему объекту сообщение doesNotUnderstand. Вызывающий объект может по своему выбору реагировать на него, просто передать его дальше или вызвать ошибку. Класс также может переопределить значение по умолчанию и сделать что-то, кроме return doesNotUnderstand.
Это также означает, что система обмена сообщениями не зависит от внутренних компонентов объекта. Им даже не обязательно быть частью одного проекта. Соответственно, вы можете делать такие вещи, как отправка сообщения объектам, написанным на разных языках, передача определения объектов по почте и так далее. На мой взгляд, именно в этом заключается большая сила «передачи сообщений», но это также один из наименее изученных аспектов.
Люди не создают инструменты случайно. Как правило, у них есть конкретные ситуации и задачи, под которые они и создают методы их решения. И все инновации в Smalltalk и ООП — не исключение.
Алан Кэй интересовался темой персональных компьютеров — все его работы над Smalltalk, Dynabook и FLEX строятся именно вокруг этого. Он считал, что ПК должен находиться под контролем пользователя — полностью, начиная от логики ядра системы, заканчивая графическим рендерингом. По мнению Кэя, все это можно было бы настраивать и исследовать во время работы.
Передача сообщений и поздняя привязка решают множество проблем. Если ребенок устанавливает новую игру, нужно ли ему перекомпилировать всю ОС, чтобы использовать новую программу? Нет: сделайте так, чтобы вы могли отправлять произвольное сообщение любому объекту и полагаться на обработку протокола во время его исполнения, чтобы выполнить эту задачу. Или — если человек нарушает логику работы звуковой системы, должна ли вся ОС прекратить работу? Конечно нет, позвольте объектам самим решать, как им обрабатывать сообщения.
Даль и Нюгор решали совершенно другую задачу. Их интересовала симуляция. Одно из исследований в руководстве по Simula — моделирование распространения инфекции среди фиксированной популяции. Система полностью закрыта — у вас есть фиксированный набор кода, вы запускаете симуляцию и получаете результат. Для них передача сообщений была бесполезной. Но такие вещи, как возможность определять симуляции в терминах других симуляций, специализировать сущности и моделировать время как объект, невероятно полезны. Объекты также хорошо себя здесь проявляют.
Так кто же «правильно» использовал объекты? Это не разумный вопрос. Они делали разные вещи, поскольку у них были разные задачи. Наша современная идея ООП — это синтез всех их идей, а также идей Адель Голдберга, Барбары Лисков, Дэвида Парнаса, Бертрана Мейера, Гюля Ага и многих других. Но никто из них не может утверждать, что же такое «ООП». Термины развиваются, как и задачи, которые изначально эти инструменты должны были решать.
Курсы по ООП На Хекслете есть достаточно много курсов c ООП — начиная с введения в ООП на JS и PHP, заканчивая достаточно сложными курсами по СИКП.