автореферат диссертации по информатике, вычислительной технике и управлению, 05.13.11, диссертация на тему:Эволюционно расширяемые и повторно используемые языковые средства процедурно-параметрической парадигмы программирования

кандидата технических наук
Легалов, Игорь Александрович
город
Красноярск
год
2007
специальность ВАК РФ
05.13.11
цена
450 рублей
Диссертация по информатике, вычислительной технике и управлению на тему «Эволюционно расширяемые и повторно используемые языковые средства процедурно-параметрической парадигмы программирования»

Автореферат диссертации по теме "Эволюционно расширяемые и повторно используемые языковые средства процедурно-параметрической парадигмы программирования"

На правах рукописи

ЛЕГАЛОВ Игорь Александрович

ЭВОЛЮЦИОННО РАСШИРЯЕМЫЕ И ПОВТОРНО ИСПОЛЬЗУЕМЫЕ ЯЗЫКОВЫЕ СРЕДСТВА ПРОЦЕДУРНО-ПАРАМЕТРИЧЕСКОЙ ПАРАДИГМЫ ПРОГРАММИРОВАНИЯ

05 13.11 - математическое и программное обеспечение вычислительных машин, комплексов и компьютерных сетей

АВТОРЕФЕРАТ

диссертации на соискание ученой степени кандидата технических наук

003160261

Красноярск - 2007

003160261

Работа выполнена в Федеральном государственном образовательном учреждении высшего профессионального образования «Сибирский федеральный университет»

Научный руководитель1

доктор технических наук,

профессор Легалов Александр Иванович

Официальные оппоненты.

доктор технических наук,

профессор Рубан Анатолий Иванович

кандидат технических наук,

профессор Сорокин Владимир Афанасьевич

Ведущая организация: Институт проблем управления РАН (г. Москва)

Защита состоится «1» ноября 2007 г. в 14 часов на заседали диссертационного совета Д 212.098.03 при ФГОУ ВПО «Сибирский федеральны университет» по адресу: 660074, г. Красноярск, ул. Киренского, 2 ауд. Г4-17,

тел 497869, факс (8-3912)-912198

С диссертацией можно ознакомиться в научной библиотеке Политехническог института ФГОУ ВПО «Сибирский федеральный университет».

Автореферат разослан « 1 » октября 2007 г. и выставлен на сайте СФУ Ьйр-//т>ш БИд-кгаБ ги/

Ученый секретарь диссертационного совета, кандидат технических наук, профессор

Вейсов Е А.

ОБЩАЯ ХАРАКТЕРИСТИКА РАБОТЫ

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

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

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

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

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

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

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

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

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

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

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

Научная новизна и положения, выносимые на защиту.

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

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

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

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

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

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

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

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

Апробация работы. Основные положения диссертации докладывались и обсуждались на межвузовских научных конференциях студентов, аспирантов и молодых ученых, Красноярск (2005, 2006, 2007), конференции «Технологии Microsoft в информатике и программировании», Новосибирск (2005), научной конференции молодых ученых «Наука, технологии, инновации», Новосибирск, 2006, международной конференции «Перспективы систем информатики» (рабочий семинар «Наукоемкое программное обеспечение»), Новосибирск, 2006.

Структура диссертации. Диссертация состоит из введения, четырех разделов, заключения, списка литературы и двух приложений Работа содержит 150 страниц основного текста, 21 рисунок, 3 таблицы Список литературы содержит 95 наименований

КРАТКОЕ СОДЕРЖАНИЕ РАБОТЫ

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

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

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

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

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

1 Объекты данных К ним относятся типы данных (элементарные и составные), используемые при создании переменных

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

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

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

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

procedure: р ( .): .. ; priority := 0, Единица

begin Гнездо 1 * ' Гнездо 2 Е№5, компиляции 1

