Как мы научили машины считать и думать за нас? Часть 23. История объектно-ориентированного программирования

В середине 1960-х годов в ИТ-сообществе начала созревать идея о том, что данные должны быть защищены. Было решено спрятать их в недоступные извне «капсулы», где единственными процедурами, способными выполнять над этими данными конкретные действия, будут элементы этой «капсулы».

Как мы научили машины считать и думать за нас? Часть 23. История объектно-ориентированного программирования

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

При программировании компьютеров возможны различные подходы. Доступно множество концепций, из которых разработчик должен выбрать ту, которой он хочет придерживаться. Такая концепция всегда связана с набором стройных принципов, вокруг которых организуется текст создаваемой программы. Этот набор правил называется парадигмой программирования. В этой колонке я буду описывать парадигму объектно-ориентированного программирования и ее историческую эволюцию, но я должен начать с того, что было до того, как эта парадигма была сформулирована.

Императивные и структурные парадигмы

Первые языки программирования, которые были созданы для того, чтобы сделать процесс постановки задач на компьютер более простым и удобным для человека, в основном были ориентированы на спецификацию действий, которые должен был выполнять компьютер. Это отразилось даже в их названиях: ФОРТРАН, являющийся транслятором математических формул, АЛГОЛ, являющийся языком написания алгоритмов — о них я писал в статье «Первые языки программирования» («Rzecz o Historia» из 31 декабря 2021 г.). Эта парадигма была сформулирована на рубеже 1950-х и 60-х годов. Теперь мы называем 1980-е годы императивной парадигмой. Программа представляла собой набор команд: сделай это, проверь это, запусти несколько раз и т. д. Такое программирование позволяло быстро получить программу с требуемыми функциями, поэтому ее ценили и охотно использовали. Однако у этой парадигмы было существенное ограничение: программы, написанные таким образом, было трудно адаптировать к новым требованиям, и почти каждая программа после продолжительного использования требует некоторых изменений, обусловленных эволюцией потребностей пользователей программы и изменяющейся средой (например, из правовых норм).

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

Парадигма объекта

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

Как бы загадочно и сложно это ни звучало, приведу пример. Представьте, что у нас есть два класса: «корова» и «фермер». Класс «корова» может генерировать большое количество специфических объектов, которые могут быть названы по отдельности: Красула, Чарна, Наровиста и т. д. У каждого объекта свои процессы: пищеварение, производство молока, возможные заболевания и т. д., но никто вне эти процессы регулируются. С другой стороны, объект, относящийся к классу «фермер» (например, Ян), может посылать сигналы объектам класса «корова»: корм, вода, молоко и т. д. Эффекты этих сигналов влияют на то, какие процессы происходят внутри объектами класса «корова» (возможно, в других объектах), в результате чего объекты этого класса могут посылать свои сигналы объекту класса «фермер»: что они голодны, что их надо доить, что надо убирать экскременты и т. д. Но только элементы предметной капсулы Яна определяют, какие действия будут выполняться.

Конечно, объектно-ориентированная парадигма имеет много других атрибутов, в том числе такие как наследование и полиморфизм, но я не буду обсуждать их здесь, потому что эта статья не предназначена для обучения методам объектно-ориентированного программирования, а описывает историю возникновения и развития этой парадигмы.

Начал норвежский

На основе многочисленных предыдущих статей из этой серии читатель мог узнать, что новости в информатике чаще всего рождаются в США. Тем временем объектная парадигма была создана норвежцами Оле-Йоханом Далем и Кристен Нигаард, работающими в Норвежском вычислительном центре (Norsk Regnesentral). После нескольких лет работы они представили новый язык для компьютерного моделирования под названием Simula 67 в 1967 году. Язык как язык — я пользовался и не был в восторге. Кроме того, первые приложения были нацелены на нужды ВМС Норвегии, поэтому они были далеки от того, чем занимался я (моделирование функционирования фрагментов мозга). Вот почему я изначально недооценил Simula 67.

Но именно в этом языке были впервые введены основные понятия объектной парадигмы. Они были вдохновлены Simula, среди прочего, Бьерн Страуструп (разработчик C++) и Джеймс Гослинг (разработчик Java), в настоящее время самые популярные объектно-ориентированные языки.

Как мы научили машины считать и думать за нас? Часть 23. История объектно-ориентированного программирования

Джеймс Гослинг, создатель языка Java. Его вдохновили норвежцы Даль и Найгаард, создавшие объектно-ориентированную парадигму Simula 67

