Представление исходных текстов программ в объектной базе данных

Д.А. Заставной

ПРЕДСТАВЛЕНИЕ ИСХОДНЫХ ТЕКСТОВ ПРОГРАММ В ОБЪЕКТНОЙ

БАЗЕ ДАННЫХ

Одной из перспективных областей технологии разработки программ являются системы трансформации программ [1]. Трансформация программ может быть обусловлена, в частности, распараллеливанием существующих последовательных программных средств. Процесс трансформации заключается в поиске фрагментов текстов, в их изменении в соответствии с целями трансформации или их замены. Данная задача является сложной и комплексной, подразумевающей выполнение содержательных модификаций исходных текстов преобразуемых программ; автоматизация процесса трансформации предполагает наличие специализированных систем поддержки.

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

В данной работе представляется способ построения репозитория на основе объектной базы данных [2] (ОБД), которая позволяет представлять информацию в виде множеств типизированных объектов и экземпляров связей между ними. Применение ОБД включает два этапа, рассматриваемые в данной работе: проектирование схемы базы данных для внутреннего представления исходных текстов заданного языка программирования и генерация этого представления по конкретным исходным текстам программ.

Схема ОБД образуется набором определений типов объектов, в каждом типе определяются атрибуты объектов и возможные связи (ассоциации) с другими объектами. Кроме того, можно задать список супертипов.

Рассмотрим методику проектирование схемы ОБД для некоторого модельного Си-образного языка. Основой данного процесса является определение типов объектов ОБД, используя грамматические правила языка программирования, которые удобно описывают основные категории синтаксических элементов языка (описаниям, операторам, выражениям и т.д.) и структурные взаимосвязи между ними (вхождение одних конструкций в другие).

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

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

<условный оператор>  “if(“ <выражение> ”)” <операторы> “else”

<операторы>

create type IF

supertypes

relationships

EXPRESSION;

STATEMENT

Cond

one

Then

Else

many ordered STATEMENT; many ordered STATEMENT

end

Значение связи Cond есть объект типа EXPRESSION, и значением этой связи может быть только один объект. Операторы, входящие в тело условного оператора, становятся значениями связей Then и Else. Поскольку входящих операторов может быть много, необходимо упорядочивание связанных объектов, что реализуется при помощи спецификатора ordered в описании связи.

Кроме того, между типами объектов могут быть объявлены иерархические ассоциации. Так, грамматическое правило

<оператор>  <присваивание> | <оператор цикла> | <условный оператор> естественным образом интерпретируется как наличие супертипа STATEMENT для типов ASSIGN, FOR и IF. Использование супертипов необходимо при декларации типов - значений связи. Например, в приведенном выше примере значениями связей Cond, Then и Else объявлены именно супертипы, что позволяет создавать экземпляры данных связей с любыми из их подтипов.

Теперь рассмотрим процесс генерации внутреннего представления исходных текстов. На этом шаге используется схема ОБД, проектирование которого описано выше, и специализированный язык манипулирования объектами [2], включающий, в том числе, команды для создания объектов и экземпляров связей между парами объектов. Фактически генерация внутреннего представления состоит в синтаксическом анализе исходных текстов и порождении последовательности команд создания объектов и связей, порождающих в ОБД структуры данных, адекватно представляющие исходные тексты.

Ниже приведен фрагмент исходного текста и порожденная последовательность команд, создающих представление исходного текста в ОБД в виде объектов соответствующих типов и экземпляров связей. int i;

if

{ i=10;

}

add VARIABLE/i(“int”);

add IF/if1;

add COND_EXPR/con1 (“<”);

link COND_EXPR/con1 to IF/if1 as Cond;

add ASSIGN/as1(“++”);

link VARIABLE/i to ASSIGN/as1 as Target;

add CONST_EXPR/ce1 (“10”);

link CONST EXPR/ce1 to ASSIGN/as1 as

Source;

link UNARY_EXPR/ue 1 to IF/if1 as Then;

Исполнение данных команд создаст в ОБД композиционную структуру, состоящую из объекта, представляющего оператор IF, и связанных с ним объектов, представляющих все вложенные объекты. Важной особенностью такого представления является то, что все связанные объекты находятся на одном уровне вложенности. Подобное представление является основной для дальнейшей эффективной обработки представления исходных текстов.

После того, как представление исходных текстов программ загружено в ОБД, с этим представлением могут выполняться различные действия, реализующие сценарии трансформации. Эти действия могут использовать возможность высокоуровневого навигационного языка запросов [2], который позволяет идентифицировать множества взаимосвязанных объектов.

ЛИТЕРАТУРА

1. Partch H., Steinbruggen R. Program transformation systems // ACM Computer Survey, 1983, v. 15, № 3, p. 199-236.

2. Zastavnoy D., Bukatov A. Representation of complex structures extracted from object databases, and access to their components. In Proc. of 4th Joint Conference on Knowledge-Based Software Engineering, IOS Press, Amsterdam, 2000, pp. 93-100.

В.В. Сарычев

ОБ АВТОМАТИЗАЦИИ ИЗМЕНЕНИЯ ЗАПИСЕЙ БЕЗФОРМАТНЫМИ

ДАННЫМИ

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

Можно выделить два основных принципа эксплуатации баз данных. Первый, когда источник актуализации один, и второй - когда источников много. Для первого принципа автоматизация изменения записей возможна за счет централизованного форматирования данных. Для второго принципа процесс унификации сопряжен с трудностями, вызванными разобщенностью поставщиков данных. Примером подобных информационных потоков может служить работа редакций СМИ. Г азету еще можно представить как условно форматированными сведениями, в отличие от поступающих сообщений от корреспондентов, информационных агентств, людей. В этом случае автоматизацию, на наш взгляд, следует проводить в два этапа. На первом этапе в качестве минимальной структурной единицы новых данных выбирается файл. В файле содержится сообщение от какого-либо источника об изменении полей одной или нескольких записей. Программная часть СУБД периодически проверяет в фоновом режиме вновь поступившие файлы на наличие в них ключевых слов по всем записям. При этом в «мемо» поле отобранных записей добавляются соответствующие имена файлов. Такой подход не требует проведения сложной процедуры нормализации при обновлении дан-