procedure р (. ; priority .= -3; Единица

begin Гнездо 1 Гнездо 2 END' компиляции 2

procedure р ( .) : • , priority = 2; Единица

begin Гнездо 1 Гнездо 2 end, компиляции 3

procedure р (. ) : • , priority •= -1; Единица

begin Гнездо 1 * Гнездо 2 END ' компиляции 4

Рисунок 1 - Распределение процедур с одинаковой сигнатурой

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

В результате сборки всех процедур с одинаковой сигнатурой образуется двоичное дерево, определяющее порядок их подключения и обхода (рисунок 2).

Рисунок 2 - Дерево процедур с одинаковой сигнатурой

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

Во втором разделе исследуются методы построения обобщающих типов данных, повышающие эффективность использования процедурно-параметрической (1111) парадигмы программирования. Эти программные объекты обеспечивают группировку альтернативных типов данных, что зачастую может интерпретироваться как создание категорий понятий Существуют различные способы построения обобщений, тенденция в развитии которых во многом связана с развитием принципов эволюционного программирования. Если первоначально они строились на основе объединения в единой структуре данных различных понятий (например, объединение языка программирования С, вариантная запись языка Pascal), то в последующем осуществлен переход к более гибким эволюционно расширяемым структурам (классы в языках программирования С++, Java, С#, расширяемые типы данных в Oberon и Component Pascal) Для рассмотренных языковых конструкций проанализированы возможности эволюционного расширения и наличие дополнительных полей данных.

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

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

Таблица 1 - Организация обобщений в языках программирования

Обобщение Язык программирования Расширяемость Дополнительные поля

Указатель на все Assembler, С Небезопасная Нет

Объединение С Отсутствует Нет

Контролируемое объединение Ada Отсутствует Нет

Вариантная запись Pascal, Modula-2 Отсутствует Есть

Расширение типа Оберон Безопасная Есть

Тэговый тип Ada-95 Безопасная Есть

Классы с наследованием С++, С#, Java Безопасная Есть

Параметрическое обобщение 02М Безопасная Нет

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

В качестве примера рассмотрим описание типов для множества фигур, состоящего из круга радиусом г и прямоугольника со сторонами a, b Каждая из фигур должна иметь точку привязки к плоскости (х, у), связанную с «центром тяжести» фигуры (центром для круга и точкой пересечения диагоналей для прямоугольника) и углом alpha, определяющим, наклон фигуры на плоскости (для круга игнорируется) Помимо этого, имеется тип Color, задающий цвет плоскости фигуры и ее контура Тогда для описания обобщенной фигуры, размещенной на плоскости, в процедурно-параметрическом языке 02М необходимо описать следующие типы

Circle = RECORD г- INTEGER END, (* Круг *)

Rectangle = RECORD a, b: INTEGER END, (* Прямоугольник *)

Pfigure = POINTER TO Figure;

Figure = CASE TYPE OF Circle | Rectangle END; <* Фигура *) Point = RECORD x, y: INTEGER END, (* Точка *) (* Цветная фигура на плоскости *) NewFigure = RECORD

р: Point, alpha: REAL;

cl, c2: Color; (* Цвет контура и плоскости *) pFig: Pfigure (* Подключаемая специализация *)

END,

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

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

ОбобщеннаяЗапись = RECORD [СписокПолей {";" СписокПолей}]

(Обобщение | [CASE ИмяОбобщения] END). Параметрическое обобщение располагается непосредственно в конце записи поля которой добавляются ко всем специализациям, подключаемым в ходе расширений Применение обобщенной записи позволяет задать тип цветной фигуры, размещаемой на плоскости, следующим образом

(* Цветная фигура на плоскости через обобщенную запись *) NewFigure2 = RECORD

p. Point; alpha' REAL;

cl, c2: Color; (* Цвет контура и фона *) CASE TYPE OF Circle | Rectangle

END;

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

Расширение = УточнИдент "+=" СписокСпециализацнй.

Предположим, что множество фигур необходимо расширить треугольником со сгоронами а, Ь, с Тогда в программе нужно добавить описания

Triangle = RECORD a, Ь, c: INTEGER END; (* Треугольник *) NewFigure2 += Triangle,

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

(* Общий декоратор *) Decorator = CASE HPS OF

PointDecorator | ColorDecorator | AngleDecorator | Figure

END;

(* Декоратор Точки *)

PointDecorator = RECORD p:Point CASE Decorator END, (* Декоратор Цвета *)

ColorDecorator — RECORD с'Color CASE Decorator END, (* Декоратор угла *)

AngleDecorator = RECORD alpha:REAL; CASE Decorator END; (* Цветная фигура на плоскости через декораторы *) NewFigure3 = PointDecorator( AngleDecorator(

ColorDecorator(

ColorDecorator(Figure)))); VAR circle NewFigure3(Circle);

rectangle: NewFxgure3(Rectangle);

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

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

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

- соотношение между логическими модулями и физическими единицами,

- вид логических модулей,

- специализация модулей по функциональному назначению,

- методы связывания;

- методы компоновки в единую программу,

- способы формирования интерфейсов между модулями

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

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

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

писанными и добавляемыми модулями привело в языке 02М к затруднению восприятия логики программы.

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

MODULE идент "(" идент »])»»;»

