Алан Кей, участник проекта ARPAnet и один из создателей языка Smalltalk
Алан Кей, участник проекта ARPAnet и один из создателей языка Smalltalk

В 2003 году Алан Кей, признанный автор термина «объектно-ориентированное программирование», ответил на вопросы исследователя Штефана Рама. В этом письме он раскрывает первоначальный замысел ООП, который значительно отличается от того, чему большинство из нас учат сегодня. Публикуем перевод этого исторического документа.

Электронное письмо от 23.07.2003

Дата: Вторник, 23 июля 2003 09:33:31 -0800
Кому: Штефан Рам [адрес удален]
От кого: Алан Кей [адрес удален]
Тема: Re: Пояснение термина «объектно-ориентированный»

Привет, Штефан!

Прошу прощения за задержку с ответом, но я был в отпуске.

В 18:27 +0200 7/17/03 Штефан Рам писал:
Уважаемый доктор Кей, я бы хотел получить авторитетный комментарий по поводу термина «объектно-ориентированное программирование» для своего учебного материала по этой теме. Единственные два источника, которые я рассматриваю как авторитетные, — это Международная организация по стандартизации, которая определяет термин «объектно-ориентированный» в стандарте ISO/IEC 2382-15, и вы, поскольку, как говорят, вы этот термин и придумали.

Вполне уверен, что так и было.

К сожалению, сложно найти веб-страницу или источник с вашим определением или описанием этого термина. Есть несколько упоминаний о том, что вы, возможно, говорили по этому поводу (например, «наследование, полиморфизм, инкапсуляция»), но это не первоисточники. Я также знаю, что позднее вы сместили акцент на «отправку сообщений», — но мне все равно хотелось бы узнать об «объектной ориентированности». Для документальной точности, а также для моего учебного материала и последующей публикации, не могли бы вы прояснить: когда и где был впервые использован термин «объектно-ориентированный»?

В Юте, где-то после ноября 1966 года — под влиянием системы Sketchpad, языка Simula, проекта ARPAnet, компьютера Burroughs B5000 и моего опыта в биологии и математике — у меня сформировался замысел определенной архитектуры для программирования. Вероятно, уже в 1967 году кто-то спросил меня, над чем я работаю, и я ответил: «Это объектно-ориентированное программирование».

Изначальная концепция включала следующие положения:

  • Я представлял объекты как биологические клетки и/или отдельные компьютеры в сети, способные общаться только при помощи сообщений (таким образом, отправка сообщений появилась в самом начале — но потребовалось время, чтобы понять, как реализовать отправку сообщений в языке программирования достаточно эффективно для практического применения).

  • Я хотел уйти от данных. B5000 почти достиг этого благодаря своей почти невероятной аппаратной архитектуре. Я осознал, что метафора клетки/отдельного компьютера позволяет исключить данные, и что "<-" — это просто еще один маркер сообщения (мне понадобилось немало времени, чтобы это осмыслить, потому что я действительно воспринимал все эти символы как имена функций и процедур).

  • Мой опыт в математике помог мне осознать, что каждый объект может быть связан с несколькими алгебрами, что могут существовать семейства таких алгебр, и все это будет исключительно полезным. Термин «полиморфизм» был введен гораздо позже (кажется, Питером Вегнером) и не вполне корректен, поскольку связан с номенклатурой функций, а меня интересовало нечто гораздо большее, чем функции. Я ввел термин «обобщенность» для описания общего поведения в квази-алгебраической форме.

  • Меня не устраивала реализация наследования в Simula I и Simula 67 (хотя я считал Нюгора и Даля выдающимися мыслителями и разработчиками). Поэтому я решил исключить наследование из встроенных возможностей языка, пока не разберусь в нем глубже. Первые эксперименты с этой архитектурой я проводил, адаптировав модель из статьи ван Вейнгаардена и Вирта «Обобщение ALGOL» и языка Euler Вирта. Обе работы во многом напоминали LISP, но с более привычным и понятным синтаксисом. Тогда я еще не понимал чудовищной по своей мощи идеи LISP — явного метаязыка — но вплотную приблизился к концепции расширяемых языков, почерпнутой из разных источников, включая IMP Айронза.

Следующим шагом я наконец разобрался с LISP и использовал это понимание, чтобы создать куда более изящные, компактные и мощные базовые механизмы с усиленным поздним связыванием. Здесь мне крайне помогла диссертация Дейва Фишера о расширяемых управляющих структурах, выполненная в стиле Маккарти. Еще одним важным влиянием стал язык PLANNER Карла Хьюитта (который так и не получил должного признания, учитывая, как точно и задолго до Prolog он предвосхитил его принципы).

Первый Smalltalk в Xerox PARC вырос именно из этих идей. Критику более поздних версий Smalltalk можно найти в конце «Краткой истории»: в них произошел регресс в сторону Simula, а механизмы расширения так и не заменили на безопасные альтернативы, сопоставимые по эффективности.

Что для вас означает «объектно-ориентированное [программирование]» (Вводные рассуждения не требуются — просто, если возможно, краткое объяснение [например, «программирование с наследованием, полиморфизмом и инкапсуляцией»] через другие понятия, знакомые аудитории. Также необязательно объяснять, что такое «объект», так как ваше определение этого понятия уже приведено в «Ранней истории Smalltalk».)