ESTELLE GRUNBERG/FAIRFAX MEDIA/GETTY IMAGES

Новшества, привнесенные языком Simula, были оценены сотрудниками исследовательского центра Xerox [Xerox Palo Alto Research Center], весьма заслугой в развитии информатики. Результатом стал язык Smalltalk, разработанный в первую очередь Аланом Кеем с помощью Дэна Ингалса и Аделы Голдберг. Язык разрабатывался и улучшался сначала внутри Xerox, а после его официального объявления в 1980 году во многих исследовательских центрах по всему миру. Это был болезненно объектно-ориентированный язык, потому что все в нем было либо классом, либо объектом.

Для реализации программ на языке Smalltalk его создатели ввели концепцию виртуальной машины, которая сейчас используется во многих языках, особенно в Java. Проще говоря, идея виртуальной машины заключается в том, что программа, написанная на определенном языке (на момент введения этой идеи этим языком был Smalltalk), транслятор не переводит на уровень двоичного кода компьютеру, на котором должна выполняться программа, только в некую переходную форму, называемую байт-кодом. Этот байт-код управляет частью программы-транслятора, называемой виртуальной машиной, и эта виртуальная машина взаимодействует с электронным процессором компьютера различными способами на основе байт-кода, что в конечном итоге приводит ко всем необходимым действиям. Звучит немного сложно, но на практике это хорошо работает, поскольку позволяет сочетать преимущества компилируемого и интерпретационного перевода. Однако я не развиваю эту тему дальше со стороны IT, а отмечу тот исторический факт, что эта концепция виртуальной машины родилась в Xerox с появлением языка Smalltalk.

Сегодня мало кто использует Smalltalk. Я пробовал несколько раз, и мне это не очень нравится. Но я одобряю тот факт, что в книге Эриха Гаммы, Ричарда Хелма, Ральфа Джонсона и Джона Влиссайдса «Разработка программного обеспечения: шаблоны проектирования», которая считается библией программиста, Smalltalk отведена роль монументального языка.

Преимущества объектно-ориентированного программирования оценили и создатели языков программирования, которые уже имеют устоявшуюся репутацию, но значительно улучшают свои свойства благодаря добавлению объектно-ориентированных механизмов. Например, из языка C, развитие и разработку которого я описал в статье «Звезда среди средств программирования — язык C» («Историческое дело» от 28 января 2022 г.), датский ученый-компьютерщик Бьярне Страуструп создал в 1979 г. Язык C++, т.е. инструмент, сочетающий в себе преимущества структурного и объектно-ориентированного программирования. Первая версия языка называлась «C с классами» и работала с транслятором Cpre, но в 1983 году название было изменено на C++ и был создан новый транслятор Cfront. В настоящее время используется версия 11 C++ 2017, но возможны дальнейшие модификации.

Также были разработаны объектно-ориентированные версии других языков программирования.

Языки, созданные с самого начала как объектно-ориентированные

Первым языком, построенным с нуля как объектно-ориентированный, был язык Eiffel, созданный в 1986 году Бертраном Мейером. Он был предоставлен бесплатно Некоммерческим международным консорциумом Eiffel (NICE). На смену ему пришел более популярный язык Java, запущенный в 1991 году Джеймсом Гослингом, Майком Шериданом и Патриком Нотоном. Язык с самого начала был основан на объектно-ориентированной методологии. Он приобрел популярность после того, как Sun Microsystems представила первую публичную реализацию этого языка в 1996 году, которая стала использоваться не только в компьютерах, но и в смартфонах. Java используется интернет-браузерами. Язык и его трансляторы постоянно модифицируются и модернизируются, в 2006 году были определены новые версии: Java EE, Java ME и Java SE.

Когда в 1991 году была создана Java, объектно-ориентированный Python также был инициализирован. Его создателем был Гвидо ван Россум. Язык активно развивается и набирает сторонников, потому что он предоставляется бесплатно на основе открытого исходного кода. Последние версии этого языка появились в январе этого года.

Автор — профессор AGH в Кракове

Оцените статью
( Пока оценок нет )

В профессии с 2008 года. Профиль - международные отношения и политика. Почта: andreykozlov07@gmail.com

Последние новости 24 часа
Как мы научили машины считать и думать за нас? Часть 23. История объектно-ориентированного программирования
Премьер-министр Китая озвучил цель роста ВВП на 2022 год. Военные расходы увеличатся