Генерирующее (порождающее) программирование
Порождающее программирование (generatе programming) основана на генерации и моделировании групп или отдельных элементов ПС из разных продуктов программирования: объектов, компонентов, аспектов, сервисов, ПИК, систем, характеристик, каркасов и т.п. Базисом этого программирования является ООП, дополненное механизмами применения ПИК, а также свойствами изменчивости, взаимодействия, синхронизации и др. [22].
В нем используются другие методы программирования, например, для поддержки инженерии ПрО как дисциплины проектирования семейств ПС из разных ранее указанных продуктов программирования.
В рамках данного программирования построена объединенная технология генерации как отдельных ПС, так и их семейств. В результате в нем сформирован базис будущего программирования, включающий современные методы программирования, новые формализмы и объединяющие модели, посредством которых можно будет создавать более долговременные качественные программные изделия семейств ПС по принципу конвейера.
Главным элементом проектирования ПС является не уникальный программный продукт, созданный из ПИК для конкретных применений, а семейство ПС или конкретные его экземпляры. Элементы семейства не создаются с нуля, а генерируются на основе общей генерирующей модели домена (generative domain model), т.е. модели семейства, включающей средства определения членов семейства, компоненты реализации и ПИК для сборки любого члена семейства и базы конфигурации, специфицирующей членов семейства.
Каждый член семейства отражает максимум знаний о его производстве, а именно, конфигурации, инструментарии измерения и оценки, методах тестирования и планирования, отладки, визуального представления, а также о многократно используемых ПИК из активной библиотеки [21, 22].
Базовый код элементов активной библиотеки содержит целевой код по обеспечению процедур компиляции, отладки, визуализации и др. Фактически компоненты активных библиотек выполняют роль интеллектуальных агентов, в процессе взаимодействия которых создаются новые агенты, ориентированные на предоставление пользователю возможности решать конкретные задачи ПрО. Для выполнения агентами задач генерации, преобразования и взаимодействия должна создаваться инфраструктура, а именно, расширяемая среда программирования.
Эта среда предназначена для конструирования ПС из компонентов библиотек, а также специальных метапрограмм среды, которые осуществляют редактирование, отладку и взаимодействие компонентов непосредственно в расширяемой среде. С другой стороны, имеется возможность пополнять эту среду новыми сгенерированными компонентами в рамках отдельных ПС семейства, которые относятся к числу компонентов многоразового применения.
Целью порождающего программирования является разработка правильных компонентов для целого семейства и автоматическое их предоставление другим членам семейства. Реализации этой цели соответствует два сформировавшихся направления использования ПИК[13–15]:
1) прикладная инженерия – процесс производства конкретных ПС из ПИК, созданных ранее в среде самостоятельных ПС, или как отдельных элементов процесса инженерии некоторой ПрО.
2) инженерия ПрО– построение семейства ПС путем сбора, классификации и фиксации ПИК, опыта конструирования систем или готовых частей систем конкретной ПрО. При этом создаются системные инструментальные системы поддержки поиска, адаптации ПИК и внедрения их в новый элемент семейства ПС или самого ПС.
Инженерия ПрОвключает в себя инженерию приложений как способ создания отдельных одиночных членов семейства, а также метод конструирования семейств приложений и компонентных систем через механизмы разделения задач ПрО на отдельные члены и многократно используемые решения для сборки отдельных подсистем и членов семейства в общую систему для ПрО.
Основными этапами инженерии ПрО являются:
– анализ ПрО и выявление объектов и отношений между ними;
– определение области действий объектов ПрО;
– определение общих функциональных и изменяемых характеристик, построение модели характеристик, устанавливающей зависимость между различными членами семейства, а также в пределах членов семейства системы;
– создание базиса для производства конкретных программных членов семейства с механизмами изменчивости независимо от средств их реализации;
– подбор и подготовка компонентов многократного применения, описание аспектов выполнения задач ПрО;
– генерация отдельного домена, члена семейства и ПС в целом.
Генерация доменной модели для семейства ПС основывается на модели характеристик, наборе компонентов реализации задач ПрО, конфигурации и спецификации компонентов. Эти элементы генерируются готовую систему или отдельных членов семейства.
Для реализации инженерии ПрО используются следующие вспомогательные процессы:
– корректировка процессов для разработки решений на основе ПИК;
– моделирование изменчивости и зависимостей, которое начинается с разработки словаря описания различных понятий, фиксации их в модели характеристик и в справочной информации сведений об изменчивости моделей (объектных, Use Case, взаимодействия и др.). Фиксация зависимостей между характеристиками модели избавляет пользователей от некоторых конфигурационных манипуляций, которые выполняются, как правило, вручную;
– разработка инфраструктуры ПИК – описание, хранение, поиск, оценивание и объединение готовых ПИК.
При определении членов семейства ПрО используются пространство проблемы и пространство решений.
Пространство проблемы (speace problem) состоит из компонентов семейства системы, в которых используется ПИК, объекты, аспекты и др. Процесс разработки этих членов семейства с ПИК включает в себя и инструменты, созданные в ходе разработки ПрО. В рамках инженерии ПрО разрабатывается модель характеристик, которая объединяет функциональные характеристики системы, характеристики определения свойств выполнения компонентов и изменяемые параметры разных частей семейства, а также решения, связанные с особенностями выполнения групп ПС.
Инженерия ПрО включает разработку моделей групп систем, моделирование понятий ПрО, разработку их моделей характеристик и групп систем для последующего повторного использования. В рамках инженерии ПрО используются горизонтальные и вертикальные типы компонентов, предложенные OMG–комитетом в системе объектного проектирования Corba [23, 24].
К горизонтальным типам компонентов отнесены общие системные средства, а именно, графические пользовательские интерфейсы, СУБД, системные программы, библиотеки расчета матриц, контейнеры, каркасы и т.п. К вертикальным типам компонентов
относятся прикладные системы (медицинские, биологические, научные и т.д.), методы инженерии ПрО, а также компоненты из горизонтального типа по обслуживанию архитектуры многократного применения, интерфейсов и др.
Пространство решений (speace solution) состоит из компонентов, каркасов, образцов проектирования, а также средств их соединения и оценки избыточности. Эти элементы обеспечивают решение задач ПрО. Так, каркас оснащен аппаратом обеспечения изменения параметров модели, требующих лишнюю фрагментацию из «множества мелких методов и классов». Образцы проектирования обеспечивают создание многократно используемых решений в различных типах ПС. Для задания и реализации таких аспектов, как синхронизация, удаленное взаимодействие, защита данных и т.д. применяются технологии ActiveX и JavaBeans, а также новые механизмы композиции, метапрограммирования и др.
Примером систем поддержки инженерии ПрО и реализации горизонтальных методов является система DEMRAL [22, 16], предназначенная для разработки библиотек: численного анализа, контейнеров, распознавания речи, графовых вычислений и т.д. Основными видами абстракций этих библиотек ПрО являются абстрактные типы данных (abstract data types– ADT) и алгоритмы. DEMRAL позволяет моделировать характеристики ПрО в виде высокоуровневой характеристической модели и предметно–ориентированных языков конфигурирования.
Система конструирования RSEB [22] базируется на вертикальных методах, ПИК и ориентирована на использование Use Case элементов при проектировании крупных ПС. Эффект достигается, когда вертикальные методы инженерии ПрО «вызывают» различные горизонтальные методы, относящиеся к разным прикладным подсистемам. При работе над отдельной частью семейства системы могут быть задействованы такие основные аспекты — взаимодействие, структуры, потоки данных и др. Главную роль, как правило, выполняет один из методов, например, графический пользовательский интерфейс в бизнес–приложениях и метод взаимодействия компонентов в распределенной, открытой среде (например, в CORBA).