(Я не против типов, но я не знаю ни одной системы типов, которая не была бы сплошной головной болью, поэтому я до сих пор предпочитаю динамическую типизацию.)

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

С наилучшими пожеланиями,
Алан

Благодарю,
Штефан Рам


Электронное письмо от 26.07.2003

Дата: Вторник, 23 июля 2003 09:33:31 -0800
Кому: Штефан Рам [адрес удален]
От кого: Алан Кей [адрес удален]
Тема: Re: Пояснение термина «объектно-ориентированный»

Мне следовало упомянуть, что язык Simula дал толчок формированию двух основных направлений. Первым (по чистой случайности) стал био/сетевой непроцедурный, не основанный на данных подход, который выбрал я. Второе направление, к исследованию которого приступили чуть позже, было связано с абстрактными типами данных, и именно оно получило гораздо широкое распространение.

Рассматривая историю в целом, мы видим, что прото-ООП началось с АТД, затем ответвилось в сторону того, что я назвал «объектами» — это направление привело к Smalltalk и т.п. Однако после этого ответвления основное сообщество компьютерных наук продолжило развивать АТД, предпочитая сохранять процедурный подход, основанный на данных. Исторически интерес представляют: файловая система Burroughs 220 ВВС США (описанная мной в истории Smalltalk), ранние работы Дага Росса в Массачусетском технологическом институте (AED и ранее), где он предлагал встраивать указатели на процедуры в структуры данных; Sketchpad (с его полным полиморфизмом — например, одно и то же смещение в структуре данных означало операцию display, содержа указатель на соответствующую процедуру для типа объекта); а также Burroughs B5000, чьи таблицы программных ссылок были подлинными «большими объектами», содержавшими указатели как на данные, так и на процедуры — причем система часто корректно обрабатывала даже случаи обращения к данным через указатель на процедуру. Первые проблемы, которые я решил своими ранними наработками в Юте, касались «исчезновения данных» при использовании только методов и объектов. В конце 1960-х (кажется) Боб Болцер написал блестящую статью «Программирование без данных», а вскоре после этого — в 1970-м, полагаю — Джон Рейнольдс опубликовал не менее выдающуюся работу "Gedanken", показав, что корректное применение лямбда-выражений позволяет процедурам абстрагировать данные.

Те, кому нравилась идея объектов как не-данных, были в меньшинстве. Среди них был я, Карл Хьюитт, Дейв Рид и еще несколько человек — почти все они принадлежали к сообществу ARPA и так или иначе участвовали в проектировании ARPAnet -> Internet, где базовой единицей вычисления выступал целый компьютер. Но живучесть старых идей поразительна: все 1970-е и 1980-е вместо того, чтобы думать об объектах и сообщениях, многие пытались обойтись «удаленным вызовом процедур». Sic transit gloria mundi.

С наилучшими пожеланиями,
Алан

В 22:05 +0200 7/26/03 Штефан Рам писал:
Ср, 23 июля 2003, 09:33:31 -0800, Алан Кей написал:
Для меня ООП — это только отправка сообщений, локальное хранение, защита и сокрытие состояния-процесса, а также предельно позднее связывание всех элементов.

Здравствуйте, Алан!
Хотел бы поблагодарить вас за объяснения (включая не процитированные выше фрагменты)!
«Локальное хранение» — новое для меня понятие в контексте ООП. Полагаю, оно относится к состоянию-процессу и означает, что объект владеет своим состоянием-процессом, то есть его состояние хранится локально внутри самого объекта, а не где-либо еще.
Я опубликовал ваш ответ в сети, предварительно удалив адреса электронной почты и служебные данные заголовков из соображений конфиденциальности.
Еще раз спасибо,
Штефан

Комментарии (6)


  1. Dhwtj
    14.09.2025 18:20

    полагаю, Smalltalk был очень медленным, а надо было C/ASM с батарейками


  1. ndn44
    14.09.2025 18:20

    ооп это разница между c и ++


    1. Dhwtj
      14.09.2025 18:20

      я и говорю,

      надо было C/ASM с батарейками

      в данном случае, с как бы ООП, но не совсем

      вот и появился C++ (там еще <T> хорошо сыграли для написания библиотек)


  1. tabfor
    14.09.2025 18:20

    На самом деле ещё с 80-х (кажется) начали немного различать ООП и ООД. Мне как-то довелось портировать старый, написанный в 90-х код на С в С++. Программист разбил систему на модули, каждый из которых содержал объявления переменных и функции, и объединил их элегантным монитором выполнения. Мне достаточно было переопределить для каждого модуля класс и собрать это все в С++.

    То есть, главное - это проектирование, дизайн или ООД, а ООП , программирование - это реализация, основанная на языковой семантике.


  1. baldr
    14.09.2025 18:20

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

    Я полагаю, это можно в рамочку и цитировать везде, хоть это и личное мнение.


  1. panzerfaust
    14.09.2025 18:20

    Чем дальше, тем больше эти "разборы" писем 20-30-летней давности похожи на разбор послания Павла коринфянам. То есть такая вещь в себе, живущая совершенно отдельно от реальной практики.