А.А. Орехов
"Банковские информационные системы" (+7 095)369-97-24, nd@bis.msk.su
- 1.1. Сервер PROGRESS и его переносимость
- 1.2. Переносимость "клиента"
- 1.3. Независимость от коммуникационной среды
- 3. Интеграция PROGRESS с продуктами других фирм
- 3.1. Архитектура PROGRESS DataServer
- 3.2. Интеграция с другими приложениями и средами
Материал этой статьи базируется на достаточно большом личном опыте работы автора с PROGRESS - наше первое знакомство состоялось еще в 1991 году, а также на тесных деловых отношениях с фирмой PROGRESS SOFTWARE - в начале 1993 года наша фирма стала одним из первых дилеров PROGRESS SOFTWARE в СНГ. Подробное освещение средств разработки и сервера БД PROGRESS может и должно явиться предметом отдельных статей, а сейчас мне хотелось бы остановиться на том, как в продуктах фирмы PROGRESS SOFTWARE реализуются принципы открытых систем.
1. Многоплатформность PROGRESS
Одно из важнейших требований к открытой системе - ее переносимость на различные программно-аппаратные платформы. Так как PROGRESS построен на архитектуре "клиент/сервер", имеет смысл осветить аспекты переносимости клиента и сервера.
1.1. Сервер PROGRESS и его переносимость
Сервер БД PROGRESS может функционировать на множестве платформ - практически всех коммерческих реализациях UNIX, VMS, DOS, Windows, Windows NT, NetWare, OS/2, AS/400 и др. Конкретная реализация сервера для разных платформ может быть самой различной - в средах UNIX и VMS это несколько параллельных процессов, использующих разделяемую память (shared memory) для связи между собой, для DOS/Windows/Novell - это один исполняемый модуль (exe или nlm), обрабатывающий запросы клиентов по очереди, на AS/400 используется встроенная в нее СУБД DB2/400 и т.п. В любом случае детали устройства сервера скрыты от клиента за единообразным интерфейсом, и приложения работают с разными серверами совершенно прозрачно, так что серверы на различных платформах отличаются друг от друга лишь производительностью и пределами масштабируемости. На всех перечисленных платформах в полной мере поддерживаются критичные для профессиональной СУБД механизмы блокировки на уровне записей, обработки транзакций и защиты целостности данных.
1.2. Переносимость "клиента"
Средства разработки и исполнения приложений PROGRESS (т.е. "клиент") реализованы для всех платформ, для которых реализован сервер, за исключением, по понятным причинам, только Novell NetWare. Одной из ключевых возможностей PROGRESS является разделение выбора решений для сред разработки приложений и их выполнения. Пользователи могут выбрать среду разработки вне зависимости от платформы, на которой будут выполняться приложения. Если приводить конкретные примеры, то перенос банковской системы БИСквит, разработанной в среде DOS, на платформу UnixWare занял около недели. После системы устанавливали на HP 9000, NCR 3000, Sun, Motorola 88K за несколько часов.
Основное средство разработки - язык четвертого поколения PROGRESS 4GL. Опытные разработчики отмечают способность языка PROGRESS поддерживать разработку ключевых приложений масштаба предприятия без необходимости использования языка более низкого уровня (Си, Паскаль, Кобол и др.)
Язык PROGRESS 4GL является языком процедурного типа, ориентированным на работу с реляционными базами данных. Одной из характерных особенностей языка является его тесная связь со словарем данных PROGRESS и автоматическое наследование атрибутов объектов БД, описанных в словаре данных - форматов, меток, подсказок, способов визуализации и доменов для полей, триггеров для полей и таблиц и т.д.
Язык обладает важным преимуществом - обилием разумных действий, предпринимаемых компилятором по умолчанию - в частности, задание диапазонов транзакций, уровней блокировок записей, автоматическая обработка разнообразных ошибок и нажатия клавиши "ОТМЕНА" (Escape).
Конструкции для навигации связанных данных обеспечивают навигационный доступ к БД, а для работы с множествами записей язык PROGRESS включает в себя полный SQL, сертифицированный на соответствие стандарту ANSI SQL 1989 Level 2.
Язык поддерживает концепции "событий" и "триггеров", что позволяет создавать настоящие "событийно-ориентированные" (event-driven) приложения, где поток управления определяется самим пользователем. Не являясь "каноническим" объектно-ориентированным языком, PROGRESS V7 тем не менее позволяет пользоваться практически всеми реальными преимуществами объектно-ориентированного программирования.
В контексте переносимости важно также отметить, что PROGRESS предлагает единый язык для программирования приложений как в текстовых (DOS, ASCII терминалы), так и в графических (Windows, Motif) средах. Почти все возможности графического интерфейса переносимы на обычные текстовые терминалы, за исключением изображений и многооконности. Также, все программы, написанные для текстовых терминалов, могут быть перенесены в графические среды. Конечно, наивно думать, что программа, написанная десять лет назад для терминала VT52, будет эффективно работать и органично выглядеть сегодня в среде Windows после простой перекомпиляции. Но по крайней мере разработчику не нужно будет переписывать все свои программы заново, он может постепенно дорабатывать интерфейсную часть приложения, сохранив при этом большую часть исходных текстов без изменений.
В отличие от некоторых многоплатформных сред разработки (Uniface, Magic, PRO-IV и др.), которые предлагают пользователю свою концепцию пользовательского интерфейса во всех поддерживаемых средах, PROGRESS-приложения в средах Windows и Motif полностью соответствуют сформировавшимся стандартам пользовательского интерфейса для этих сред, что позволяет любому пользователю, знакомому со средой, легко освоить PROGRESS-приложение для этой среды. Для текстовых сред типа DOS или UNIX с простыми терминалами трудно говорить о каких бы то ни было "стандартах" интерфейса, но язык PROGRESS достаточно гибок, чтобы удовлетворить практически любые требования.
Наряду с языком PROGRESS предлагает и современные средства визуального программирования, такие как User Interface Builder (UIB). Построение приложений осуществляется путем выбора стандартных компонентов и шаблонов из библиотек, предоставляемых PROGRESS, и размещения их в рабочем поле UIB. Эти компоненты представляют собой не просто экранные примитивы, но и наборы триггеров (методов), связанных с ними, что позволяет строить не просто красивые интерфейсы, а полнофункциональные приложения.
Отличительной особенностью UIB является то, что сам он полностью написан на языке PROGRESS 4GL, что, на мой взгляд, характеризует возможности языка лучше всяких слов, а также то, что он в результате своей работы генерирует код на PROGRESS 4GL, что гарантирует переносимость разрабатываемых приложений. Это позволяет, например, использовать UIB в среде Windows для разработки текстового приложения, ориентированного на эксплуатацию в среде UNIX, с возможностью запуска разрабатываемого приложения в DOS-окне и пошаговой его отладки с помощью графического отладчика PROGRESS.
1.3. Независимость от коммуникационной среды
Для связи между клиентом и сервером может использоваться любой из списка транспортных протоколов, поддерживаемых PROGRESS: TCP/IP, SPX, NetBIOS, DecNET, SNA и др. Все протоколы совершенно прозрачны для приложений. Клиент и сервер могут исполняться и на одной машине, тогда они общаются между собой через разделяемую память (UNIX, VMS) или вообще реализованы в виде одного исполняемого модуля (DOS/Windows Single User). Интересно, что однопользовательский продукт для Windows позволяет одновременно запустить локальный сервер и несколько клиентов в отдельных окнах, что дает возможность эмулировать многопользовательский режим на автономной персональной ЭВМ при отладке.
Клиент PROGRESS может работать с несколькими серверами одновременно (до 240), что способствует созданию распределенных баз данных. При выполнении транзакций в распределенной БД поддерживается механизм двухфазной фиксации, гарантирующий целостность распределенных данных.
2. Масштабируемость сервера PROGRESS
PROGRESS позволяет весьма эффективно использовать вычислительные ресурсы ЭВМ, на которой он работает, и предоставляет ряд возможностей для тонкой настройки параметров сервера, включая асинхронные процессы записи буферов, возможность работы с многотомными БД, распределенными по нескольким физическим дискам и др. Однако иногда наступает момент, когда все возможности оптимизации исчерпаны и становится ясно, что ЭВМ сервера БД не в состоянии обеспечить требуемую производительность. В этом случае можно воспользоваться масштабируемостью сервера PROGRESS, либо безболезненно заменить ЭВМ сервера на более мощную, например, многопроцессорной архитектуры (SMP) вплоть до суперсервера CRAY (вертикальная масштабируемость), либо разбить большую БД на несколько меньших и разместить их на отдельных серверах, создав распределенную БД (горизонтальная масштабируемость).
Наряду с масштабируемостью "вверх" очень важной является масштабируемость "вниз", т.е. способность СУБД довольствоваться скромными вычислительными ресурсами там, где нагрузки невелики. Нам, разработчикам банковских систем, пришлось столкнуться с тем, что даже у самых больших банков есть очень маленькие филиалы, установка в которых мощных вычислительных систем экономически не оправдана. PROGRESS позволяет использовать для исполнения приложений под управлением DOS клиентские машины с процессором 286 и памятью 1-2МБ.
3. Интеграция PROGRESS с продуктами других фирм
Итак, комбинация СУБД и средств разработки PROGRESS предоставляет разработчику возможности разработки и исполнения приложений на самых разнообразных платформах, не прибегая к использованию продуктов третьих фирм. Тем не менее в ряде случаев может представлять интерес возможность доступа приложений PROGRESS к серверам БД других производителей, например для:
- интеграции данных из разнородных источников, в основном в системах поддержки принятия решений;
- доступа современных приложений к данным, "оставшимся в наследство" (legacy data);
- разработки коммерческих приложений, не привязанных к конкретной СУБД.
В соответствии с принципами открытости PROGRESS предоставляет возможности исполнения приложений PROGRESS совместно с серверами БД других производителей, а также доступа приложений, написанных не на PROGRESS, к своей БД.
3.1. Архитектура PROGRESS DataServer
Благодаря архитектуре "сервера данных" (DataServer) PROGRESS, приложения, написанные на PROGRESS, могут работать с поддерживаемыми базами данных без изменений. В этот список СУБД входят: Oracle, Sybase, Rdb, RMS, C-ISAM, DB2/400, все СУБД, использующие стандарт ODBC и др. PROGRESS добивается одинаковой функциональности на всех поддерживаемых СУБД вне зависимости от способности СУБД поддерживать необходимые функции. DataServer позволяет PROGRESS запускать одну и ту же программу, написанную на 4GL, совместно с любой поддерживаемой СУБД без необходимости учитывать конкретный диалект SQL или язык доступа к данным. PROGRESS берет на себя труд распознавания диалекта SQL, делая управление данными прозрачным для приложения. Таким образом, все СУБД ведут себя одинаково по отношению к приложению.
Основными составляющими архитектуры DataServer являются: DataServer BackPlane, Data Dictionary и собственно DataServer.
- DataServer BackPlane - единый интерфейс для приложения и точка объединения данных, извлекаемых из разных БД. Этот интерфейс не только поддерживает различные API, но и обеспечивает функционирование гетерогенных распределенных БД для распределенных соединений (joins) и двухфазных транзакций (где это возможно). Его основная цель - обеспечение открытой среды программирования в режиме клиент/сервер. Эта архитектура похожа на подход Sybase в Open Client Release 10 и OmniSQL gateway и отличается от подходов, принятых Borland в IDAPI и Oracle в Oracle Glue [1].
- Data Dictionary представляет собой БД PROGRESS, которая выполняет функции "хранителя схемы" (schema holder) чужой БД и содержит расширенное описание ее данных в формате PROGRESS, обеспечивая прозрачность данных для приложения. Все приложения PROGRESS компилируются вместе с хранителем схемы, хотя при выполнении осуществляется доступ к данным чужой БД через соответствующий DataServer.
- PROGRESS DataServer - программный продукт, поддерживающий определенную СУБД, переводя команды доступа к данным из формата PROGRESS в соответствующие команды языка СУБД или специальные вызовы. Ключевым аспектом в DataServer является использование "родных" для СУБД низкоуровневых вызовов. Например, PROGRESS использует Open Client API для Sybase и Oracle Call Interface (OCI) для Oracle. Это необходимо для обеспечения хорошей производительности по отношению к любой СУБД в соответствии с требованиями современных приложений. При реализации схем клиент/сервер пользователь может использовать как сетевое обеспечение поставщика СУБД (например SQL*Net для Oracle), так и входящее в комплект поставки PROGRESS.
Современные исследования ([2]) показывают, что одним из камней преткновения при разработке приложений, переносимых между БД, может явиться использование триггеров и хранимых процедур СУБД, для программирования которых разные СУБД используют разные средства, а некоторые СУБД их вообще не поддерживают. PROGRESS предлагает оригинальный подход к решению этой проблемы, позволяя описывать триггеры БД в Data Dictionary, программировать их на языке PROGRESS и исполнять на машине клиента. Таким образом, приложение PROGRESS может иметь один набор триггеров и единообразно исполняться независимо от применяемой СУБД, даже если эта СУБД вообще не поддерживает триггеров.
3.2. Интеграция с другими приложениями и средами
PROGRESS предоставляет также ряд интерфейсов, которые позволяют приложениям PROGRESS обмениваться информацией с другими приложениями и операционной системой. Одни интерфейсы позволяют объединять приложения PROGRESS c другими программными продуктами в единую интегрированную среду. Другие - позволяют обращаться непосредственно к системным библиотекам, например при написании интерфейсов для внешних устройств. Третьи обеспечивают доступ приложений, написанных не на PROGRESS, к СУБД PROGRESS. В настоящее время PROGRESS поддерживает следующие интерфейсы:
- Dynamic Data Exchange (DDE) является стандартным интерфейсом для MS-Windows. Приложения Windows используют DDE для динамического обмена данными между собой. Обычно DDE-интерфейс используется для обмена данными между пользовательскими задачами (электронные таблицы, базы данных, редакторы, графические пакеты). DDE-интерфейс поддерживается языковыми средствами PROGRESS 4GL.
- Dynamic Link Libraries (DLL) представляют собою библиотеки вызываемых функций, обращение к которым возможно из различных приложений. PROGRESS-приложения могут непосредственно вызывать любые функции DLL. Это позволяет приложениям PROGRESS функционировать совместно с многочисленными приложениями под MS-Windows.
- Конвейеры (pipes). Pipes - механизм взаимодействия различных задач в многопользовательских системах, таких как UNIX. Приложения PROGRESS могут обмениваться информацией с другими приложениями UNIX с использованием данного механизма.
- Вызовы других языков - Host Language Calls. HLC-интерфейс позволяют разработчикам обращаться к функциям на языке Си из приложений PROGRESS. HLC часто используется для сложных математических расчетов, при вводе информации с нестандартных устройств ввода (считыватели магнитных карт, штриховых кодов и др.).
- Встроенный SQL для Си. PROGRESS ESQL/C позволяет разработчикам прикладных программ использовать SQL-запросы к базе данных PROGRESS из программ на языке Си. Поддерживаются статические и динамические запросы в стандарте ANSI SQL89 Level 2.
- Open Data Base Connectivity - ODBC. Унифицированный интерфейс доступа к разнородным базам данных, разработанный фирмой Microsoft для среды Windows. ODBC-драйвер PROGRESS позволяет любому Windows-приложению, совместимому со стандартом ODBC (Word, Excel, Access и многие другие), осуществлять доступ к БД PROGRESS как на локальной машине, так и по сети.
- Помимо ODBC-драйвера, PROGRESS включает и ODBC DataServer, который позволяет приложениям на PROGRESS 4GL работать с любым ODBC-совместимым источником данных (ODBC data source) - будь то файлы dBASE или сервер INFORMIX On-Line.
Ведется разработка поддержки для Integrated Database Application Programming Interface (IDAPI), Novell AppWare и др.
4. Интернационализация PROGRESS
Возможности создания гетерогенных информационных систем, объединяющих разнообразные операционные среды, нельзя считать полностью реализованными, если не обеспечена гибкая работа с символьными кодировками. Как известно, в различных операционных средах традиционно используются различные способы кодирования символов кириллицы, несовместимые между собой: так, в DOS это кодировка 866 (также известная как альтернативная), в Windows - 1251, а в UNIX могут использоваться и КОИ-8, и ISO 8859-5 и та же 866.
Работа PROGRESS с кодировками строится следующим образом: существует файл кодировок, содержащий таблицы сортировки, преобразования регистров, атрибутов (буква, цифра и т.д.) и преобразования между кодировками для нескольких десятков используемых в мире кодировок, включая четыре упомянутых для русского языка, а также двухбайтовые кодировки восточных иероглифических алфавитов. Если вы используете кодировку, не включенную в стандартный список (например, БЕСТА), то легко можете сами добавить к файлу кодировок необходимые таблицы и перекомпилировать его.
При создании базы данных таблицы сортировки, соответствующие указанной кодировке, загружаются прямо в нее. Сервер работает в кодировке, указанной в базе данных, которую он обслуживает. Кодировки для клиента (отдельно для дисплея, принтера, файлов данных, файлов процедур) задаются параметрами при его запуске. Клиент автоматически преобразует символьные данные, получаемые от серверов, в так называемую "внутреннюю" кодировку и наоборот. Язык также предоставляет средства работы с кодировками - можно указать кодировку при открытии конкретного текстового файла/устройства ОС, а также преобразовать строку символов из одной кодировки в другую.
Таким образом, с базой данных, расположенной на UNIX-машине и использующей кодировку КОИ-8, могут одновременно работать и терминалы в кодировке ISO 8859-5, и удаленные DOS- и Windows-клиенты в своих родных кодировках. Справедливо и обратное: любой клиент может без проблем интегрировать данные из нескольких разнородных баз с разными кодировками.
Все системные сообщения PROGRESS вынесены в отдельный файл, и в комплект поставки PROGRESS входят несколько десятков версий этого файла, переведенных на разные языки, включая и русский. Использование того или иного файла сообщений задается переменной среды, таким образом каждый пользователь системы может выбрать себе язык системных сообщений независимо от других пользователей.
PROGRESS идет еще дальше, предоставляя разработчикам средство Translation Manager, позволяющее максимально автоматизировать процесс ручного перевода пользовательского интерфейса готового приложения на различные языки, а также создавать приложения, способные общаться с пользователями на нескольких языках одновременно. Разработчик создает пользовательский интерфейс приложения на своем родном языке, не задумываясь о проблемах его интернационализации. Затем за дело берется профессиональный переводчик, который с помощью Translation Manager переводит все метки, подсказки, сообщения об ошибках, другими словами - все литералы в приложении на другой язык. Переведенные литералы сохраняются в отдельном сегменте объектного кода, соответствующем выбранному языку. Таких сегментов может быть сколько угодно, и при исполнении приложения каждый пользователь может выбрать язык интерфейса по своему вкусу.
5. Заключение
Хотя изложенное ни в коей мере не претендует на полное описание всех возможностей PROGRESS, я надеюсь, что статья поможет читателям составить первое впечатление о продуктах фирмы PROGRESS SOFTWARE в контексте открытых систем. Буду рад предоставить всем желающим более подробную информацию, а имеющим доступ к
WWW рекомендую заглянуть на http://www.demos.su/firms/bis/progress.html, откуда можно начать поход по посвященным PROGRESS начальным страничкам в США, Австралии и ЮАР.
Литература:
- Judith R.Davis "Progress Software"s Version 7", Open Information Systems Vol.8, No. 10 (C) 1993 Patricia Seybold Group
- "Force-Fitting Little Client/Server: Two Case Studies", Application Development and Reengineering (C) 1994 IDC/Technology Investment Strategies