Шаг 108.
Объектно-ориентированное программирование в системе muLISP87. ООП, ориентированное на сообщения

    На этом шаге мы перечислим основные положения, лежащие в основе объектно-ориентированного программирования.

    Прототипом объектно-ориентированного программирования послужил ряд средств, содержащихся в языке SIMULA-67. Но оформилось оно в самостоятельный стиль программирования в связи с появлением языка Smalltalk, первоначально предназначенного для реализации функций машинной графики и разработанного А.Кеем. Первая версия этого языка создана в 1972 г. и с тех пор построено несколько его версий.

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

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

    Основными особенностями объектно-ориентированных языков являются [2]:

    Суть данного стиля программирования выражается формулой "объект = данные + процедуры".

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

    Объединение данных и процедур в объекте называется инкапсуляцией, и это свойство неотъемлемо присуще объектно-ориентированному программированию. Объектно-ориентированные языки программирования (TURBO Pascal, C++), ориентированные на объекты, а не на посылку сообщений, обладают наряду с этим полиморфизмом, т.е. возможностью использования методов с одинаковыми именами для работы с данными разных типов.

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

    Ряд языков, включая Smalltalk-80, C++, TURBO Pascal и Objective-C, развивают понятие класс за счет то, что классы можно разместить в узлах т.н. дерева наследования. Таким образом строится иерархия классов. При этом пример наследует свойства (методы) своего класса, а также всех суперклассов (надкалассов) этого класса. Методы, определенные в классе-корне дерева, наследуются всеми классами и их примерами.

    Наследование наряду с инкапсуляцией и полиморфизмом является важнейшим свойством объектно-ориентированного программирования.

    Механизм наследования с древовидной структурой в определенной степени ограничен, так как во многих случаях разделение свойств в соответствии со строгой иерархией не может быть достигнуто. Поэтому некоторые языки допускают классы, которые наследуют свойства более чем одного непосредственного суперкласса, в результате чего иерархия классов становится направленным ациклическим графом, а не деревом. Такой механизм добавлен в качестве расширения в Smalltalk. Подобные механизмы доступны также в основанных на языке LISP объектных системах Flavors, CommonLoops и CLOS.

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


    Замечания.
  1. [3, с.125]. В объектно-ориентированном программировании наряду с объектной моделью языка Smalltalk различается модель акторов (actors) Хьюита. Модели немного отличаются друг от друга порядком управления. Если в объектной модели объект обычно возвращает ответ отправителю сообщения (Sender), то в модели с исполнителями объект передает его следующему объекту, который продолжает вычисления.
  2. Описанная модель дискретных объектов, взаимодействующих друг с другом, является хорошей основой для параллелизма. В зависимости от конкретизации объектно-ориентированной модели вычислений существуют различные подходы к распараллеливанию. Наиболее перспективен из них следующий.

        Объект (называемый в этом случае актором), посылающий сообщение, не ждет ответа от своего адресата, а продолжает функционирование. Поэтому сообщения должны быть способны становиться в очередь к адресату. Одновременно может быть активизировано много акторов, причем все вычисления выражаются, главным образом, в терминах их коммуникаций. Языками данного класса являются система Astra, а также Act 1 и Act 3.


   


(1) Фути К., Судзуки Н. Языки программирования и схемотехника СБИС. - М.: Мир, 1988. - 224 с.
(2) Богумиpский Б.С. Руководство пользователя ПЭВМ: В 2-х ч. Ч.1. - Санкт-Петеpбуpг: Ассоциация OILCO, 1992. - 357 с.
(3) Хювенен Э., Сеппянен Й. Мир Лиспа. В 2-х т. Т.2: Методы и системы программирования. - М.: Мир, 1990. - 319 с.

    Со следующего шага мы начнем рассматривать объектно-ориентированную систему FLAVOR.




Предыдущий шаг Содержание Следующий шаг