[Возврат на основную страницу раздела]
© 2007 г. Легалов Игорь Александрович
Статья первоначально опубликована в журнале "Научный вестник НГТУ" и имеет следующие выходные данные:
Легалов И. А. Применение обобщенных записей в процедурно-параметрическом языке программирования. / И.А. Легалов // Научный вестник НГТУ. – 2007. – № 3 (28). – С. 25-38.
Полностью материал доступен в формате pdf (~227 кб)
Аннотация
Рассматривается применение обобщенных записей вместо процедурно-параметрических обобщений в рамках процедурно-параметрической парадигмы программирования. Обобщенная запись использует как основу обычную запись, расширяясь на конце процедурно-параметрическим обобщением. Это повышает эффективность создания новых типов данных и обеспечивает более гибкое построение эволюционно расширяемых программ.
Преамбула
Эволюционная разработка в настоящее является неотъемлемой чертой многих программных проектов. Это обусловлено как неполным знанием структуры будущей программы во время проектирования и начальной эксплуатации, так необходимостью ускорить ее выход на рынок. Эволюционное программирование хорошо согласуется с инкрементальным проектированием, так как позволяет добавлять новый код без изменения написанного.
Наличие инструментальной поддержки эволюционной разработки во многом способствовало популярности объектно-ориентированного программирования (ООП). В рамках ООП были предложены паттерны [1], обеспечивающие гибкое наращивание программы, за счет динамического полиморфизма, поддерживаемого в современных объектно-ориентированных (ОО) языках сочетанием виртуализации и наследования. Вместе с тем следует отметить, что безболезненное расширение кода в рамках ООП имеет определенные ограничения. В частности, невозможно прямое расширение мультиметодов. Предлагаемые для этого решения [2-4] в основном ведут к введению дополнительных конструктивов и алгоритмов, в которых, чаще всего, объектно-ориентированный стиль смешивается с процедурным.
Во многом эти проблемы ОО подхода обусловлены тем, что мультиметод в большей степени является внешней процедурой, поддерживающей множественный динамический полиморфизм, чем методом, размещаемым внутри класса, обеспечивающего только одиночный динамический полиморфизм. Не спасает положение и использование параметрического программирования, реализуемого, например, в языке C++ [5], посредством шаблонов. Шаблоны поддерживает только статический полиморфизм, который должен быть полностью определен во время компиляции, и не обеспечивают динамического связывания данных в ходе выполнения программы. Следует отметить, что множественный динамический полиморфизм был реализован в языке программирования CLOS [6]. Однако эта реализация оказалась излишне громоздкой, что не привело к ее заимствованию в других языках, в частности, в C++ [7].
Для повышения эффективности инструментальной поддержки множественного динамического полиморфизма была предложена процедурно-параметрическая парадигма [8], расширяющая возможности процедурного подхода в области эволюционного программирования. Ее использование базируется на параметрическом механизме формирования отношений между данными и обрабатывающими их процедурами, который может быть реализован различными способами [9]. Это обеспечивает эволюционную разработку как данных, так процедур и поддерживает механизм строгой типизации, присущий процедурным языкам. Для апробации парадигмы, на базе языка программирования Оберон-2, был разработан язык О2М [10], использование которого позволило продемонстрировать возможности процедурно-параметрического программирования (ППП) [11].
Спецификой ППП является возможность гибкого изменения состава параметрических обобщений – типов данных, объединяющих в единую категорию множество альтернативных понятий. Обобщения можно создавать как на основе уже существующих понятий, так и безболезненно расширять их за счет включения новых понятий в этой же или других единицах компиляции. Включаемые понятия отличаются признаками и образуют специализации, а существующая инструментальная поддержка обеспечивает ранжирование этих специализаций внутри обобщения, сопоставляя с каждым из них локальный индекс.
Обобщенные параметрические процедуры используют параметрические обобщения в качестве специальных формальных параметров. Множественный полиморфизм обеспечивается за счет использования в качестве параметров нескольких обобщений. При вызове такой процедуры в качестве фактических параметров осуществляется подстановка конкретной комбинации специализаций, признаки которых однозначно определяют алгоритм их обработки. Это позволяет сформировать для каждой из комбинаций специализаций отдельную процедуру – обработчик специализаций. Механизм инструментальной поддержки ППП обеспечивает независимое написание обработчиков специализаций, их добавление при расширении обобщений, контролирует наличие всех требуемых обработчиков. Выполнение указанных функций осуществляется во время компиляции модулей программы и их компоновки. Возможно также окончательное формирование параметрических отношений и во время выполнения. Добавление новых специализаций и их обработчиков может осуществляться в отдельных единицах компиляции, обеспечивая тем самым гибкое эволюционное расширение программы как по данным, так и процедурам.
Вместе с тем, использование «чистых» параметрических обобщений, рассмотренных в работах [8-11] не вполне удобно для программирования, так как в ряде случаев требует использования дополнительных промежуточных структур данных. Для повышения эффективности процедурно-параметрического программирования в работе предлагаются обобщенные записи, в состав которых включается параметрическое обобщение. Рассматриваются особенности реализации и использования обобщенных записей.
Основные разделы
-
Введение
-
Специфика обобщенных записей
-
Реализация обобщенных записей
-
Основные операции над обобщенными записями
-
Использование обобщающих параметрических процедур
-
Дополнительные возможности
-
Отличие от существующих методов создания обобщений
-
Заключение
Список литературы
-
Гамма Э., Хелм Р., Джонсон Р., Влиссидес Дж. Приемы объектно-ориентированного проектирования. Паттерны проектирования. / Пер. с англ. - СПб: Питер, 2001. - 368 с.
-
Мейерс С. Наиболее эффективное использование C++. 35 новых рекомендаций по улучшению ваших программ и проектов: Пер. с англ. - М.: ДМК Пресс, 2000. - 304 с.
-
Легалов А.И. ООП, мультиметоды и пирамидальная эволюция. // Открытые системы - 2002, № 3 (март). С. 41-45.
-
Легалов А.И. Мультиметоды и парадигмы. // Открытые системы - 2002, № 5 (май). С. 33-37.
-
Вандэвурд Д. Д., Джосаттис Н. М. Шаблоны C++: справочник разработчика. : Пер. с англ. – М.: Издательский дом «Вильямс», 2003. – 544 с.
-
Steele G.L. Common Lisp the Language, 2nd Edition. – Digital Press, Bedford, Massachusetts, 1990 (электронная версия документа размещена на сервере http://www.cs.cmu.edu/).
-
Страуструп Б. Дизайн и эволюция C++: Пер. с англ. - М.: ДМК Пресс, 2000. - 448 с.
-
Легалов А.И. Процедурно-параметрическая парадигма программирования. Возможна ли альтернатива объектно-ориентированному стилю? - Красноярск: 2000. Деп. рук. № 622-В00 Деп. в ВИНИТИ 13.03.2000. - 43 с.
-
Легалов А.И. Методы поддержки параметрического полиморфизма // Научный вестник НГТУ. – 2004. – № 3 (18). – С. 73-82.
-
Легалов А.И. Швец Д.А. Язык программирования О2М (электронная версия документа размещена по адресу
http://www.softcraft.ru/ppp/o2m/o2mref.shtml).
-
Легалов А.И. Швец Д.А. Процедурный язык с поддержкой эволюционного проектирования. – Научный вестник НГТУ, № 2 (15), 2003. С. 25-38.
-
Wirth N. Type Extensions. / ACM Transactions on Programming Languages and Systems. Vol. 10, No 2, April 1988, p. 204-214.
-
Страуструп Б. Язык программирования C++. Третье издание. /Пер. с англ. - СПб.; М.: "Невский диалект" - "Издательство БИНОМ", 1999. - 991 с.
-
Reiser M., Wirth N. Programming in Oberon: steps beyond Pascal and Modula. / Addison-Wesley, ACM Press. – 1992.
-
Джехани Н. Программирование на языке Си: Пер. с англ. – М.: Радио и связь, 1988. – 272 с.
-
Немюгин С., Перколаб Л. Изучаем Turbo Pascal. – СПб., Питер. 2000.
-
Вирт Н. Программирование на языке Модула-2. /Пер. с англ. - М.: Мир, 1987. – 244 с.
-
Джехани Н. Язык Ада. /Пер. с англ. – М.: Мир, 1988. – 522 с.
[Возврат на основную страницу раздела]
|