Алан Кей, участник проекта 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, Алан Кей написал:
Для меня ООП — это только отправка сообщений, локальное хранение, защита и сокрытие состояния-процесса, а также предельно позднее связывание всех элементов.

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

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


  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. Yak52
      14.09.2025 18:20

      В понимании Кея, точнее между C и Objective-C


      1. Zalechi
        14.09.2025 18:20

        Я так понимаю, что они оба про ООП, но разные уровни доступа к памяти, ресурсам железа…


    1. al_shayda
      14.09.2025 18:20

      настоящий индеец и к Си сможет ООП приделать. (как в X Toolkit сделано в 80х)


  1. tabfor
    14.09.2025 18:20

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

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


  1. baldr
    14.09.2025 18:20

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

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


    1. lgorSL
      14.09.2025 18:20

      Это было в 2003 году. В современных языках, даже в мейнстримных и системы типов довольно продвинутые и ide поверх них работают на порядок лучше.
      Вместо динамического js сейчас вовсю используют ts, а Python обмазывают аннотациями (они там необязательные, и типизация в рантайме всё равно динамическая, но их активно добавляют и доделывают последние лет 10)


  1. panzerfaust
    14.09.2025 18:20

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


    1. lgorSL
      14.09.2025 18:20

      Да нет, erlang и модель акторов вполне реальные и иногда используются.
      И каналы в го - по-сути каналы для сообщений.


      1. panzerfaust
        14.09.2025 18:20

        Ну используется и используется. Я вообще под JVM пишу на модели акторов. Но в чем смысл этих бесконечных поисков Того Самого Правильного ООП?


        1. Zalechi
          14.09.2025 18:20

          Согласен, — смысл чисто исторический.


        1. Uint32
          14.09.2025 18:20

          Акторная модель и ООП совсем не противоречат друг другу


    1. Zalechi
      14.09.2025 18:20

      От реальной практики?… там как раз речь идет за реальные практики 60-70х годов.

      А всплыло аж в 2003м, а я читаю, вот в 2025м.


      1. Proscrito
        14.09.2025 18:20

        Про изготовление каменного рубила из обсидиана это тоже за реальные практики. Если "реальные" и "были реальными когда-то давно" семантически не различимы.


  1. Zalechi
    14.09.2025 18:20

    Обожаю историю, так шо спасибо этим ребятам за раскрытие завесы тайны личной переписки этих выдающихся людей — основателей блин….

    Короче пора искать из книжки, чтобы хорошенечко вотвсем разобраться…

    ❤️