[СписокИмпорта] ПоследовательностьОбъявлений [BEGIN ПоследовательностьОператоров] END идент ".". Отличие от обычного модуля заключается в указании модуля - родителя в круглых скобках. Знак «*» или «+» за именем родителя определяет права доступа к интерфейсу родительского модуля из модулей, импортирующих подключаемый модуль. В диссертации также приводятся внутренние структуры данных, формируемые при компиляции подключаемых модулей и используемые во время компоновки Помимо этого, на примере мультиметода, показано каким образом изменились структура программы и область действия имен по сравнению с реализацией этой же программы на языке 02М

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

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

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

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

параметрического стиля позволяет избавиться от многих недостатков, присущих 00 решениям.

Таблица 2 — Возможности расширения подходов для простых ситуаций

Ситуация Возможность расширения

Процедурный подход Объектно-ориентированный подход Процедурно-параметрический подход

1 Расширение обобщений новыми специализациями нет есть есть

2 Добавление новых процедур есть нет есть

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

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

5 Создание нового обобщения на основе существующих специализаций есть косвенное есть

6 Добавление мультимето-дов есть нет есть

7 Изменение мультимето-дов при добавлении новых специализаций нет нет есть

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

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

AbstractFactory = CASE END, AbstractProductA - RECORD . . . CASE TYPE END ; AbstractProductB = RECORD . . CASE TYPE END; pA = POINTER TO AbstractProductA, pB = POINTER TO AbstractProductB,

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

PROCEDURE CreateProductA{VAR £-AbstractFactory) () pA :=0; PROCEDURE CreateProductB{VAR £ AbstractFactory) () pB .=0,

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

AbstractFactory += fl NIL, AbstractFactory += £2'NIL; AbstractProductA += ProductAl, AbstractProductB += ProductBl, PROCEDURE CreateProductA

{VAR f-AbstractFactory (£1) } () .pA, . . . PROCEDURE CreateProductB

{VAR f AbstractFactory (fl)} () :pB, AbstractProductA += ProductA2, AbstractProductB += ProductB2, PROCEDURE CreateProductA

{VAR £.AbstractFactory(£2) } () .pA, PROCEDURE CreateProductB

