
В 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)
tabfor
14.09.2025 18:20На самом деле ещё с 80-х (кажется) начали немного различать ООП и ООД. Мне как-то довелось портировать старый, написанный в 90-х код на С в С++. Программист разбил систему на модули, каждый из которых содержал объявления переменных и функции, и объединил их элегантным монитором выполнения. Мне достаточно было переопределить для каждого модуля класс и собрать это все в С++.
То есть, главное - это проектирование, дизайн или ООД, а ООП , программирование - это реализация, основанная на языковой семантике.
baldr
14.09.2025 18:20Я не против типов, но я не знаю ни одной системы типов, которая не была бы сплошной головной болью, поэтому я до сих пор предпочитаю динамическую типизацию.
Я полагаю, это можно в рамочку и цитировать везде, хоть это и личное мнение.
panzerfaust
14.09.2025 18:20Чем дальше, тем больше эти "разборы" писем 20-30-летней давности похожи на разбор послания Павла коринфянам. То есть такая вещь в себе, живущая совершенно отдельно от реальной практики.
Dhwtj
полагаю, Smalltalk был очень медленным, а надо было C/ASM с батарейками