[Перевод] Алан Кэй не изобретал объекты

habr.png

Люди продолжают утверждать, что современные объектно-ориентированные языки, на самом деле «не совсем объектно-ориентированные», поскольку они не соответствуют определению ООП Алана Кэя. На мой взгляд, в этом смысл, хотя я не согласен с выводом. В последнее время мне встречаются люди, которые говорят о том, что именно Кэй изобрёл объекты. Фактически это неверно.

Алан Кэй не изобретал объекты. Они были в Simula, которую приводит в качестве основного источника вдохновения руководство к Smalltalk-72 (с. 117). В выпуске известного журнала Byte за 1981 год, который популяризировал Smalltalk и ООП, говорится, что «основная идея объектов, сообщений и классов пришла из SIMULA». В нем сказано, что Simula позволяет пользователям создавать «объектно-ориентированные системы», что, возможно, слишком, но тем не менее. Команда Smalltalk хорошо знала систему объектов в Simula и черпала вдохновение из неё.

Одной из причин, почему такой миф всё ещё жив, послужило то, что сказал сам Кэй в 1998 году:


Просто напоминаю, что на последней OOPSLA я постарался донести до всех, что Smalltalk — это не только НЕ синтаксис или библиотека классов, но даже не классы. Мне очень жаль, что ранее я ввел термин «объекты» для этой темы, поскольку это заставляет многих людей сосредоточиться на меньшей идее.

И далее в этом интервью он продолжает:


Я имею в виду, что я изобрел термин «объекты». Поскольку мы делали объекты первыми, не было других объектов, чтобы радикализировать это.

Позднее он перестал это утверждать, но люди до сих пор продолжают использовать ту цитату как факт.

Это абсолютная правда.

В последнее время многие продолжают утверждать, что ООП на самом деле — не в классах и объектах, и что на самом деле наиболее важными являются сообщения. В посте 1998 года, после того, как Кэй сказал, как он сожалеет об «объектах», он также говорит, что «бо́льшая идея — это обмен сообщениями». Далее он пишет:


ООП для меня это только сообщения, локальное удержание и защита, скрытие состояния и позднее связывание всего. Это можно сделать в Smalltalk и в LISP. Вероятно, существует другие системы, где это возможно, но мне о них не известно.

В раннем ООП сообщения во многом считались важными, прежде всего для обслуживания объектов. Вот как Дон Ингаллс объясняет ООП в своем введении в Smalltalk-76:


Smalltalk скорее ориентирован на объекты, а не на функции, и это часто путает людей, имеющих опыт в computer science. Например, вычислить +4 означает отправить +4 объекту как сообщение. Основное отличие состоит в том, что всем управляет объект, а не +. Если является целым числом 3, то результатом будет целое число 7. Однако, если был строкой 'Meta', результатом может быть Meta4. Таким образом, смысловая нагрузка идёт вместе с объектами системы, а код остается абстрактной формой, просто направляя поток сообщений.

В книге «Microelectronics and the Personal Computer» Кэй говорит о системе «сообщение-действие», в которой «каждое действие принадлежит семье», и говорит о расширении деятельности в «точки зрения» объектных отношений как будущей границы. В руководстве к Smalltalk-72 он пишет (с. 18):


Основная идея при написании программ на Small talk заключается в том, чтобы определить классы, которые обрабатывают связи между объектами в созданной среде.

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

ACM вручила Премью Тьюринга Далю и Нюгору, и назвала их «соавторами ООП». Также журнал Byte пишет, что Simula была объектно-ориентированной, а в статье «The Computer Revolution hasn«t happened yet» Кэй называет Sketchpad «очень объектно-ориентированным». На мой взгляд, это не признаёт заслуг Smalltalk в должной степени. В отличие от других систем, в Smalltalk:


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

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

Также это значит, что система обмена сообщениями не зависит от внутреннего строения объектов. Им даже необязательно быть частью одного проекта. Отсюда следует, что вы можете делать такие вещи, как отправка сообщений объектам, написанным на разных языках, передача определений объектов по почте, отправка сообщений через SMS и т.д. На мой взгляд, именно в этом заключается мощь «передачи сообщений», но в тоже время это один из наименее изученных аспектов.

Люди не изобретают инструменты спонтанно. У них есть конкретные ситуации и задачи, и они пытаются найти решение этих задач. Новшества в Smalltalk и ООП — не исключение.

Алан Кэй интересовался темой персональных компьютеров. Его работы над FLEX, Dynabook и Smalltalk строятся вокруг этого. По его мнению, ПК должен был быть полностью под контролем пользователя; всё, от логики ядра системы до графического рендеринга, — можно было бы настраивать и исследовать во время работы. Передача сообщений и позднее связывание решают ряд задач. Если ребенок устанавливает новую игру, нужно ли перекомпилировать всю ОС, чтобы использовать новую программу? Нет: сделайте так, чтобы можно было отправить произвольное сообщение любому объекту и положиться на обработку протокола во время работы, чтобы выполнить задачу.(*) Если человек нарушает логику работы звуковой системы, должна ли вся ОС упасть? Конечно, нет, поэтому разрешите объектам самим решать, как обрабатывать сообщения. Объекты хорошо себя здесь проявляют.

Оле Даль и Кирстен Нюгор пытались решить совершенно другую задачу. Их интересовала симуляция. Одно из исследований в руководстве по Simula — моделирование распространения инфекции среди фиксированной популяции. Система полностью закрыта: у вас есть фиксированный набор кода, вы запускаете симуляцию и получаете результат. Для них передача сообщений бесполезна. Но возможности определять симуляции в терминах других симуляций, специализировать сущности и моделировать время как объект первого класса невероятно полезны. Объекты также хорошо себя здесь проявляют .

Так кто же использовал объекты «правильно»? Это неразумный вопрос. Они делали разные вещи, поскольку у них были разные задачи. Наша современная идея ООП — это синтез всех их идей, а также идей Адель Голдберг, Барбары Лисков, Дэвида Парнаса, Бертрана Мейера, Гюля Ага и многих других. Но никто из них не может утверждать, что «ООП». Понятия развиваются, как и задачи.

Интервью, взятые более 30 лет назад, не являются хорошими первоисточниками.


* Возможно, это делает Powershell духовным преемником Smalltalk.

© Habrahabr.ru