Эволюция мультиметодов при процедурном подходе


Содержание

Мультиметоды и диспетчеризация

В этой теме 0 ответов, 1 участник, последнее обновление Васильев Владимир Сергеевич 2 года/лет, 8 мес. назад.

Теория

Для начала напомню, что такое мультиметоды. Посмотрите на приведенный ниже код:

В данном примере, конечно же, будет вызвана первая функция, так как выбор функции-кандидата происходит на этапе компиляции.

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

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

Code-driven vs data-driven

Мультиметоды заставляют писать код там, где довольно часто можно воспользоваться данными. Например, современные графические процессоры, позволяющие зрителю любоваться фотореалистичной компьютерной графикой, по большому счету, умеют выполнять только одну операцию — «нарисовать треугольник». У видеокарты нет функций «нарисовать слона» или «нарисовать попугая». У нее есть всего одна функция — «нарисовать треугольник». А кто это будет, слон или попугай, определяется исключительно данными. Точно также у современных систем, рассчитывающих механику взаимодействия тел, нет функции «рассчитать столкновение автомобиля и фонарного столба». Есть всего одна функция — «рассчитать столкновение двух полигональных моделей». Логика работы таких подсистем до тупости проста, и это не случайно. Гораздо проще нарастить производительность железа, нежели сопровождать и развивать сложную динамическую логику обработки данных.

В итоге

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

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

Если вы решили использовать наследование — будьте бдительны. Если вы решили использовать мультиметоды — будьте бдительны в квадрате.

Технологии программирования. Разные подходы в программировании

Страницы работы

Содержание работы

Общие вопросы. Техника кодирования

  1. Определение технологии программирования. Основные этапы разработки программ.
  2. Цели и задачи процесса разработки ПО. Виды моделей, учитываемые в ходе разработки ПО.
  3. Структура процесса разработки как преобразование моделей. Влияние сложности исходной задачи на процесс преобразования исходной модели в модель исполнителя.
  4. Методические приемы и их роль в процессе разработки ПО. Виды методических приемов и их основные особенности.
  5. Формализации предметной области и способы использования этого приема при разработке ПО. Достоинства и недостатки.
  6. Методики разработки ПО. Виды методик. Достоинства и недостатки.
  7. Общая характеристика технических приемов, используемых при разработке ПО.
  8. Системы программирования. Состав. Варианты реализации.
  9. Традиционная классификация парадигм программирования. Основные парадигмы программирования. Популярность существующих парадигм программирования.
  10. Дополнительные характеристики парадигм программирования. Классификация по методам алгоритмизации и способам конструирования.
  11. Основные виды программных объектов и их объединение в различные конструктивы.
  12. Конструирование агрегатов. Основные способы компоновки при построении агрегатов.
  13. Особенности построения и обработки агрегатов при процедурном подходе.
  14. Особенности построения и обработки агрегатов при объектно-ориентированном подходе.
  15. Сравнение процедурного и ОО агрегирования.
  16. Конструирование обобщений. Основные способы компоновки при построении обобщений.
  17. Особенности построения и обработки обобщений при процедурном подходе. Привести примеры различных вариантов.
  18. Особенности построения и обработки обобщений при объектно-ориентированном подходе.
  19. Сравнение процедурных и ОО обобщений.
  20. Специфические черты ОО программирования (что такое ООП?). Использование понятий «агент» и «сообщение».
  21. Что такое мультиметод? Простейшие способы реализации мультиметодов при процедурном подходе. Достоинства и недостатки.
  22. Понятие RTTI. ОО реализация мультиметодов с использованием RTTI. Достоинства и недостатки.
  23. Эволюция методов конструирования программных объектов.
  24. Моделирование ОО механизмов с использованием процедурного подхода.
  25. Реализация мультиметодов при ООП с использованием диспетчеризации (на примере двойной диспетчеризации). Достоинства и недостатки.
  26. Реализация мультиметодов при ООП с использованием диспетчеризации (на примере двойной диспетчеризации). Достоинства и недостатки.
  1. Объектно-ориентированный подход. Преимущества перед ранее используемыми подходами. Основные акценты в процессе разработки программ.
  2. Издержки наследования.
  3. Каркасы. Назначение, достоинства, недостатки, примеры. Отличие от библиотек.
  4. Основные диаграммы UML и их назначение.
  5. Схемы разработки. Понятие образца проектирования. Роль образцов в процессе разработки.
  6. Принципы построения образцов. Классификация образцов. Общие сведения о базовом каталоге образцов.
  7. Для чего надо использовать образцы (их помощь в разработке программы)?
  8. Рассказать об одном из образцов проектирования и принципах его использования (по выбору).
  9. Фундаментальные характеристики ООП (по Алану Кею).
  10. Достоинства ОО подхода.
  11. Использование в ООП наследования. Принцип подстановки.
  12. Основные формы наследования.
  13. В чем проявляются преимущества наследования?
  14. Технические приемы ООП. Что они дают?
  15. Недостатки ОО подхода.
  1. Специфические черты процедурно-параметрического программирования.

Алёна C++

программирование для прагматиков

четверг, мая 03, 2007

Мультиметоды

Что такое мультиметод обычно объясняется на одном классическом примере. Вот у нас есть иерархия неких фигур.

И надо уметь строить их пересечение.

И хочется, чтобы можно было определить функцию вроде

При вызове которой автомагически бы выбирался нужный из вариантов overlap.
Формальное определение этого всего: «механизм мультиметодов — механизм вызова виртуальных функций на базе более чем одного объекта».

В своей книге «Дизайн и Эволюция С++» (13.8) Страуструп рассказывает, что очень хотел бы, чтобы мультиметоды были в С++, но вот как-то не сложилось. И в С++09 тоже не сложится, похоже. Предложения по мультиметодам они задвинули куда-то далеко. Вот официальные бумаги по этим предложениям раз и два. (все примеры кода взяты оттуда, кстати)

Мультиметоды можно сделать с использованием RTTI и dynamic_cast’ов. Например вот так: Multiple Dispatch. A new approach using templates and RTTI. Там не все так просто, потому что хочется, чтобы не нужно было делать двойную работу и чтобы не нужно было переписывать куски кода в случае появления новых фигур.

Можно обойтись без RTTI и dynamic_cast’ов. Например как здесь: MultiMethods in C++: Finding a complete solution. Код получается довольно тяжелый. По мне так лучше с RTTI.

Про мультиметоды много и загрузочно можно почитать у Александреску в «Современном проектирование на С++». Глава 11. Она так и называется «Мультиметоды».

Ссылки по теме:
Multiple dispatch — статья в Википедии

4 коммент.:

Ах вот, что это такое. Как только стала понятна суть, я пошел нашел, как это делается в Питоне, вдруг кому интересно будет. Способ от создателя Питона Five-minute Multimethods in Python.

Вкратце это работает так. В основе все то же определение типа в духе «if это Rectangle and это Circle: вызывать это». Но поскольку это Питон, там можно получить программный доступ не только к типам, но и к имени функции, и к процессу ее «компиляции». Поэтому вместо написания руками здоровенного if нужные функции помечаются некой аннотацией, и функция при создании во-первых регистрируется в map’е со всеми типами своих параметров, а во вторых на ее место в коде подставляется вызывальщик, который будет эти параметры проверять :-).

Вот. Нам не надо ждать, пока язык расширят :-)

Да чего тут сравнивать с питоном, питон, как динамический язык, в таких вещах на стотыщ очков впереди :)


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

Подумалось мне, что можно и без «загрузочного» Александреску ;) обойтись, смотрю
Meyers, «More effective C++» — и точно, Item 31 «Making functions virtual with respect to more than one object.»
Разные способы, подробно, но без загруза ;)