{VAR £'AbstractFactory (£2)} () pB, .

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

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

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

AbstractProduct = CASE

a AbstractProductA | b:AbstractProductB END;

pAP = POINTER TO AbstractProduct,

Обобщенная процедура, задает отношение между фабриками и продуктами

PROCEDURE CreateProduct{VAR f,AbstractFactory, p-pAP>() ■=0;

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

PROCEDURE CreateProduct {VAR f-AbstractFactory(fi), p-pAP(a)}(},

PROCEDURE CreateProduct {VAR f¡AbstractFactory(fl), p.pAP(b)H);

PROCEDURE CreateProduct {VAR f:AbstractFactory(f2), p.pAP(a)H),

PROCEDURE CreateProduct {VAR f AbstractFactory(£2), p pAP(b)}();

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

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

В приложении Б приводятся исходные тексты примера процедурно-параметрической реализации образца проектирования «Абстрактная фабрика»

ОСНОВНЫЕ РЕЗУЛЬТАТЫ И ВЫВОДЫ

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

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

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

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

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

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

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

Результаты работы отражены в следующих публикациях:

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

2 Легалов, И А. Использование паттернов проектирования в компонентном языке / И А Легалов // Информатика и информационные технологии. Межвузовский сборник научных трудов. Красноярск - 2004. - С. 74-78

3 Легалов, А И Языковая поддержка процедурно-параметрического программирования / А И Легалов, Д А Швец, И А Легалов // Проблемы

информатизации региона, ПИР-2005. Материалы девятой научно-практической конференции. Красноярск. - 2005 - С. 169-175

4 Легалов, И А Процедурно-параметрический язык программирования / И А Легалов // Наука, технологии, инновации Материалы Всероссийской науч конф молодых ученых. Часть 1 Новосибирск - 2006 - С 244246

5 Легалов, И А Язык программирования, поддерживающий проце-дурно-параметическую парадигму / И. А Легалов // Технологии Microsoft в теории и практике программирования Конференция-конкурс работ студентов, аспирантов и молодых ученых. Тезисы докладов Новосибирск. - 2006 -С 201-202.

6 Легалов, И. А Организация обобщенных записей процедурно-параметрического языка программирования. / И. А, Легалов // Молодежь и наука начало XXI века Материалы Всероссийской научно-технической конф. студентов, аспирантов и молодых ученых Ч 2 Красноярск - 2006 - С 174-176

7 Легалов, А. И Об особенностях реализации обобщений при процедурно-параметрической парадигме программирования / А. И Легалов, Д А Швец, И А Легалов // Шестая международная конференция «Перспективы систем информатики». Рабочий семинар «Наукоемкое программное обеспечение» Информационный бюллетень. Новосибирск - 2006 - С 82-85

8 Легалов, И. А Поддержка эволюционного программирования за счет использования узлов-расширителей. / И. А Легалов // Молодежь и наука- начало XXI века, материалы Всероссийской научно-технической конференции студентов, аспирантов и молодых ученых1 в 4 ч Ч 1 Красноярск -2007 -С 63-65

Подписано в печать 20.09.2007. Заказ № 741 Формат бумаги 60x90/16. Усл. печ. л 1 Тираж 100 Типография Политехнического института Сибирского федерального университета

Оглавление автор диссертации — кандидата технических наук Легалов, Игорь Александрович

Введение./.

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

1.1 Операции, обеспечивающие эволюционное расширение.

1.2 Эволюционное расширение языковых конструкций.

1.3 Эволюционно расширяемые языковые конструкции, удобные для повторного использования.

1.4 Место процедурно-параметрического программирования в эволюционной разработке программ.3,

1.5 Перегрузка процедур с одинаковой сигнатурой./

1.6 Выводы.

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

2.1 Организация обобщений современных языков.

2.2 Организация и использование параметрического обобщения.

2.3 Особенности организации обобщенной записи.

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

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

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

2.7 Выводы.

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

3.1 Методы построения модульной структуры программы.

3.2 Распределение языков по характеристикам модулей.

3.3 Расширение программы на основе подключаемых модулей.

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

4.1 Типичные ситуации расширения написанного кода.

4.2 Использование ряда парадигм при простых расширениях кода.

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

4.4 Выводы.

Введение 2007 год, диссертация по информатике, вычислительной технике и управлению, Легалов, Игорь Александрович

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

1) Современные методологии разработки программного обеспечения (ПО) ориентированы на инкрементальное наращивание кода.

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

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

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

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

- объектно-ориентированное программирование (ООП) [ 1 -5];

- аспектно-ориентированное программирование (АОП) [6-9];

- порождающее программирование [10];

- процедурно-параметрическое программирование (1ИШ) [11, 12] и другие.

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

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

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

1) 111 111 обеспечивает гибкое эволюционное расширение типов данных и процедур, что позволяет безболезненно наращивать программу 'по различным направлениям. В частности, данная парадигма предоставляет гибкую инструментальную поддержку для расширения мультиметодов [1720]. Однако, возможности подхода, его достоинства и недостатки по сравнению с другими стилями написания кода до конца не исследованы.

2) Существуют различные способы организации программных объектов, обеспечивающих поддержку процедурно-параметрической парадигмы [21-25]. Однако внутренняя организация данных, используемых при ППП, окончательно не проработана. Не проанализированы особенности, связанные с построением более сложных структур данных, объединяющих воедино обычные записи и обобщения. Отсутствует анализ методов реализации таких типов данных.

