VpPuZzle. Обзор. Ч.2: различия между версиями
(Новая: ==Pzl-система== Все свойства pzl-механизма обеспечиваются набором средств, объединенных названием pzl-Сис...) |
(нет различий)
|
Версия 13:09, 24 сентября 2007
Pzl-система
Все свойства pzl-механизма обеспечиваются набором средств, объединенных названием pzl-Система (PzlSystem). Pzl-система содержит ряд классов, представленных исходными кодами, и ряд классов, представленных в виде статических библиотек (LIB). При этом статические библиотеки написаны с на языке Visual Prolog системы VIP.
На следующей картинке показана структура pzl-системы для pzl-контейнера, генерирующего DLL.
а следующая картинка - структуру, соответствующую главному (EXE) приложению
Как видно, эти проекты содержат разные статические библиотеки, а в случае главного (EXE) приложения дополнительно добавлен пакет pzlPort. Необходимости в запоминании всех этих файлов нет, поскольку средства pzl-технологии генерируют все необходимые файлы автоматически.
Пакет PzlPort является составной частью основного исполняемого приложения, использующего pzl-технологию и является ядром pzl-технологии. PzlPort отвечает за загрузку и выгрузку DLL. Когда пользователь вызывает конструктор pzl-компоненты, PzlPort находит DLL, которая содержит соответствующую pzl-компоненту. Если эта DLL не загружена, то она загружается и затем PzlPort взаимодействует с классами pzl-контейнера.
Для того, чтобы знать, где на данном компьютере размещается та или иная pzl-компонента, используется механизм регистрации компонент. Информация о регистрации компонент может быть сохранена либо в файле, который находится в распоряжении и под управлением пользователя, либо эта информация может быть сохранена в реестре Windows. Одна и та же компонента может быть зарегистрирована в нескольких местах. PzlPort производит поиск компоненты в следующем порядке:
- В регистрационном файле пользователя
- В разделе Current User реестра Windows
- В разделе Local Machine реестра Windows
Средстав pzl-технологии могут зарегистрировать или снять с регистрации pzl-компоненты в любом из заданных мест раздельно или совместно в составе группы.
Pzl-технология не нарушает принципы поддержания жизненного цикла экземпляров классов. Когда необходимость в экземпляре отпадает, все ссылки на него должны быть удалены. PzlPort отвечает за выгрузку соответсвующей DLL, когда она не содержит pzl-компонент, находящихся в данный момент в использовании. Это происходит, когда сборщик мусора системы Visual Prolog удаляет экземпляр класса.
Таким образом, пользователь не имеет дела с DLL непосредственно и имеет дело только с классами таким же точно образом, как и при обычном программировании в стиле VIP.
Совместимость и авторизация
Особенностью использования DLL, построенных на базе VIP (VipDLL), является то, что как главное приложение, построенное с помощью VIP, так и VipDLL используют одни и те же библиотеки периода исполнения (runtime libraries), которые напрямую зависят от версии VIP, как продукта. Если VipDLL была построена для использования с одной версией библиотек, а главное приложение использует другую версию библиотек, то может возникнуть проблема несовместимости. Механизмы pzl-технологии предусматривают контроль совместимости версий так, что PzlPort проверяет возможность работы с каждой Vip7DLL перед началом взаимодействия с ней. Если обнаружена возможность несовместимости, то Vip7Dll выгружается и генерируется исключительная ситуацият (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 могут вести к нестабильности приложения. Во избежание этого рекомендуется все компоненты перестроить с использованием новой версии системы программирования.
Опыт применения
Создан полный набор операций для манипуляций pzl-Компонетами и pzl-Контейнерами. Первая версия приложения, которое поддерживает элементарный набор операций (Elementary Studio), позволяет использовать PZL-технологию в практическом программировании. Инструменты, которые поддерживают PZL-технологию, сами используют эту технологию и, таким образом, следуют идее приложений с открытой архитектурой.