Для того, чтобы понять что такое настоящие мультиметоды, надо в первую очередь посмотреть на CLOS — Common Lisp Object System. Вот там можно изменить поведение любого класса не затрагивая его кода напрямую. а пре- и пост- методы, это вообще просто праздник какой-то :-)

Реализации алгоритмов/Мультиметод

Мультиме́тод (англ. multimethod ) или мно́жественная диспетчериза́ция (англ. multiple dispatch ) — механизм, позволяющий выбрать одну из нескольких функций в зависимости от динамических типов или значений аргументов.

Содержание

Common Lisp [ править ]

В языке с поддержкой мультиметодов, таком, как Common Lisp, код выглядел бы вот так:

C# [ править ]

Реализация на C# 4.0, с использованием dynamic-типов:

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

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

Особенности языка процедурно-параметрического программирования Текст научной статьи по специальности « Автоматика. Вычислительная техника»

Аннотация научной статьи по автоматике и вычислительной технике, автор научной работы — Легалов Александр Иванович, Солоха Арсений Федорович

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

Похожие темы научных работ по автоматике и вычислительной технике , автор научной работы — Легалов Александр Иванович, Солоха Арсений Федорович,

THE FEATURES OF PROCEDURE-PARAMETRIC PROGRAMMING LANGUAGE

Some specific opportunities of procedure-parametric programming language described. The procedural-parametric programming paradigm overcomes a number of shortcomings specific to a pure object-oriented design and programming approach. It supports more effective evolution software development using multimethods. Generalized records and parametric procedures proposed for it. Furthermore new module organization was used for flexible extension of programs.

Текст научной работы на тему «Особенности языка процедурно-параметрического программирования»

А. И. Легалов, А. Ф. Солоха

Сибирский федеральный университет пр. Свободный, 79, Красноярск, 660041, Россия E-mail: b0ntrict0r@yandex.ru; legalov@mail.ru

ОСОБЕННОСТИ ЯЗЫКА ПРОЦЕДУРНО-ПАРАМЕТРИЧЕСКОГО ПРОГРАММИРОВАНИЯ

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

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

Эволюционная разработка больших программ связана не только с методами их проектирования, большую роль играет использование соответствующих языков программирования. Доминирующий в настоящее время объектно-ориентированный (00) подход обеспечивает частичную инструментальную поддержку безболезненному расширению кода за счет использования механизмов наследования и виртуализации. Вместе с тем при сложных взаимодействиях между классами эволюционное расширение программы только за счет 00-про-граммирования становится затруднительным. Приходится использовать дополнительные алгоритмические приемы и динамическое связывание объектов, что, например, нашло широкое отражение в образцах (паттернах) проектирования [1]. Часто только 00-парадигмы бывает недостаточно для расширения программы, поэтому приходится переходить к мультипа-радигменному стилю [2], базирующемуся на сочетании различных подходов. Необходимость использования сочетания парадигм и подходов во многом обусловлена существованием и таких задач, при решении которых применяется множественный полиморфизм, т. е. мульти-методы. И хотя в данной ситуации возможно чистое объектно-ориентированное эволюционное решение, опирающееся на диспетчеризацию [3], более эффективными являются мульти-парадигменные варианты [3-5].

Вместе с тем следует отметить отсутствие в настоящее время языковых средств, обеспечивающих эффективную поддержку мультиметодов, что не позволяет использовать их напрямую. 0дной из широко известных реализаций является включение мультиметодов в язык CLOS [6]. 0днако предложенные решения обладают невысокой производительностью. Другим подходом, изначально ориентированным на эффективную поддержку мультиметодов, является процедурно-параметрическая (ПП) парадигма программирования [7], обеспечивающая инструментальную поддержку эволюционной разработки программ в рамках процедурного стиля. Для его исследования разработан язык программирования O2M [8]. В последующих работах были представлены результаты, расширяющие возможности парадигмы за счет использования обобщенных записей [9] и подключаемых модулей [10].

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

ISSN 1818-7900. Вестник НГУ. Серия: Информационные технологии. 2011. Том 9, выпуск 3 © А. И. Легалов, А. Ф. Солоха, 201 1

программирования Alien. Как и O2M, новый язык использует синтаксис, аналогичный синтаксису языка программирования Оберон-2 [11]. Однако если 02М разрабатывался как расширение Оберона-2, то Alien является языком, ориентированным на поддержку только процедурного подхода. Это обусловлено тем, что предлагаемые IIII понятия полностью дублируют, а зачастую и перекрывают имеющиеся в Обероне-2 расширяемые типы данных и процедуры, связанные с типом, обеспечивающие объектно-ориентированное программирование. Использование обобщающих процедур в сочетании с обобщенными записями обеспечивает поддержку множественного полиморфизма и включает одиночный полиморфизм, используемый в ОО-подходе в качестве частного случая. Кроме того, для исследования возможностей II -подхода и новых методов модульной организации целесообразным является создание языка, ориентированного только на эту парадигму.

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

(Обобщение I [CASE ИмяОбобщения] END).

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

T0 = RECORD x: INTEGER; CASE OF END;

TO — обобщенная запись, которая содержит пустое обобщение. В следующей строке к записи добавляется специализация с признаком y вещественного типа. В результате возможно существование двух альтернативных объектов: записи, состоящей только из поля x, и записи, которая помимо поля x содержит вещественное поле с признаком у Обращение к этому полю состоит из идентификатора переменной и идентификатора признака, задаваемого в круглых скобках. Например:

Последняя запись является избыточной, так как признак специализированной переменной зафиксирован во время компиляции и является неизменным. Поэтому можно использовать альтернативное обозначение:

Скобки при этом остаются, так как они сигнализируют об использовании обобщенной части.

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

ColoredFigure = RECORD color: INTEGER; CASE Figure END;

где Figure — ранее разработанное обобщение. Подход удобен, когда расширение обобщения желательно скрыть от импортирующего модуля, который может использовать только предоставляемые ему специализации, формируемые в других модулях.

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

В качестве альтернативы расширяемым записям [11] можно реализовать аналогичное решение с применением обобщенных записей. Пусть базовый тип будет выстроен как запись с пустым обобщением:


T = RECORD x, y: INTEGER; CASE OF END;

Тогда от этой записи можно независимо выстроить две специализации с явным указанием признаков:

T += t1: RECORD r: REAL; s: CHAR END;

Используя построенную обобщенную запись, можно получить переменные типа T с двумя специализациями tO и t1:

В качестве примера можно привести следующие варианты доступа к полям этих переменных:

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

Базовые операции над обобщенными записями

Базовые операции обработки обобщенных записей практически не отличаются от соответствующих операций обработки параметрических обобщений, представленных в [8]. В их основе лежат операции обработки расширяемых записей языка программирования Оберон-2 [11]. Допускается статическое и динамическое создание специализированных записей, указателей на обобщенные и специализированные записи, явное приведение обобщенного типа к типу специализации, проверка типа.

Илон Маск рекомендует:  Что такое код conj

Проверка специализации осуществляется операцией IS, в которой первым операндом является указатель на обобщенную запись, а в качестве второго операнда выступает признак специализации. Если к указателю на обобщенную запись подключена проверяемая специали-

зированная запись, то в качестве результата возвращается значение TRUE. Во всех иных случаях возвращается FALSE. Пример использования:

VAR pv: POINTER TO T; .

IF pv IS T(t0) THEN . ELSE .

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

VAR pv: POINTER TO T; v: T(t0);

IF v IS T(t0) THEN v() := pv(t0) END; .

В примере осуществляется присваивание значения обобщенной части динамической переменной обобщенному полю специализированной переменной. Предварительная проверка типа позволяет определить, что динамическая переменная pv имеет специализацию t0. В противном случае присваивание не осуществляется.

