22.3. Языки программирования
объектно-ориентированных баз
данных
Как отмечают многие
исследователи и разработчики,
объектно-ориентированная система
БД представляет собой объединение
системы программирования и СУБД
(альтернативная, но не более
проясняющая суть дела точка зрения
состоит в том, что
объектно-ориентированная СУБД - это
СУБД, основанная на
объектно-ориентированной модели
данных).
Мы уже говорили, что основная
практическая надобность в ООБД
связана с потребностью в некоторой
интегрированной среде построения
сложных информационных систем. В
этой среде должны отсутствовать
противоречия между структурной и
поведенческой частями проекта и
должно поддерживаться эффективное
управление сложными структурами
данных во внешней памяти. В отличие
от случая реляционных систем, где
при создании приложения приходится
одновременно использовать
ориентированный на работу со
скалярными значениями процедурный
язык программирования и
ориентированный на работу со
множествами декларативный язык
запросов (это принято называть
потерей соответствия - impedance mismatch),
языковая среда ООБД - это
объектно-ориентированная система
программирования, естественно
включающая средства работы с
долговременными объектами.
"Естественность" включения
средств работы с БД в язык
программирования означает, что
работа с долговременными
(хранимыми во внешней БД) объектами
должна происходить на основе тех же
синтаксических конструкций (и с той
же семантикой), что и работа со
временными, существующими только
во время работы программы
объектами.
Эта сторона ООБД наиболее близка
родственному направлению языков
программирования баз данных. Языки
программирования ООБД и БД во
многих своих чертах различаются
только терминологически;
существенным отличием является
лишь поддержание в языках первого
класса подхода к наследованию
классов. Кроме того, языки второго
класса, как правило, более развиты
как в отношении системы типов, так и
в отношении управляющих
конструкций.
Другим аспектом языкового
окружения ООБД является
потребность в языках запросов,
которые можно было бы использовать
в интерактивном режиме. Если доступ
к объектам внешней БД в языках
программирования ООБД носит в
основном навигационный характер,
то для языков запросов более удобен
декларативный стиль. Декларативные
языки запросов к ООБД менее
развиты, чем языки
программирования ООБД, и при их
реализации возникают существенные
проблемы. В следующем разделе мы
рассмотрим имеющиеся подходы и их
ограничения более подробно. Но
начнем с языков программирования
ООБД.
К настоящему моменту нам
неизвестен какой-либо язык
программирования ООБД, который был
бы спроектирован целиком заново,
начиная с нуля. Естественным
подходом к построению такого языка
было использование (с необходимыми
расширениями) некоторого
существующего
объектно-ориентированного языка.
Начало расцвета направления ООБД
совпало с пиком популярности языка
Smalltalk-80. Этот язык оказал большое
влияние на разработку первых
систем ООБД, и, в частности,
использовался в качестве языка
программирования. Во многом
опирается на Smalltalk и известная
коммерчески доступная система
GemStone.
Трудности с эффективной
практической реализацией языка
Smalltalk побудили разработчиков
систем ООБД к поиску
альтернативных базовых языков.
Известная близость
объектно-ориентированного и
функционального подходов к
программированию позволяет
достаточно успешно опираться на
функциональные языки
программирования. В частности, язык
Лисп (Common Lisp) является основой
проекта ORION. В этом проекте Лисп
является и инструментальным
языком, и базой
объектно-ориентированного языка
программирования в среде ORION.
Потребности в еще более
эффективной реализации заставляют
использовать в качестве основы
объектно-ориентированного языка
языки более низкого уровня.
Например, в системе VBASE наряду со
специально разработанным языком TDL,
предназначенным для определения
типов, используется
объектно-ориентированное
расширение языка Си - COP (C Object Processor).
В уже упоминавшемся проекте O2
наряду с функциональным
объектно-ориентированным языком
программирования используются два
объектно-ориентированных
расширения языков Бейсик и Си. При
этом, насколько можно судить по
публикациям, наибольшее
распространение среди
пользователей этой системы (она уже
коммерчески доступна) получил язык
CO2, являющийся расширением языка Си.
Возможно это связано лишь с широкой
(и все более возрастающей)
популярностью языка Си (и его
объектно-ориентированного потомка
Си++), ставшего поистине девизом
"настоящих программистов".
Может быть причины более глубинны
(например, языки более высокого
уровня слишком ограничительны для
программистов-профессионалов;
недаром большинство современных
реализаций языков более высокого
уровня выполняются именно на языке
Си). Тем не менее, современная
ситуация именно такова, и мы
считаем полезным привести краткое
описание основных особенностей
языка CO2.
Прежде всего, CO2 не является
полностью самостоятельным языком.
Этот язык входит в многоязыковую
среду O2 и предназначен для
программирования методов ранее
определенных классов. Определение
классов, сигнатур методов
(фактически, прототипов функций в
терминологии языка Си) и имен
постоянно хранимых значений и
объектов производится с
использованием отдельного языка
определения схемы БД.
Имя любого объекта трактуется как
указатель на значение этого
объекта; разименование
производится с помощью обычного
оператора Си '*'. Доступ к значению
объекта возможен только из метода
его класса, если только при
перечислении методов оператор '*' не
объявлен явно публичным.
Поддерживается операция
порождения нового объекта
указанного класса. В отличие от
языка Си++ в CO2 невозможно
совместить создание нового объекта
с его инициализаций (понятие
метода-конструктора начального
значения объекта в CO2 не
поддерживается). Для инициализации
необходимо либо явно обратиться к
соответствующему методу класса с
указанием вновь созданного объекта
(поддерживается соответствующий
механизм "передачи сообщений",
означающий на самом деле вызов
функции), либо воспользоваться
оператором '*' и явно присвоить
новое значение, если '*' - публичный
оператор для данного класса.
CO2 включает средства
конструирования значений-кортежей,
множеств и списков. Понятие
значения-кортежа фактически
эквивалентно понятию
значения-структуры обычного языка
Си (с тем отличием, что элементами
кортежа могут являться объекты,
множества и списки). Для
значений-множеств и списков
поддерживаются операции
добавления и изъятия элементов, а
также набор
теоретико-множественных операций
(и конкатенации для списков).
Основой манипулирования
объектами, хранимыми в БД, является
расширенное по сравнению с языком
Си средство итерации. Итератор
применим к значениям-множествам
или спискам. Фактически он означает
последовательное применение
оператора-тела цикла ко всем
элементам множества или списка.
Если мы вспомним, что долговременно
хранимому классу объектов неявно
соответствуют одноименное
значение-множество с
элементами-объектами данного
класса, то становится понятно, что
итератор языка CO2 обеспечивает
явную навигацию в классах объектов.
Единственное, что остается от
привычных пользователям СУБД
языков запросов, - это ограниченная
возможность указания
характеристик требуемых в цикле
объектов (это делается путем
использования оператора
разименования и явного указания
условий на атрибуты; конечно, для
этого нужно, чтобы оператор '*' был
объявлен публичным в данном
классе).
Разработчики O2 подчеркивают, что
они умышленно сделали CO2 более
бедным по возможностям, чем,
например, язык Си++, потому что
многое по части управления
объектами берет на себя общий
менеджер объектов системы, явно
вызываемый из рабочей программы.
Предыдущая
глава || Оглавление
|| Следующая глава
|