3) Существующая на сегодня модульная организация процедурно-параметрических программ не является достаточно гибкой [20, 26, 27]. Она базируется на традиционной модульной структуре, применяемой в таких языках, как Оберон [29, 30], Оберон-2 [31, 32], Component Pascal [33, 34]. Эволюционная разработка предъявляет дополнительные требования к взаимодействию модулей, что вносит особенности в их реализацию и требует дополнительного анализа.

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

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

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

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

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

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

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

Научная новизна и положения, выносимые на защиту.

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

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

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

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

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

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

Предложена реализация ряда образцов проектирования с использованием мультиметодов.

3) Полученные научные и практические результаты использованы в учебном процессе по дисциплине «Технология программирования» в ФГОУ ВПО «Сибирский федеральный университет».

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

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

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

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

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

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

- научной конференции молодых ученых «Наука, технологии, инновации», Новосибирск, 2006;

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

Структура диссертации.

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

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

4.4 Выводы

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

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

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

Заключение

При выполнении работы получены следующие научные и практические результаты.

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

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

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

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

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

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

Библиография Легалов, Игорь Александрович, диссертация по теме Математическое и программное обеспечение вычислительных машин, комплексов и компьютерных сетей

1. Буч, Г. Объектно-ориентированный анализ и проектирование спримерами приложений на С++, 2-е изд.: Пер. с англ. / Г. Буч М.:

2. Издательства Бином", СПб: "Невский диалект", 1998 г. 560 с.

3. Бадд, Т. Объектно-ориентированное программирование в действии. / Т. Бадд СПб.: Питер. - 1997.

4. Якобсон, А. Унифицированный процесс разработки программного обеспечения. / А. Якобсон, Г. Буч, Дж.Рамбо СПб.: Питер, 2002. - 496 с.

5. Фридман, A.JI. Основы объектно-ориентированной разработки программных систем. / А.Л. Фридман М.: Финансы и статистика. - 2000. -192 с.

6. Иванова Г.С. Объектно-ориентированное программирование: Учеб.для вузов / Г.С. Иванова, Т.Н. Ничушкина, Е.К. Пугачев М.: Изд-во МГТУим. Н.Э. Баумана. 2001. - 320 с.

7. Colyer, A. Eclipse AspectJ: Aspect-Oriented Programming with AspectJ and the Eclipse AspectJ Development Tools / A. Colyer, A. Clement, G. Harley, M. Webster. Addison Wesley Professional. - 2004.

8. Kiczales, G. Aspect-Oriented Programming. / G. Kiczales, J. Lamping, A. Mendhekar, C. Maeda, C. Lopes, J. Loingtier, J. Irwin In proc. of ECOOP, 1997, LNCS 1241.- pp. 220-242.

9. Шукла, Д. АОП: Более эффективная инкапсуляция и повторноеиспользование кода. / Д. Шукла, С.Ф.К. Селлз // MSDN Magazine / Русскаяtредакция. 2002. Спецвыпуск №1.

10. Павлов, В. Аспектно-ориентированное программирование // В. Павлов http://www.javable.com/columns/aop/workshop/01/

11. Чарнецки, К. Порождающее программирование: методы, инструменты, применение. Для профессионалов.: Пер. с англ. / К. Чарнецки, У.Айзенекер. СПб: Питер, 2005.

12. Легалов, А. И. Процедурно-параметрическое программирование. / А. И. Легалов // Проблемы информатизации региона. ПИР-99: Сб. научных трудов пятой Всероссийской научно-практической конференции. Красноярск. КГТУ. - 1999. - С. 13-27.

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

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

15. Влиссидес, Дж. Применение шаблонов проектирования. Дополнительные штрихи.: Пер. с англ. / Дж. Влиссидес М.: Издательский дом «Вильяме», 2003. - 144 с.

16. Appleton, В. Patterns and Software: Essential Concepts and Terminology. / B. Appleton http://www.enteract.com/~bradapp/docs/patterns-intro.html.