Обобщенную запись и ее специализации допускается использовать в операторах присваивания. При наличии эквивалентных специализаций в левой и правой частях операторов присваивания осуществляется присваивание всех полей записи, стоящей справа от знака «:=», полям, расположенным в его левой части. Если специализации различны, то присваивание осуществляется только для общих полей обычной записи. Допускается также прямое присваивание полям специализации обобщенной записи полей основы специализации. Аналогичная ситуация возможна и при использовании в левой части оператора присваивания основы специализации, когда в правой его части располагается соответствующая специализированная запись. В этом случае поля основы заполняются соответствующими полями специализации.

Использование обобщающих параметрических процедур

Обобщенные записи могут использоваться в качестве параметров в обобщающих параметрических процедурах аналогично тому, как используются параметрические обобщения [8]. Описание обобщающей параметрической процедуры имеет следующий вид:

ОбобщающаяПроцедура = PROCEDURE Имя

((ТелоПроцедуры Имя) I «:= 0»).

Отличие от обычной процедуры заключается в присутствии списка обобщающих параметров:

ГруппаОбобщающих = [VAR] Идентификатор

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

необходимы обработчики специализаций для различных комбинаций обобщенных параметров.

Обобщающая параметрическая процедура для вычисления периметра любой геометрической фигуры типа Figure выглядит следующим образом:

// Если нужен только общий интерфейс PROCEDURE P : REAL := 0

// Если используется обработчик по умолчанию TYPE PFigure = POINTER TO Figure; . PROCEDURE P2 ; BEGIN

SendException(‘Incorrect parameter’) END P2.

Обработчики обеспечивают реализацию различных комбинаций специализаций, сопоставляемых с обобщениями из списка обобщающих параметров. Комбинация, на которую «настроен» конкретный обработчик, задается значениями признаков в соответствии со следующими синтаксическими правилами:

ОбработчикСпециализации = PROCEDURE Имя СписокСпециализаций [ФормальныеПараметры] ТелоПроцедуры Имя .

ГруппаСпециализаций = [VAR] Идентификатор < "," Идентификатор >«:» ОбобщающийТип «(» [Признак] «)» I [VAR] Идентификатор «(» [Признак] «)» < "," Идентификатор "(" [Признак] ")">«:» ОбобщающийТип.

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

// Вычисление периметра прямоугольника PROCEDURE P : INTEGER; BEGIN RETURN 2*(r().x + r().y) END P;

// Вычисление периметра треугольника PROCEDURE P : INTEGER; BEGIN RETURN t().a + t().b + t().c END P;

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

Дополнительные возможности обобщенных записей

Построение новых специализаций может также осуществляться на основе обобщенной записи, что позволяет формировать цепочки уточнений произвольной длины. При этом следует отметить, что подобное введение новых специализаций возможно только в том случае,

когда предшествующий тип является обобщенным. Это позволяет контролировать процесс добавления новых уточнений. Например, для формирования новой ступени обобщения T необходимо включить в него обобщение TO, содержащее свою «точку» для расширения, которую можно «подключить» к T:

T0 = RECORD z: INTEGER; CASE OF END; T += t2: TO;

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


TOO = RECORD a: INTEGER; CASE OF END; TO += tOO: TOO;

Использование данного приема позволяет выстраивать сложные зависимости между типами. Для приведенного примера могут быть сформированы следующие специализации:

• из T ^ T(t0) или T(t1) или T(t2),

• из T(t2) ^ T(t2)(t00) и т. д.

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

Тогда появляется возможность выстраивать следующие специализации:

Использование обобщенной записи позволяет применять технику формирования структур данных, базирующуюся на параметрическом подключении в ее конец другой обобщенной записи. Так, можно набирать длинные статические цепочки требуемой конфигурации из универсальных базовых конструкций. Аналогичные по структуре декорирующие элементы используются в образце ОО проектирования «Декоратор» [1], формируя окончательную структуру путем динамического связывания во время выполнения программы. Опираясь на эти элементы, задаваемые обобщенными записями, можно собирать из них разнообразные типы. Один и тот же декорирующий тип может многократно использоваться при порождении нового типа. Например, еще один вариант цветной геометрической фигуры может быть построен из небольших элементов следующим образом:

PointDecorator = RECORD p:Point CASE Decorator END; // Декоратор Цвета

ColorDecorator = RECORD ^Color CASE Decorator END; // Декоратор угла

AngleDecorator = RECORD alpha:REAL; CASE Decorator END;

Decorator = CASE TYPE OF

// Цветная фигура на плоскости через декораторы NewFigure = PointDecorator(AngleDecorator(ColorDecorator(

VAR circle: NewFigure(Circle);

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

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

Синтаксис подключаемого модуля имеет следующий вид:

MODULE идент «(«идент» [«*»|»+» «])»»;» [СписокИмпорта]

[BEGIN ПоследовательностьОператоров] END идент «.».

СписокИмпорта = IMPORT Импорт <"," Импорт>«;».

Импорт = [идент «:=»] идент.

Отличие от обычного модуля проявляется в указании имени модуля-родителя (базового модуля) в круглых скобках. Знак «*» или «+» за именем родителя определяет права доступа к интерфейсу родительского модуля из модулей, импортирующих подключаемый модуль. Правила использования этих знаков совпадают с их применением в языке программирования Оберон.

На практике это позволяет организовать прямые взаимодействия, отличающиеся от существующих языковых структур, используемых в языках Оберон, Оберон-2, О2М. В [10] рассмотрен пример программы, демонстрирующий гибкое добавление новых геометрических фигур и их обобщающих процедур, включая и мультиметоды.

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

во время выполнения. Это повышает эффективность выполнения написанного кода и снижает его размер.

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

1. Гамма Э., Хелм Р., Джонсон Р., Влиссидес Дж. Приемы объектно-ориентированного проектирования. Паттерны проектирования: Пер. с англ. СПб.: Питер, 2001. 368 с.

2. Коплиен Дж. Мультипарадигменное проектирование для C++. Библиотека программиста. СПб.: Питер, 2005. 235 с.

3. Легалов А. И. ООП, мультиметоды и пирамидальная эволюция // Открытые системы. 2002. № 3. С. 41-45.

4. Легалов А. И. Мультиметоды и парадигмы // Открытые системы. 2002. № 5. С. 33-37.

5. Мейерс С. Наиболее эффективное использование C++. 35 новых рекомендаций по улучшению ваших программ и проектов: Пер. с англ. М.: ДМК Пресс, 2000. 304 с.

6. DeMichiel L. G., Gabriel R. P. The Common Lisp Object System: An Overview. URL: http://www.dreamsongs.com/NewFiles/ECOOP.pdf

7. Легалов А. И. Процедурно-параметрическая парадигма программирования. Возможна ли альтернатива объектно-ориентированному стилю? Красноярск, 2000. Рук. деп. в ВИНИТИ 13.03.2000. № 622-В00. 43 с.

8. Легалов А. И., Швец Д. А. Язык программирования О2М. URL: http://www.soft-craft.ru/ppp/o2m/o2mref. shtml

9. Легалов И. А. Применение обобщенных записей в процедурно-параметрическом языке программирования // Науч. вестн. НГТУ. 2007. № 3 (28). С. 25-38.

10. Легалов А. И., Бовкун А. Я., Легалов И. А. Расширение модульной структуры программы за счет подключаемых модулей / Докл. АН ВШ РФ. 2010. № 1 (14). С. 114-125.

11. Свердлов С. 3. Языки программирования и методы трансляции: Учеб. пособие. СПб.: Питер, 2007. 638 с.

Материал поступил в редколлегию 26.07.2011

A. I. Legalov, A. F. Soloha THE FEATURES OF PROCEDURE-PARAMETRIC PROGRAMMING LANGUAGE

