VpPuZzle. Обзор. Ч.2: различия между версиями

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

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


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


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

Версия 08:18, 11 октября 2007

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::tryGetObject:(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-технологию, сами используют эту технологию и, таким образом, следуют идее приложений с открытой архитектурой.