17. Buschmann, F. Pattern-Oriented Software Architecture: A System of Patterns. / F. Buschmann, R. Meunier, H. Rohnert, P. Sommerlad, M. Stal Wiley, Chichester UK, 1996.

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

19. Легалов, А. И. Языковая поддержка эволюционного расширенияпрограмм. / А. И. Легалов, Д. А. Швец // Доклады СО АН ВШ 2003. - №2 (8), июль-декабрь. - С. 102-114.

20. Легалов, А. И. Процедурный язык с поддержкой эволюционного проектирования. / А. И. Легалов, Д. А. Швец // Научный вестник НГТУ.2003.-№2(15).-С. 25-38.

21. Легалов, А. И. Методы реализации процедурно-параметрического , полиморфизма. / А. И. Легалов // Проблемы информатизации региона. ПИР-2000: Тез. докл. Шестой Всероссийской научно-практической конференций. Красноярск: КГТУ. 2000. - С. 69-71.

22. Легалов, А. И. Объекты процедурно-параметрической программы. / А. И. Легалов // Проблемы информатизации региона. ПИР-2000: Тез. докл. Шестой Всероссийской научно-практической конференции. Красноярск. -КГТУ. 2000.-С. 75-77.

23. Легалов, А. И. Особенности процедурно-параметрической парадигмы программирования. / А. И. Легалов // Радиоэлектроника. Информатика. Управление. -2001. -№ 1 (5).- С. 102-106.

24. Легалов, А. И. Методы поддержки параметрического полиморфизма / А. И. Легалов // Научный вестник НГТУ. 2004. - № 3 (18). -С. 73-82.

25. Легалов, А. И. Средства программирования на языке Оберон-2М.'/ А.И. Легалов, Д. А. Швец // Проблемы информатизации региона. ПИР-2001: Сб. науч. трудов. Красноярск: ИПЦ КГТУ. 2002. - С. 61-67.

26. Вирт, Н. Программирование на языке Модула-2.: Пер. с англ. / Н. Вирт-М.: Мир, 1987.-244 с.

27. Wirth, N. The Programming Language Oberon. / N. Wirth -ftp://ftp.inf.ethz.ch/pub/software/Oberon/OberonV4/Docu/OberonReport.Text/.

28. Wirth, N. Programming in Oberon. A derivative of Programming in Modula-2 (1982). /N. Wirth- http://www.oberon.ethz.ch/wirthPiO/.

29. Moessenboeck, H. Object-Oriented Programming in Oberon-2. >1 Moessenboeck H. Springer-Verlag. (c) 1993.

30. Moessenboeck, H. The Programming Language Oberon-2. / H. Moessenboeck, N. Wirth Institut fur Computersysteme, ETH Zurich July. -1996.

31. Component Pascal Language Report. Oberon Microsystems, Inc, 2001.

32. Сайт компании Oberon Microsystems, посвященный языку программирования Component Pascal http://www.oberon.ch/

33. Легалов, А.И. Язык программирования 02М. / А.И. Легалов, Д.А. Швец http://www.softcraft.ru/ppp/o2m/o2mref.shtml. '

34. Бек, К. Экстремальное программирование./ К. Бек. СПб, Пите^.2003.

35. Бек, К. Экстремальное программирование: разработка через тестирование. Библиотека программиста / К. Бек. СПб, Питер. - 2003. - 224 с.

36. Jeffries, R. Extreme programming installed. / R. Jeffries, A. Anderson, C. Hendrickson Addison Wesley. - 2001. - 265 p.

37. Горбунов-Посадов, M. M. Расширяемые программы. / M. M. Горбунов-Посадов -М.: Полиптих, 1999.

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

39. Голуб. Голуб, А.И. С, С++. Правила программирования. / А.И. Голуб М: Бином. - 1996. /

40. Meyer, В. Object-Oriented Software Construction. Second Edition. /'В. Meyer ISE Inc. Santa Barbara (California). - 1997.

41. Reiser, M. Programming in Oberon: steps beyond Pascal and Modula. / M. Reiser, N. Wirth Addison-Wesley, ACM Press. - 1992.

42. Легалов, А. И. Разнорукое программирование // А.И. Легалов -http://www.softcraft.ru/paradigm/dhp/index.shtml