Some specific opportunities of procedure-parametric programming language described. The procedural-parametric programming paradigm overcomes a number of shortcomings specific to a pure object-oriented design and programming approach. It supports more effective evolution software development using multimethods. Generalized records and parametric procedures proposed for it. Furthermore new module organization was used for flexible extension of programs.

Keywords: programming languages, programming paradigms, evolution software development, module programming, procedural-parametric programming.

Эволюция мультиметодов при процедурном подходе


** Операционные системы: Windows NT/2000/XP:

— Как конфигурировать ICQ с Windows XP Firewall (передача файлов)

В статье описывается простой способ конфигурирования ICQ под Windows XP Firewall.

Этот FAQ предназначен для тех, кто поверхностно знаком с компьютерными сетями. В нем даются ответы на такие вопросы: как обжать кабели, как использовать hub и switch, как дешевле построить небольшую сеть, чем отличаются различные стандарты Ethernet и т.п.

Автор: Евгений Бобруйко

— Дисководы Candy USB Omni Floppy и Addonics Pocket SuperDisk 240 или Как записать на дискету 32 Мб

Дисковод Addonics, подключаемый к USB порту привлек внимание не тем, что может одновременно работать с дискетами на 1.44, LS-120 и специальными дискетами 240Мб, а тем, что способен записывать на обычную дискетку 32Мб информации.

— Идеальная пара или тестирование системной платы JetWay P4XFA (VIA P4X266A) и графической карты Gainward MX440

В преддверии выставки в Москве появились новая системная плата, основанная на чипсете VIA P4X266 (Pentium 4 с частотой шины 533МГц) — JetWay P4XFA и графическая карта Gainward GeForce4 Pro/600 TV «Golden Sample». Такая обладает не только высокой производительностью и стабильностью, но и уникально низкой ценой.

— Какой процессор оптимален для Windows XP?

С выходом нового графического чипа от ATI — RADEON 8500, уже сложившийся стереотип, что NV >

** Операционные системы: Unix (Linux/FreeBSD):

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

Автор: И. Трофимов

** Программирование на Python:

— Реинкарнация Stackless Python

Альтернативная версия Python — Stackless (буквально «бесстековый») — предлагала уникальные возможности по манипулированию стеком. К сожалению, Stackless не был принят в ядро Python. В статье рассказывается о новом подходе, предложенном создателем Stackless Python, Кристианом Тисмером, направленном на возрождение этой мощной модификации.

Автор: Stephen Figgins, перевод Intersoft Lab

** Программирование (разные материалы):

— Эволюция мультиметодов при процедурном подходе

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

Автор: А. И. Легалов

** Новинки и популярные книги книжного магазина Books.Rusdoc.ru :

* Хакинг сотовых телефонов: Описание секретов и методов взлома сотовых средств связи (Жуков С.)
Описание секретов и методов взлома сотовых средств связи.
* Хакинг и фрикинг. Хитрости (Дымов В.)
Эта книга предназначена только для системных администраторов и тех пользователей, кто интересуется хакингом .
* Эффективный хакинг, для начинающих (Петровский А., Леонтьев Б.)
В этой книге содержится масса полезной информации, практические хакерские приемы, о которых вы больше .
* Самоучитель MatLab 5.3/6.х. + дискета (Ануфриев И.Е.)
Книга посвящена применению пакета MatLab для решения различных математических задач. Изложены основы .
* Самоучитель Microsoft Access 2002. (Бекаревич Ю.Б., Пушкина Н.В.)
Книга посвящена новой версии системы управления базами данных — Microsoft Access 2002. Приводится описание .
* Сектор электронных компонентов. Россия — 2002: Ежегодный каталог: В 2-х томах: Том 2. (Халикеев В.М.)
Ежегодный каталог «Сектор электронных компонентов. Россия-2002» — это двухтомный справочник, .
* Синтез и обработка звука на PC (Деревских В.В.)
Книга посвящена синтезу и обработке звука на компьютере. В качестве основного инструмента для обработки .
* Схемотехника усилительных каскадов на биополярных транзисторах (Ровдо А.А.)
Настоящая книга открывает новую серию «Конструирование схем». Основная задача всех книг, которые .
* Сектор электронных компонентов. Россия — 2002: Ежегодный каталог: В 2-х томах: Том 1. (Халикеев В.М.)
Ежегодный каталог «Сектор электронных компонентов. Россия-2002» — это двухтомный справочник, .

Другие книги вы найдете на http://books.rusdoc.ru
Пока все.

Если у вас есть документы, исходники, которыми вы хотите поделится со всеми, присылайте их по адресу: doc@rusdoc.ru.

Cсылки, вопросы, пожелания, замечания и т.п. направляйте по адресу: webmaster@rusdoc.ru

Приглашаю к сотрудничеству авторов материалов и информационных сайтов компьютерной тематики.

Спонсор проекта — компания DataForce.

Успехов, Александр Томов.

Подписка на рассылку LinuxRSP

Еженедельные свежие новости из мира ОС Linux, обсуждение интересных тем в тематических выпусках, освещение основных свежих дистрибутивов, экскурсы в историю и будующее Linux и многое другое!

Эволюция мультиметодов при процедурном подходе

С помощью модуля multimethods.py (из Gnosis Utils):

С помощью модуля Vlx-multi:

Ссылки

  • Клюев, АлександрМультиметоды и С++. RSDN Magazine #2-2003 (19 июля2003). Проверено 11 июня 2006.
  • Эволюция мультиметодов при процедурном подходе

Wikimedia Foundation . 2010 .

Смотреть что такое «Множественная диспетчеризация» в других словарях:


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

CLOS — (англ. Common Lisp Object System «объектная система Common Lisp’а») система объектно ориентированного программирования, являющаяся частью Common Lisp стандарта языка Лисп. Кроме того, её встраивают в другие диалекты, такие… … Википедия

Алёна C++

программирование для прагматиков

четверг, мая 03, 2007

Мультиметоды

Что такое мультиметод обычно объясняется на одном классическом примере. Вот у нас есть иерархия неких фигур.

И надо уметь строить их пересечение.

И хочется, чтобы можно было определить функцию вроде

При вызове которой автомагически бы выбирался нужный из вариантов overlap.
Формальное определение этого всего: «механизм мультиметодов — механизм вызова виртуальных функций на базе более чем одного объекта».

В своей книге «Дизайн и Эволюция С++» (13.8) Страуструп рассказывает, что очень хотел бы, чтобы мультиметоды были в С++, но вот как-то не сложилось. И в С++09 тоже не сложится, похоже. Предложения по мультиметодам они задвинули куда-то далеко. Вот официальные бумаги по этим предложениям раз и два. (все примеры кода взяты оттуда, кстати)

Мультиметоды можно сделать с использованием RTTI и dynamic_cast’ов. Например вот так: Multiple Dispatch. A new approach using templates and RTTI. Там не все так просто, потому что хочется, чтобы не нужно было делать двойную работу и чтобы не нужно было переписывать куски кода в случае появления новых фигур.

Можно обойтись без RTTI и dynamic_cast’ов. Например как здесь: MultiMethods in C++: Finding a complete solution. Код получается довольно тяжелый. По мне так лучше с RTTI.

Про мультиметоды много и загрузочно можно почитать у Александреску в «Современном проектирование на С++». Глава 11. Она так и называется «Мультиметоды».

Илон Маск рекомендует:  Что такое код i курсив

Ссылки по теме:
Multiple dispatch — статья в Википедии

4 коммент.:

Ах вот, что это такое. Как только стала понятна суть, я пошел нашел, как это делается в Питоне, вдруг кому интересно будет. Способ от создателя Питона Five-minute Multimethods in Python.

