VpPuZzle. Обзор. Ч.2

Материал из wikiru.visual-prolog.com

Автор: Виктор Юхтенко

VpPuZzle. Обзор

Pzl-система

Все свойства pzl-механизма обеспечиваются набором средств, объединенных названием pzl-Система (PzlSystem). Pzl-система содержит ряд классов, представленных исходными кодами, и ряд классов, представленных в виде статических библиотек (LIB). При этом статические библиотеки написаны с на языке Visual Prolog системы VIP.

На следующей картинке показана структура pzl-системы для главного (EXE) приложения

SystemStructure Exe.png

а следующая картинка - структуру pzl-контейнера, генерирующего DLL.

SystemStructure Dll.png

Как видно, эти проекты содержат разные статические библиотеки, а в случае главного (EXE) приложения дополнительно добавлен пакет pzlPort. Необходимости в запоминании всех этих файлов нет, поскольку средства pzl-технологии генерируют все необходимые файлы автоматически.

Пакет PzlPort является составной частью основного исполняемого приложения, использующего pzl-технологию, и является ядром pzl-технологии. PzlPort отвечает за загрузку и выгрузку DLL. Когда пользователь вызывает конструктор pzl-компоненты, PzlPort находит DLL, которая содержит соответствующую pzl-компоненту. Если эта DLL не загружена, то она загружается и затем PzlPort взаимодействует с классами pzl-контейнера.

PzlPort производит поиск компоненты в следующем порядке:

  • В регистрационном файле пользователя
  • В разделе Current User реестра Windows
  • В разделе Local Machine реестра Windows

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

Таким образом, пользователь не имеет дела с DLL непосредственно и имеет дело только с классами таким же точно образом, как и при обычном программировании в стиле VIP.

Совместимость и авторизация

Особенностью использования DLL, построенных на базе VIP (VipDLL), является то, что как главное приложение, построенное с помощью VIP, так и VipDLL используют одни и те же библиотеки периода исполнения (runtime libraries), которые напрямую зависят от версии VIP, как продукта. Если VipDLL была построена для использования с одной версией библиотек, а главное приложение использует другую версию библиотек, то может возникнуть проблема несовместимости. Механизмы pzl-технологии предусматривают контроль совместимости версий так, что PzlPort проверяет возможность работы с каждой VipDLL перед началом взаимодействия с ней. Если обнаружена возможность несовместимости, то VipDll выгружается и генерируется исключительная ситуацият (exception).

Кроме того pzl-механизмы предусматривают контроль уровня лицензии для предотвращения несанкционированного использования компонент. Для этого предусмотрены три уровня лицензирования:

  • Public (Открытый)
  • Commercial (Коммерческий)
  • Exclusive (Экслюзивный)

Ограничения на использование определяются соотношение уровней лицензий pzl-порта и pzl-контейнера.

PzlPort может иметь уровни Commercial и Exclusive, в то время как pzl-контейнер может иметь любой из указанных уровней. Лицензия уровня Exclusive имеет наивысший приоретет. PzlPort может взаимодействовать с контейнерами, имеющими лицензию того же или более низкого уровня. Так pzl-порт с уровнем Commercial может взаимодействовать с контейнерами Public и Commercial, но не может взаимодействовать с контейнером уровня Exclusive.

Лицензии уровня Exclusive являются персональными лицензими и могут создаваться для конкретного пользователя или для конкретного приложения. Каждая лицензия уровня Exclusive является уникальной и имеет издательский идентификатор.

Установлено, что pzl-порт уровня Exclusive может взаимодействовать с любым контейнером уровня Public, любым контейнером уровня Commercial и с любым контейнером уровня Exclusive, имеющим тот же издательский идентификатор, что и сам PzlPоrt.

Регистрация активных объектов

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

Посмотрим вновь на главную конструкцию использующую объект в VIP:

...
   MyClassInstance =myClass::new() 
   MyClassInstance:callNeededPredicate(), 
...

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

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

Сохранение указателя осуществляется так

  MyClassInstance =myClass::new(), 
  pzl::register(MyClassInstance1, MyClassInstance), 
  MyClassInstance:сallNeededPredicate(), 
...

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

...
  Object =pzl::getObjectByName_nd(MyClassInstance1),
  !,
  MyClassInstance=tryConvert(iMyClass, Object), 
  MyClassInstance:сallNeededPredicate(),
...

Класс Pzl содержит много других полезных предикатов, связанных с регистрацией указателей на экземпляры.

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

Общее пространство обработки ошибок

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

Общий поток вывода STDO

Все компоненты, активные в данный момент, используют единый стадартный поток вывода.

Заключение

Для создания технологии работы с DLL были использованы следующие свойства системы программирования Visual Prolog:

  • Возможность использования детерминированных и недетерминированных предикатв, вызываемых из DLL
  • Главное приложение и DLL работают в одном и том же пространстве памяти
  • Пакетная организация исходных текстов
  • Гибкая концепция объектно-ориентированного программирования
  • Гибкая концепция интерфейсов, интегрированная с концепцией доменов
  • Наличие домена object, являющегося родительским доменом для всех объектов
  • Локализация констант в классах
  • Условная компиляция
  • Возможность построения статических библиотек

Pzl-Технологии присущи все преимущества и недостатки, присущие системе программирования VIP, поспольку она не нарушает стиль программирования, присущий программированию в VIP.

Pzl-технология имеет ряд ограничений:

  • Возможность использования только одного конструктора
  • Все взаимодействующие классы должны быть динамическими классами, то есть классами, порождающими объекты
  • Имя класса и имя базового интерфейса должны раличаться
  • Будучи помещенными в DLL, pzl-Компоненты могут быть вызвваны только приложениями, которые используют pzl-технологию и созданы с использоанием средств системы программирования Visual Prolog

Следующие ограничения, характерные для применения DLL в VIP, должны быть приняты во внимание:

  • Компоненты, основанные на DLL, должны иметь стабильный набор интерфейсов. После того, как DLL построена, любые изменения в используемых интерфейсах могут привести к прерываниям по ошибке. Для избежания этого все компоненты, взаимодействующие с модифицированной компонентой должны быть перестроены.
  • DLL, построенные с использованием VIP, пользуются библиотеками периода исполнения, поставляемыми в составе системы Visual Prolog. Эти библиотеки зависят от версии VIP. Любые модификации в этих библиотеках периода исполнения, связанные с изменениями версии VIP могут вести к нестабильности приложения. Во избежание этого рекомендуется все компоненты перестроить с использованием новой версии системы программирования.

Опыт применения

VpPuZzle. Обзор

Создан полный набор операций для манипуляций pzl-Компонетами и pzl-Контейнерами. Первая версия приложения, которое поддерживает элементарный набор операций (Elementary Studio), позволяет использовать PZL-технологию в практическом программировании. Инструменты, которые поддерживают PZL-технологию, сами используют эту технологию и, таким образом, следуют идее приложений с открытой архитектурой.

Ссылки