43. Steele, G. L. Common Lisp the Language, 2nd Edition. / G. L. Steele -Digital Press, Bedford, Massachusetts, 1990. -http://www.cs.cmu.edu/.

44. Цикритзис, Д. Модели данных.: Пер. с англ. / Д. Цикритзис, Ф. Лоховски М.: Финансы и статистика, 1985. - 344 с.

45. Wirth N. Type Extensions. / ACM Transactions on Programming Languages and Systems. Vol. 10, No 2, April 1988, p. 204-214.

46. Страуструп, Б. Язык программирования С++. Третье издание.: Пер. с англ. / Б. Страуструп СПб.; М.: "Невский диалект" - "Издательство БИНОМ", 1999.-991 с.

47. Barnes, J. Programming in Ada 95, 2nd Edition. / J. Barnes Addison-Wesley. - 1998.

48. Нортон, П. Программирование на Java. Руководство П.Нортона (в 2-х томах).: Пер. с англ. / П. Нортон "СК-Пресс", 1998 - 900 с.

49. Hejlsberg, A. C# Language Reference. / A. Hejlsberg, W. Scott. -http://www.ishiboo.com/~nirva/csharp/C%23%20Language%20Reference.pdf.t

50. Троелсен, Э. С. C# и платформа .NET. Библиотека программиста.: Пер. с англ. / Э. С. Троелсен СПб.: Питер, 2003. - 800 с.

51. Гуннерсон, Э. Введение в С#. Библиотека программиста. / Э. Гуннерсон СПб: Питер, 2001. - 304 с.

52. Легалов, А. И. Эволюционное расширение программ в функциональном языке параллельного программирования. / А. И. Легалов, Д. В. Привалихин // Вестник Красноярского государственного университета. -2004.-№5/2.-С. 40-48.

53. Александреску, А. Современное проектирование на С++: Пер. с англ. / А. Александреску М.: Издательский дом «Вильяме», 2002. - 336 с. 'f

54. Кристиансен, Т., Программирование на Perl / Т. Кристиансен, Д.i

55. Орвант, Л. Уолл М.: Символ-Плюс, 2004. - 1145 с.

56. Страуструп, Б. Дизайн и эволюция С++: Пер. с англ. / Б. Страуструп М.: ДМК Пресс, 2000. - 448 с.

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

58. Ческис, В. JI. Динамическое формирование объектов. / В. JI. Ческис // Программист. №10. - 2002.

59. Басько A.JL, Легалов А.И. Поддержка мультиметодов в .NET. / А.Л.

60. Басько, А.И. Легалов. // Информатика и системы управления: межвузовский сборник научных трудов. Красноярск. ГУ НИИ ИПУ КГТУ. Вып. 9 2003. -С. 47-54.

61. Игнатов, В. Эффективное использование GNU Make. / В. Игнатов -http://www.geocities.com/SiliconValley/Office/6533/gm.htm

62. Митчелл, М. Программирование для Linux. Профессиональный подход: Пер. с англ. / М. Митчелл, Д. Оулдем, Самьюэл А. М.: Издательский дом «Вильяме», 2003. - 288 с.

63. Шлее, М. Qt. Профессиональное программирование на С++. / М.

64. Шлее. СПб.: БХВ-Петербург, 2005. - 544 с.

65. Легалов, И. А. Использование паттернов проектирования в компонентном языке. / И. А. Легалов // Информатика и информационные технологии. Межвузовский сборник научных трудов. Красноярск. 2004. -С. 74-78.

66. Джехани, Н. Программирование на языке Си.: Пер. с англ. / Н. Джехани М.: Радио и связь, 1988. - 272 с.

67. Рогаткин, Д. Borland Pascal в среде Windows. / Д. Рогаткин, А. Федоров Киев: Диалектика, 1993. - 511 с.

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

69. Легалов, А. И. Об особенностях реализации обобщений припроцедурно-параметрической парадигме программирования. / А. И. Легалов,

70. Д. А. Швец, И. А. Легалов // Шестая международная конференция

71. Перспективы систем информатики». Рабочий семинар «Наукоемкоепрограммное обеспечение». Информационный бюллетень. Новосибирск. 2006.-С. 82-85.