Вкратце это работает так. В основе все то же определение типа в духе «if это Rectangle and это Circle: вызывать это». Но поскольку это Питон, там можно получить программный доступ не только к типам, но и к имени функции, и к процессу ее «компиляции». Поэтому вместо написания руками здоровенного if нужные функции помечаются некой аннотацией, и функция при создании во-первых регистрируется в map’е со всеми типами своих параметров, а во вторых на ее место в коде подставляется вызывальщик, который будет эти параметры проверять :-).

Вот. Нам не надо ждать, пока язык расширят :-)

Да чего тут сравнивать с питоном, питон, как динамический язык, в таких вещах на стотыщ очков впереди :)

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

Подумалось мне, что можно и без «загрузочного» Александреску ;) обойтись, смотрю
Meyers, «More effective C++» — и точно, Item 31 «Making functions virtual with respect to more than one object.»
Разные способы, подробно, но без загруза ;)

Для того, чтобы понять что такое настоящие мультиметоды, надо в первую очередь посмотреть на CLOS — Common Lisp Object System. Вот там можно изменить поведение любого класса не затрагивая его кода напрямую. а пре- и пост- методы, это вообще просто праздник какой-то :-)

Инструментальная поддержка процедурно-параметрической парадигмы программирования Швец Дмитрий Александрович

480 руб. | 150 грн. | 7,5 долл. ‘, MOUSEOFF, FGCOLOR, ‘#FFFFCC’,BGCOLOR, ‘#393939’);» onMouseOut=»return nd();»> Диссертация — 480 руб., доставка 10 минут , круглосуточно, без выходных и праздников

Автореферат — бесплатно , доставка 10 минут , круглосуточно, без выходных и праздников

Швец Дмитрий Александрович. Инструментальная поддержка процедурно-параметрической парадигмы программирования : Дис. . канд. техн. наук : 05.13.11 : Красноярск, 2004 180 c. РГБ ОД, 61:05-5/1782

Содержание к диссертации

1 Методы разработки эволюционно-расширяемых программ 16

1.1 Разделение систем программирования по парадигмам 16

1.2 Анализ характеристик, определяющих разработку эволюционно расширяемых программ 21

1.3 Факторы, определяющие построение расширяемых программ 22

1.3.1 Модули с инициализирующими блоками 24

1.3.2 Пространства имен, размещаемые в нескольких единицах компиляции 27

1.3.3 Классы, содержащие конструкторы и деструкторы 27

1.3.4 Технология вертикального слоения 28

1.3.5 Наследование и виртуализация 29

1.3.6 Технология вспомогательных классов 30

1.3.7 Метапрограммирование 31

1.3.8 Аспект ориентированное программирование 32

1.3.9 Субъектно-ориентированное программирование 33


1.3.10 Связывание через интерфейсы 34

1.4 Моделирование методов формирования процедурно-параметрических отношений 35

1.4.1 Алгоритмы, базирующиеся на объектно-ориентированной парадигме 36

1.4.2 Использование процедурного подхода для построения эволюционно расширяемых мультиметодов .. 37

1.4.3 Сравнение объектно-ориентированной и процедурно-параметрической реализаций полиморфизма 39

1.5 Перспективы развития инструментальных средств разработки эволюционно расширяемых программ 42

1.6 Выводы по главе 1 43

2 Методы организации программных объектов, поддерживающих процедурно-параметрическое программирование 45

2.1 Используемые понятия и определения 46

2.1.1 Данные обрабатываемые программой 46

2.1.2 Значения данных 47

2.1.3 Процедуры, используемые для обработки программных объектов 48

2.1.4 Вызовы процедур 50

2.2 Задача эволюционного расширения мультиметодов 51

2.3 Эволюционное расширение мультиметодов в различных парадигмах программирования 52

2.3.1 Расширение мультиметодов при процедурном подходе 53

2.3.2 Расширение мультиметодов при объектно-ориентированном подходе 54

2.3.3 Проблемы существующих подходов эволюционной разработки мультиметодов 56

2.4 Основные понятия процедурно-параметрического программирования 57

2.4.1 Организация параметрических обобщений 58

2.4.2 Организация обобщающих параметрических процедур 60

2.4.3 Организация обработчиков параметрических специализаций 61

2.4.4 Экземпляр параметрического обобщения 62

2.4.5 Вызовы параметрических процедур 63

2.5 Классификация механизмов параметрического обобщения 63

2.5.1 Способы построения параметрических обобщений 64

2.5.2 Методы включения специализаций в параметрическое обобщение 68

2.5.3 Методы конструирования обобщений 69

2.5.4 Способы построения параметрических отношений и их отображение на обобщающие и специализированные параметрические процедуры 73

2.5.5 Способы формирования тел обработчиков специализаций 76

2.5.6 Способы связывания комбинаций специализаций с конкретным обработчиком 77

2.5.7 Фазы формирования параметрических обобщений 77

2.6 Выводы по главе 2 80

3 Описание синтаксиса языка программирования с поддержкой процедурно-параметрического полиморфизма 82

3.1 Языковые конструкции, поддерживающие процедурно-параметрическое программирование 82

3.1.1 Организация параметрических обобщений 83

3.1.2 Указатели на параметрические обобщения и специализации 86

3.1.3 Обобщенные переменные 86

3.1.4 Обобщающие процедуры и обработчики специализаций 87

3.1.5 Вызовы обобщающих процедур 89

3.1.6 Оператор WITH 90


3.2 Организация трансляции процедурно-параметрических программ 91

3.3 Использование языка для решения задачи эволюционного расширения 94

3.3.1 Разработка основной части программы 94

3.3.2 Проявление полиморфизма в клиентском модуле 101

3.4 Выводы по главе 3 104

4 Инструментальная поддержка процедурно-параметрической парадигмы программирования 105

4.1 Оценка эффективности реализации поддержки процедурно-параметрической парадигмы программирования 105

4.2 Методы повышения эффективности реализации ППП 108

4.3 Инструменты процедурно-параметрического программирования 109

4.3.1 Транслятор сязыка 110

4.3.2 Компоновщик параметрических отношений 111

4.3.3 Сборщик проектов 113

4.3.4 Оболочка пользователя 115

4.3 Выводы по главе 4 117

Список использованных источников 120

Введение к работе

Повышение сложности программных систем приводит к необходимости применения более эффективных методов разработки программного обеспечения. Эффективность разработки определяется удобством сопровождения, возможностью безболезненного наращивания программного кода, возможностью повторного использования разрабатываемых программных объектов. В настоящее время наибольшее распространение получила объектно-ориентированная методология (ООМ), во многом соответствующая предъявляемым требованиям. Составной частью ООМ является объектно-ориентированное программирование (ООП). Развитие ООП практически полностью вытеснило процедурное программирование из областей, связанных с разработкой сложных программных систем, за счет возможностей обнаружения ряда ошибок на более ранних этапах построения программы. Это обусловлено расширенными возможностями статической проверки состояний объектов и их типов языками и инструментальными средствами, поддерживающими ООП [21, 79]. Поддержка расширенной работы с типами на уровне языковых и инструментальных средств явилась решающим фактором, приведшим к вытеснению процедурного программирования, несмотря на возможность моделирования объектной парадигмы средствами процедурных языков.

Тем не менее, практическое использование ОО подхода позволило выявить ряд недостатков [16, 55], в частности, сложности при реализации мультиметодов [55, 64]. Преодоление данных недостатков осуществляется путем моделирования при помощи языковых средств объектов, решающих проблемы, связанные с использованием объектно-ориентированных средств. В качестве примера подобного решения можно привести разработку

образцов проектирования [37]. Однако, использование моделирования вновь сдвигает процесс обнаружения ошибок на более поздние этапы.

Одним из возможных путей преодоления недостатков объектно-ориентированной методологии является применение процедурно-параметрической парадигмы программирования [54, 55, 57, 59, 60, 67]. Опираясь на процедурный подход, данная парадигма расширяет его механизмом, поддерживающим полиморфную обработку альтернативных данных без их явного описания в теле процедуры. Этот механизм похож на полиморфизм классов, используемый в ООП. Применение данного механизма обеспечивает как эволюционное расширение программ совместно с повторным использованием написанного ранее полиморфного кода [67], так и возможность использования старых процедурных подпрограмм путем их объединения в обобщенные процедуры, обрабатывающие полиморфные типы данных [70].

Использование программных объектов, поддерживающих процедурно-параметрическое программирование, позволяет расширить функциональные возможности существующих процедурных языков, сделать их более приспособленными для разработки больших программных систем. Процедурно-параметрическую парадигму можно использовать как в качестве альтернативы объектно-ориентированному подходу, так и совместно с ООП [55].

Полноценное использование возможностей процедурно-

параметрического полиморфизма (111111) возможно только при наличии поддержки ППП на уровне языка программирования [56, 58], что позволяет организовать проверку корректности связей между программными объектами на ранних этапах построения программы.

Необходимость исследования возможностей процедурно-параметрической парадигмы обуславливает актуальность задачи создания

систем программирования, поддерживающих процедурно-параметрический полиморфизм. При создании нового языка появляется возможность оценки эффективности различных способов написания программ [91, 103, 104], как с позиций необходимости генерации эффективного исполняемого кода, так и удобства использования процедурно-параметрических языковых конструкций программистом.

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

Для достижения указанной цели в работе решаются следующие основные задачи:

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

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

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

Исследование возможностей применения разработанных языковых конструкций при создании эволюционно-расширяемых программ.

Методы исследования. В диссертационной работе использовались методы дискретной математики, теории алгоритмов, теории языков и формальных грамматик, теории разработки трансляторов. Для описания синтаксиса языка программирования использовались расширенные формы

Бэкуса-Наура. При разработке языка программирования применялись методы синтаксического анализа и компиляции, методы объектно-ориентированного и процедурно-параметрического программирования.

В работе получены следующие научные результаты:

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

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

Разработаны языковые конструкции, поддерживающие различные способы реализации процедурно-параметрической парадигмы программирования.

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

К практическим результатам работы следует отнести:

Проведенные автором исследования позволили создать инструментальные средства языковой поддержки процедурно-параметрической парадигмы программирования.

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


Полученные научные и практические результаты использованы в учебном процессе по дисциплине «Технология программирования»

в Красноярском государственном техническом университете и Красноярском государственном университете. Достоверность и обоснованность результатов диссертации подтверждаются:

Исследованием современного состояния методологий программирования.

Исследованием существующих инструментальных средств поддержки различных парадигм программирования.

Опытом применения разработанного инструментария для написания программ в процедурно-параметрическом стиле.

Публикации и личный вклад в решение проблемы. По теме диссертации опубликовано 12 печатных работ, из которых 8 статей, 4 тезисов докладов.

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

Основные положения диссертации докладывались и обсуждались на:

межвузовских научных конференциях студентов, аспирантов и молодых ученых, Красноярск (2000,2001);

межвузовской научной конференции, Красноярск (2002);

IV Всероссийской конференции молодых ученых по математическому моделированию и информационным технологиям, Красноярск (2003);

3-ей школе-семинаре «Распределенные и кластерные вычисления», Красноярск (2003).

международной конференции «Перспективы систем информатики» (рабочий семинар «Наукоемкое программное обеспечение»), Новосибирск, 2003;

конференции «Технологии Microsoft в информатике и программировании», Новосибирск (2004).

Диссертация состоит из введения, 4 глав, заключения, списка литературы и двух приложений.

Во введении представлены цели и задачи исследования, раскрывается актуальность, новизна полученных результатов, практическая значимость. Приводится перечень вопросов, выносящихся на защиту.

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

программирование; связывание через интерфейсы.

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

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

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

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

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

специфика организации которых ведет к различным способам реализации процедурно-параметрического механизма, К ним относятся:

способы построения параметрических обобщений;

методы включения специализаций в параметрическое обобщение;

методы конструирования обобщений;

способы построения параметрических отношений и их отображение на обобщающие и специализированные параметрические процедуры;

способы формирования тел обработчиков специализаций и тел обобщающих процедур;

способы связывания комбинаций специализаций с конкретным обработчиком;

фазы формирования параметрических обобщений.

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

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

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

В четвертой главе описаны реализованные инструментальные средства обеспечивающие инструментальную поддержку процедурно-

параметрического программирования. К ним относятся: компилятор с языка программирования 02М; компоновщик параметрических отношений; утилита генерации файла проекта, используемого для сборки исполняемого модуля из файлов, полученных после трансляции и компоновки параметрических отношений; оболочка пользователя.

Приложение А содержит описание синтаксиса процедурно-параметрического языка программирования 02М.

В Приложении В приводятся исходные тексты программ, рассмотренных в диссертации.

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

Работа содержит 131 страницу текста, 9 рисунков и 2 таблицы. Список литературы включает 113 наименований.

Использование процедурного подхода для построения эволюционно расширяемых мультиметодов



Однако, в связи с тем, что использование мультиметодов постоянно встречалось на практике, стали разрабатываться алгоритмические приемы, обеспечивающие приемлемую поддержку. Методом, обеспечивающим быстрый вызов обработчика специализации, зависящего от нескольких аргументов (по сравнению с использованием вложенных проверок типов объектов), является множественная диспетчеризация [112]. Однако ее непосредственное использование не поддерживает эволюционного расширения программы. В связи с этим многие работы посвящены эволюционному расширению мультиметодов. Следует отметить, что в большинстве случаев используется смешанный подход к программированию, опирающийся как на объектную, так и процедурную парадигмы.

Для исправления недостатков диспетчеризации, присущих объектно-ориентированной реализации алгоритма в работе [78] предложен метод, сочетающий ассоциативные массивы, проверку типов во время выполнения и внешние процедуры. Таким способом делается попытка смоделировать механизмы, имитирующие таблицу виртуальных функций объектно-ориентированных систем. Однако использование ассоциативных массивов вместо прямого доступа замедляет обработку данных. Помимо этого остаются проблемы, связанные с добавлением новых методов и мультиметодов в уже выстроенную иерархию классов. В работе [21] предложена модифицированная схема, базирующаяся на использовании библиотеки шаблонов. Автоматическая генерация методов классов обеспечивает гибкое формирование их описания. Реализации специализаций может осуществляться в независимых файлах. Набольшая модификация связано только с изменением списка регистрируемых классов, добавляемых в систему. Однако данный метод обладает аналогичными, по сравнению с предыдущим, недостатками, связанными с проблематичным добавлением новых методов.

Для повышения гибкости и ускорения вычислений в работе [63] предлагается использовать ранжирование классов. Эволюционное добавление новых классов осуществляется по пирамидальной схеме, когда каждый новый класс использует информацию о своих предшественниках и ничего не знает о классах, добавляемых позднее. Предложены три варианта метода, базирующиеся как на проверке типов во время выполнения, так и на использовании только диспетчеризации. Несмотря на ускорение вычислений, использование подобных приемов эффективно только при заданном порядке добавления классов. Поэтому, вряд ли данный прием можно использовать в более разнообразных ситуациях.

Большинство из рассмотренных подходов базировались на совместном использовании нескольких парадигм программирование. В работе [100] предлагается динамическое наращивание мультиметодов в рамках обьектно-ориентированного подхода. Несмотря на достаточную гибкость предложенный подход, базирующийся на ассоциативных методах доступа, ведет к серьезному снижению скорости вычислений.