72. Легалов, А. И. Языковая поддержка процедурно-параметрического программирования. / А. И. Легалов, Д. А. Швец, И. А. Легалов // Проблемы информатизации региона, ПИР-2005. Материалы девятой научно-практической конференции. Красноярск. 2005. - С. 169-175.

73. Легалов, И. А. Процедурно-параметрический язык программирования. / И. А. Легалов // Наука, технологии, инновации. Материалы Всероссийской научной конференции молодых ученых. Часть 1. Новосибирск. 2006. - С. 244-246.t

74. Легалов, И. А. Язык программирования, поддерживающий процедурно-параметическую парадигму. / И. А. Легалов // Технологии

75. Microsoft в теории и практике программирования. Конференция-конкурс работ студентов, аспирантов и молодых ученых. Тезисы докладов. Новосибирск. 2006. - С. 201 -202.

76. Grogono, P. Why One Source File Is Better Than Two. / P. Grogono, M. Sakkinen http://oberon2005.ru/paper/pg2000.pdf

77. Parnas, D.L. On the Criteria To Be Used in Decomposing Systems into Modules / D.L. Parnas // Communications of the ACM, Vol. 15, No. 11 -December- 1972.-pp. 1053-1058.

78. Duchier, D. A Higher-order Module Discipline with Separate Compilation, Dynamic Linking, and Pickling. / D. Duchier, L. Kornstaedt, C. Schulte, G. Smolka http://oberon2005.ru/paper/ddl998.pdf

79. Crelier R. Separate Compilation and Module Extension. / R. Crelier // A dissertation submitted to the Swiss Federal Institute of Technology Zurich for the degree of Doctor of Technical Sciences. http://oberon2005.ru/paper/ethl0650.pdf

80. Radensky, A. Module embedding. / A. Radensky // http://www.europrog.ru/paper/ar1998.pdf

81. Фуксман, А. Л. Технологические аспекты создания программных систем. / А. Л. Фуксман М.: Статистика, 1979. - 184 с.

82. Горбунов-Посадов, М. М. Система открыта, но что-то мешает. / М. М. Горбунов-Посадов//Открытые системы. 1996. № 6. С. 36-39.

83. Горбунов-Посадов, М. М. Конфигурационные ориентиры на пути к многократному использованию. / М. М. Горбунов-Посадов ИПМ им. М.В.Келдыша РАН. Препринт № 37,1997 г.

84. Горбунов-Посадов, М. М. Эволюция программы: структура транзакции. / М. М. Горбунов-Посадов // Открытые системы. 2000, № 10. С. 43-47.

85. Сузи, P.A. Язык программирования Python / P.A. Сузи БИНОМ. Лаборатория знаний, Интернет-университет информационных технологий. ИНТУИТ.ру. - 2006. - 328 с.

86. Секунов, Н. Ю. Самоучитель Visual С++ .NET. / Н. Ю. Секунов -СПб., БХВ-Петербург. 2002. - 736 с.

87. Спенсер, П. XML. Проектирование и реализация. / П. Спенсер -Москва, Лори. 2001. - 509 с.

88. Рамодин, Д. IDL заклинания эпохи распределенных вычислений./ Д. Рамодин // Мир ПК. - 1999. - № 9. , -http://www.osp.ru/pcworld/1999/09/160894/

89. Легалов, А.И. Технология программирования. Процедурная и объектно-ориентированная парадигмы. Метод, указания по выполнению лабораторной работы № 1. / А.И. Легалов Красноярск: ИПЦ КГТУ. - 2006. -43 с.

90. Гофман, В. Delphi 5 в подлиннике. / В. Гофман, А. Хомоненко -СПб.: "BHV-Санкт-Петербург", 1999. 800 с.

91. Элджер, Дж. С++: библиотека программиста.: Пер. с англ. / Дж. Элджер. СПб.: ЗАО "Издательство Питер", 1999. - 320 с.

92. Гранд, М. Шаблоны проектирования в Java. Пер. с англ. / М. Гранд. М.: Новое знание. - 2004. - 559 с.1. Ul-CAUtpS 1У./.