Несмотря на то, что ОО подход может поддерживать эволюционную разработку программ, следует отметить, что используемые при этом приемы ведут к появлению жесткой связи между добавляемыми классами и к увеличению размера интерфейсов у потомков. Сохраняется также основной недостаток ОО подхода: появление новых методов (и мультиметодов) изменяет всю иерархию уже созданных классов. Процедурная реализация в целом выглядит более естественной. Вызов мультиметода по форме и содержанию эквивалентен вызову любой другой процедуры.

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

Илон Маск рекомендует:  Градиенты в CSS

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

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

Эволюционное расширение мультиметодов в различных парадигмах программирования

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

Разработка обобщений чаще всего осуществляется с применением вариантных структур данных, например, вариантных записей в языках программирования Паскаль [33] или Модула-2 [34, 35]. В языках программирования С [46], Ада [47] используются объединения. Применение этих конструкций ведет к централизации обобщения и необходимости его изменения при добавлении каждой новой специализации.

Обобщающие процедуры строятся на основе условных операторов и переключателей, осуществляющих анализ комбинаций признаков всех обобщений, являющихся аргументами. Обработка обобщений при этом рассматривается как процесс построения кода, эквивалентного используемым вариантным типам данных [33, 35]. Каждой комбинации соответствует свой обработчик специализации. Возможен также вариант, осуществляющий обработку по умолчанию. Для оптимизации разбора признаков чаще всего используется их иерархический анализ на основе вложенных операторов селекции. Как и в случае с обобщением, полученный фрагмент кода является централизованным и не допускает эволюционного расширения. Добавление новой специализации связано с изменением уже написанного кода, анализирующего комбинации специализаций [55]. Ситуация характерна как для мультиметода, так и для монометода, для которых при процедурном подходе отсутствует разница по организации инструментальной поддержки.

Не существует принципиальных трудностей в реализации эволюционно расширяемых обобщений. В ряде языков программирования, например, С, для этого можно использовать указатели на структуры, задающие специализации, состоящие из признака и используемого понятия [55, 56]. В языке программирования Оберон [20] для построения подобных специализаций используется механизм наследования. Подобным же образом можно использовать и структуры языка программирования C++ [90]. Однако и в этом случае остаются проблемы, связанные с эволюционным расширением обобщающих процедур.

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

Имеющиеся ограничения обуславливаются историческими причинами и практически не позволяют использовать процедурные языки для эволюционного программирования. Дальнейшее падение интереса к этому стилю, связанное с ростом популярности объектно-ориентированного подхода, не позволило создать на базе них системы программирования, обеспечивающие необходимую инструментальную поддержку. ООП предоставляет инструментальную поддержку, которая, в ряде случаев, обеспечивает гибкое эволюционное наращивание кода. Для построения обобщений используется механизм наследования. В качестве самого обобщения при этом выступает базовый класс. Производные классы используются в качестве специализаций, признаками которых являются типы классов. Инструментальная поддержка механизма виртуальных функций обеспечивает эволюционное построение обобщающих процедур для монометода, т.е., когда сам класс играет роль полиморфного аргумента. В этом случае любой производный класс, сопоставляемый со ссылкой или указателем на базовый класс, может вызвать свой обработчик специализации. Добавление новой специализации позволяет порождать связанные с ней методы, которые, при наличии соответствующей инструментальной поддержки, описываются как в самом классе-специализации [81, 90], так и вне его, например, в виде связных процедур [15]. Вместе с тем, следует отметить, что использование объектно-ориентированного подхода не обеспечивает эволюционного расширения мультиметодов. Применяемая в этом случае диспетчеризация [78] ведет к постоянной модификации всех классов, включая и базовый класс, в случае добавлении новых специализаций. Проблемы, обуславливаемые необходимостью изменять интерфейс класса, возникают и при добавлении новых обобщающих процедур. Они возникают даже в тех языках, где процедуры отделены от данных [15], что во многом обусловлено методом поддержки полиморфизма с использованием таблиц виртуальных функций [91].

Попытки преодоления указанных проблем решаются в ООП с помощью образцов (паттернов) проектирования [2, 5, 37], обобщающих типичные ситуации и вырабатывающие конкретные решения для преодоления возникающих проблем. Зачастую подобные ситуации являются частными случаями мультиметодов, позволяющими, при временной фиксации ряда обобщаемых параметров, свести разработку программы к последовательному использованию монометодов. Применение такого подхода поставило во главу процесса проектирования использование эволюционных приемов написания программ вместо непосредственной разработки модели предметной области. В начале рекомендуется подобрать необходимые образцы проектирования, а лишь затем приступать к окончательной разработке структуры программы. Наблюдается даже появление специалистов по разработке образцов [37].

Для эволюционного расширения мультиметодов можно также использовать специальные приемы. В работе [78] предлагается имитация таблиц виртуальных функций с использованием ассоциативных массивов. Однако при этом приходится использовать процедурные приемы программирования. Ряд схем, связанных с пирамидальным добавлением новых специализаций, представлен в работе [63]. В ней также предлагается решение, использующее только таблицу виртуальных функций. Однако предложенные варианты накладывают ограничения на порядок разработки и ранжирования специализаций, что ведет к потере гибкости и ограничивает повторное использование. Во всех этих подходах практически не решена задача безболезненного добавления новых процедур классов.

Обобщающие процедуры и обработчики специализаций

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

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

В таблице 4.1 приведены основные способы реализации таблицы обработчиков параметрических специализаций. В колонке «ООП минусами отмечены методы реализации, неприменимые при классическом объектно-ориентированном подходе.

В текущей версии транслятора 02М выбор обработчика параметрической специализации осуществляется генерацией одноуровневого оператора выбора (switch), проверяющего требуемые сочетания типов параметров для каждого обработчика. Данный способ выбран благодаря простоте в реализации. Точные временные характеристики не указывались, т.к. на них оказывают значительное влияние архитектура машины, настройки и версии компилятора. Результаты различались на сопоставимых по скорости процессорах Athlon ХР 1500+ с частотой 1,3 ГГц и Pentium 4 с частотой 1,5 ГГц., а также при использовании различных настроек оптимизации компилятора C++ (использовался компилятор Microsoft Visual C++ 6.0).

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

Повышение быстродействия исполняемого кода может достигаться реализацией нескольких альтернативных механизмов выбора обработчика параметрической специализации на основании комбинации типов входных параметров обобщающей процедуры. Например, в случае большого количества входных параметров обобщенной процедуры и/или большого количества типов, включаемых в обобщение, использование таблицы в виде разреженного списка указателей приведет к увеличению быстродействия при малом количестве обработчиков (см. таблицу 4.1). Выбор используемого механизма может задаваться программистом в настройках проекта, или выбираться транслятором на основании результатов анализа программы. Также повышения быстродействия можно добиться путем включения механизма выбора обработчика непосредственно в точку вызова обобщающей процедуры [77, 78, 91]. Снижение объема исполняемого кода может достигаться вынесением механизма выбора обработчика в отдельную подпрограмму, обращение к данной подпрограмме помещается в точку вызова обобщающей процедуры. Уменьшение количества различных механизмов выбора обработчика в рамках одного проекта также приведет к снижению объема исполняемого кода. Следует отметить, что параметризация процедурно-параметрических подпрограмм несколькими типами не обязательно приводит к дублированию кода, как при использовании шаблонных классов [79, 90]. Возможно применение различных стратегий трансляции процедурно-параметрической программы, направленных на повышение быстродействия, снижение объема исполняемого кода или баланс между быстродействием и размерами программы. Разработка транслятора обеспечила практическую поддержку экспериментов, связанных с исследованием процедурно-параметрического полиморфизма. Полученные результаты показали возможность эволюционного расширения программ без существенных потерь в эффективности. 4.3 Инструменты процедурно-параметрического программирован ия Для проведения практических экспериментов с методами процедурно-параметрического программирования разработаны необходимые инструментальные средства [66, 70]. В их состав вошли: — транслятор с языка программирования 02М; — компоновщик параметрических отношений; — сборщик проектов; — оболочка пользователя; Использование данных инструментов повысило эффективность процесса разработки процедурно-параметрических программ. Транслятор предназначен для компиляции программ на языке 02М в объектный код. В качестве объектного кода был выбран язык ANSI C++, что позволило в качестве генератора кода использовать любой компилятор ANSI C++. Подобная схема является общепринятой [91] при создании новых языков, т.к. позволяет упростить разработку транслятора.

Кроме объектного кода, транслятор формирует файл ( .2ml), содержащий информацию о процедурно-параметрических программных объектах, таких как обобщения, обобщающие процедуры, обработчики параметрических специализаций, использованных в обрабатываемом модуле на языке 02М. В дальнейшем данная информация используется компоновщиком параметрических отношений для генерации дополнительных связей между программными объектами, поддерживающими параметрический полиморфизм. В качестве формата для хранения полученной информации используется XML [88] благодаря его гибкости и универсальности. Подобная схема позволяет сделать компоновщик параметрических специализаций мало зависимым от изменений, вносимых в транслятор, что является немаловажным, так как язык и система в целом находятся в стадии развития.

Также транслятором формируется файл описания интерфейса обработанного модуля ( .dfh), в котором описываются все типы и переменные, экспортируемые модулем. Данная информация необходима для организации раздельной компиляции программ на языке 02М.

Инструменты процедурно-параметрического программирования

Утилита Маке2М формирует скрипт для запуска внешнего компилятора C++ с передачей ему всех параметров, необходимых для генерации исполняемого модуля. Подобный механизм введен для отвязки транслятора 02М от особенностей конкретных компиляторов C++.

В текущей версии Маке2М создает скрипты в формате makefile для Microsoft Visual C++ 6.0 и GNU C++. Скрипт может быть использован для генерации как консольного приложения, так и для генерации приложения, использующего графический интерфейс Windows. Вид исполняемого модуля определяется тем, какой из модулей (Console, Win и т.д.) был импортирован в главном файле проекта. В текущей версии поддерживается генерация консольного приложения (совместимо с операционными системами семейств Linux и Windows), консольного приложения Windows (поддерживаются возможности работы с устройствами ввода-вывода, предоставляемые консолью Windows), приложения, использующего графический интерфейс Windows (в настоящий момент находится в состоянии отладки). Схема работы сборщика проектов показана на рисунке 4.6.

Оболочка пользователя транслятора 02М (рис. 4.7) разработана для упрощения работы с транслятором и проектами 02М. Использование Рго2М не является обязательным, т.к. транслятор 02М является консольным приложением и может быть запущен через командную строку.

Графический пользовательский интерфейс выполнен в виде приложения Рго2М, предназначенного для работы в операционных системах Windows 95/98/NT/2000/XP. Приложение Рго2М обеспечивает функции настойки и компиляции проектов 02М. Поддерживается работа с проектами 02М ( .рго), запуск компилятора 02М, компоновщика параметрических отношений Link2M, утилиты Маке2М, внешнего компилятора C++ и запуск полученного в результате компиляции исполняемого файла на выполнение. В качестве внешнего компилятора могут использоваться Microsoft Visual C++ 6.0, MinGW 2.95 (использование данных компиляторов поддерживается по умолчанию) или другой ANSI C++ совместимый компилятор (требуются дополнительные настройки). 1. Для проведения практических экспериментов с множественным полиморфизмом разработан язык программирования 02М, который поддерживает процедурно параметрическое программирование, позволяющее гибко наращивать программу в ходе сопровождения, 2. Реализация параметрической парадигмы в языке, поддерживающем объектно-ориентированный стиль, позволила проводить исследования и сравнительный анализ различных методов эволюционного расширения программ. 3. Разработка дополнительных инструментальных средства и утилит обеспечила повышение эффективности разработки программ. 4. Показана эффективность поддержки множественного и одиночного полиморфизма в системах процедурно-параметрического программирования. Получены следующие научные и практические результаты работы: 1. Проведен анализ методов эволюционной разработки программного обеспечения, на основании которого сделан вывод о перспективности использования процедурно-параметрической парадигмы программирования для реализации множественного полиморфизма и необходимости её инструментальной поддержки. 2. Предложена классификация методов процедурно-параметрического программирования, опирающаяся на различные способы реализации программных объектов, поддерживающих процедурно-параметрический полиморфизм. Проведен анализ методов реализации программных объектов обеспечивающих построение процедурно-параметрических эволюционно расширяемых программ. 3. Разработаны языковые конструкции, поддерживающие процедурно-параметрическую парадигму программирования. На основе проведенного анализа сделан вывод о возможности использования данных конструкций для разработки эволюционно наращиваемых программ. 4. Разработаны инструментальные программные средства, обеспечивающие поддержку процесса создания процедурно-параметрических программ и включающие: — компилятор, обеспечивающий трансляцию исходных текстов процедурно-параметрических программ в объектный код; — компоновщик параметрических отношений, обеспечивающий организацию дополнительных связей программных объектов, поддерживающих процедурно-параметрический полиморфизм; — сборщик проектов, обеспечивающий генерацию скрипта для обработки объектного кода и сборки исполняемого файла; — оболочку пользователя, предназначенную для упрощения работы с инструментальными средствами. 5. Разработанные языковые и инструментальные средства позволили провести апробацию предложенных методов эволюционного программирования.

Процессуальная терапия. Что это?

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

Основатель процессуально-ориентированной психотерапии — Арнольд Минделл, квантовый физик по первому образованию, психолог и даосист, который к своим знаниям в области физики и юнгианской психологии добавил наблюдения за австралийскими шаманами и изучение тибетских духовных практик. Из таких, казалось бы, разных областей возникло направление в психологии, объединившее открытия науки, древние представления о человеке, танец и воображение, ощущения в теле и сновидения.

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

Арнольд Минделл говорит о том, что деление на «так» и «не так», это только верхний слой, консенсусная реальность. Но есть и более глубокий уровень реальности, который проявляется в повседневной жизни в сновидениях, где отсутствует логика и рационализация. А под ним — Основа, Дао, Бесконечность, Пустота, Сущность. Сложно описать словами, но как раз из-за того, что на этом уровне нет никаких категорий.

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

О том, что сны относятся к чему-то большему, чем просто дневные события и предшествующий личный опыт, понял еще Карл Густав Юнг. Минделл, окончив Институт Юнга в Цюрихе, в свои исследованиях заметил, что тело и сны говорят об одном и том же. И его практика сновидений основана не на интерпретации снов и символов, а на «проживании» и осознавании, на чувствовании этих снов.

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

Главное в процессуальной терапии — это следовать за основной энергией процесса человека. Как и в других видах психотерапии, в процессуальной терапии, есть свои «техники» и «приёмчики», но они отбрасываются, если процесс человека пошел совсем в другом направлении. В этом красота процессуальной терапии — наблюдение за тем, как идет процесс, когда терапевт направляет клиента, зеркалит, но не интерпретирует. Здесь нет четких рамок и «должно быть так». Процессуальная терапия приводит человека к большей целостности и пониманию себя.

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

В конце процессуальной сессии клиент осознает, как можно включить пережитый во время сессии опыт в жизнь. Терапевт здесь — не тот, кто обладает большим психологическим и интеллектуальным знанием о психике человека по сравнению с клиентом, а проводник. Личный жизненный опыт самого терапевта здесь не имеет значения, так как терапевт должен оставаться максимально прозрачным. Человек в процессе сам обнаруживает источник мучившей его проблемы, а также ресурс для ее решения в самом себе. Быть прозрачным, не примешивая к процессу клиента свой собственный процесс, основанный на личном опыте — один из главных навыков процессуального терапевта.

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

Алина Петрович, трансперсональный психолог

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL