МОДЕЛЬ ОНТОЛОГИИ ПРОЕКЦИЙ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ НА ЕДИНОЕ ПРЕДСТАВЛЕНИЕ ПРОГРАММ М.А. Князева, В.А. Тимченко Введение Традиционно анализ, распараллеливание и оптимизация программ выполняются над программами, представленными не на языках программирования высокого уровня непосредственно, а при помощи различных схем и моделей, являющихся пригодным и удобным представлением для работы с исходными программами (например, схемы Мартынюка, схемы Лаврова, представления программ в виде различных графов). Поэтому системы, предназначенные для оптимизации и распараллеливания программ, а в особенности те, которые работают с несколькими языками исходных текстов программ, имеют свое единое внутреннее представление, в которое может быть преобразована анализируемая программа и которое затем используется для последующей ее обработки. Внутренние представления в системах оптимизации и распараллеливания программ, как правило, реализуются в виде таких структур, как списки, деревья, графы. В некоторых системах, таких, например, как Polaris, SUIF/SUIF2, Открытая распараллеливающая система (ОРС) внутреннее представление программ реализовано в виде иерархии классов на объектно-ориентированном языке. Внутреннее представление программ в ОРС представляет собой универсальную структуру данных для хранения информации о программе, а также базис для построения и анализа информационных зависимостей в программе, написания преобразований программ и алгоритмы, облегчающие их выполнение. Система предполагает открытость к возможным изменениям в языке исходных текстов за счет дописывания или замены относительно небольших программ. Многие системы для построения внутреннего представления программ, в том числе и ОРС, SUIF/SUIF2, используют внешние программы или библиотеки с готовыми грамматиками языков, что ставит их в зависимость от сторонних разработчиков. Кроме того, хотя и наблюдается тенденция к улучшению таких характеристик СПТ, как удобство и простота интерфейса транслятора, позволяющая его интегрировать в программное средство; удобство описания грамматики языка программирования; читаемость сгенерированного кода, тем не менее, при их использовании возникают определенные сложности. Так, например, при описании собственных грамматик такие инструментальные средства накладывают ограничения на их класс и форму задания, которые диктуются используемым методом разбора. Кроме того, приходится проводить немалый объем работ по интегрированию представления программ, получаемых компиляторами переднего плана, основанными на таких инструментальных средствах и собственными внутренними представлениями. Таким образом, во многих системах возможности расширения на предмет добавления поддержки синтаксического новых анализатора языков (SUIF/SUIF2, ограничены Cetus), отсутствием что приводит собственного к тому, что сгенерированный в результате работы внешней СПТ транслятор или набор классов для его реализации зачастую трудно отлаживать, модифицировать и интегрировать в систему; или же ориентированностью их внутреннего представления программ на конкретный язык (Polaris, Parafrase). В структурно-предикативной системы СПОРК [1] применен основанный на реализации структурных предикативных грамматик и средств работы со структурным графом, который является здесь результатом синтаксического и контекстного анализа программы с помощью структурно-предикативной грамматики (СП-грамматики). СПграмматика относится к классу логических грамматик, в которых описание правил ведется на языке первого порядка в терминах термов и логических формул. Оперирование таким языком весьма затруднительно для пользователей этой системы, не являющихся специалистами в области математической логики. В отделе интеллектуальных систем ИАПУ ДВО РАН разрабатывается система преобразований программ (СПП), предназначенная для проведения исследований в области преобразований программ. Одним из требований, предъявляемых к данной системе, является поддержка расширяемого набора языков программирования исходных текстов программ, которые затем должны переводиться в единое промежуточное представление. Исходя из данного требования, в рамках решения проблемы обеспечения многоязыковости в системе преобразований программ, управляемой знаниями, была предложена концепция подсистемы генерации единого внутреннего представления программ. Предлагаемый подход позволяет преодолеть упомянутые выше недостатки и ограничения, присутствующие в существующих системах оптимизации и распараллеливания программ. Проектирование многоязыковой системы, допускающей подключение новых входных языков, требует особенно гибких способов формализации информации о них. Так, для достижения данной цели было принято решение использовать проекционный подход. Проекционный подход к трансляции начал разрабатываться еще в начале 70-х гг. XX века в НИВЦ МГУ. Основные концепции данного подхода и выразительные средства для адекватного описания проекций были проработаны В.Ш. Кауфманом [2]. Практическая ценность проекционного подхода как технологии создания трансляторов состоит, в частности, в разработке автоматизированной СПТ, которая должна решать проблему, как по формально заданной проекции (спецификации на транслятор) построить реализующий эту проекцию транслятор. Транслятор реализует проекцию, если для каждого текста на входном языке выдает в качестве результата образ этого текста в соответствии с проекцией. Это так называемая проблема разрешимости проекции. В рамках предложенного Кауфманом подхода она окончательно не была решена. В настоящей работе предложен способ описания языковых проекций, ориентированный с одной стороны на доступность его освоения и применения специалистами, не обладающими высокой математической подготовкой, а с другой стороны на реализуемость описанных проекций, т.е. принципиальную возможность построения интерпретатора, который на основе описания проекции конкретного языка программирования на единое внутреннее представление и программы на этом языке программирования генерировал бы эту программу в едином промежуточном представлении. Таким образом, все описываемые проекций являются заведомо разрешимыми в силу способа их описания. Работа выполнена при финансовой поддержке ДВО РАН, инициативный научный проект “Интернет-система управления информацией о преобразованиях программ” (06III-A-01-007) и при финансовой поддержке РФФИ, проект “Исследование возможностей коллективного управления в семантическом вебе информационными ресурсами различных уровней общности” (06-07-89071-a). Подход к описанию языковых проекций Идея подхода состоит в том, чтобы, во-первых, разработать и описать модель онтологии языка программирования, для которого пишется его проекция на единое внутреннее представление. Онтология языка программирования представляет собой совокупность информации, описывающую множество понятий данного языка, а также взаимосвязь между этими понятиями, т.е. способ их объединения в языковые конструкции. Можно сказать, что онтология языка определяет абстрактный синтаксис этого языка. Модель онтологии языка представлена семантической сетью понятий, связанных между собой направленными дугами и снабженной специальной разметкой. Во-вторых, описать связь онтологии языка с конкретным синтаксисом этого языка, которая определяет содержание правильных конструкций языка с точки зрения синтаксиса этого языка. Связь онтологии языка с его конкретным синтаксисом содержит такие элементы языка, как пунктуационное наполнение, определяет порядок следования лексем и т.д. Данный вид информации ограничивает способ выражения в виде текста того смысла, который содержится в абстрактном представлении программы. Эти модели необходимы для осуществления процедуры синтаксического анализа текстов программ и формирования представления этих программ в абстрактном синтаксисе. Программа в абстрактном синтаксисе это программа, представленная в терминах онтологии языка программирования, не содержащая элементов конкретного синтаксиса. И, наконец, разработать и описать модель онтологии проекций языков программирования на единое представление, в соответствии с которой описывается каждая конкретная проекция. Такая формализация позволила разработать концепцию подсистемы генерации единого внутреннего представления программ, состоящую из гибко настраиваемых на соответствующую модель онтологии программных компонент, а также управляемых соответствующими моделями онтологий, в которые также при необходимости могут вноситься изменения. Модель онтологии проекций языков программирования на единое представление Под проекцией будем понимать отображение следующего вида: P: C → E, где C = {concepts} – множество понятий языка программирования, в терминах которого представляется программа; E = {elements} – множество элементов языка единого представления. Ниже представлен фрагмент модели онтологии проекций языков программирования на единое представление. Данная модель представляет собой спецификацию абстрактного синтаксиса языка описания проекций. При описании использованы следующие обозначения языка спецификаций, который приведен в работе [3]. Язык описания проекций = (сер язык программирования : Описание проекции) Описание: Язык описания проекций задает правила описания проекции заданного языка программирования на единое представление программ. Описание проекции = (сер соответствие : Описание соответствия) Описание: Описание проекции определяет множество соответствий понятий заданного языка программирования конструкциям языка единого представления программ. Описание соответствия = (понятие языка программирования : СТРОК, конструкция языка единого представления : Элементы языка единого представления) Описание: В соответствии описывается структура конструкции языка единого представления, которая должна быть сопоставлена понятию исходного языка программирования, т.е. структурированный понятию определенным языка образом программирования набор элементов соответствует языка единого представления. Семантика: Для заданного понятия языка программирования интерпретировать описание структуры конструкции языка единого представления, представленное в данном соответствии. Элементы языка единого представления = ([фрагменты : Набор фрагментов], [дуги управления : Набор дуг управления], [атрибуты : Набор атрибутов]) Описание: Конструкция языка единого представления состоит из, возможно пустых, наборов фрагментов, дуг управления и атрибутов. Семантика: Создать конструкцию языка единого представления заданной структуры. Набор фрагментов = (сер фрагмент : Класс фрагмента) Класс фрагмента = объед (Выражение, Программный_блок, Условный_оператор, Цикл_с_шагом, Цикл_с_предусловием, Вызов_процедуры, Описание_одной_пременной, Описание_одной_функции, Присваивание, Ввод, Вывод, Блок_описаний_переменных, Блок_описаний_функций, Имя другого класса фрагмента) Имя другого класса фрагмента = (имя : СТРОК) Описание: Набор фрагментов определяет множество имен классов фрагментов, представленых компонентой Класс фрагмента. Семантика: Последовательно создать фрагменты, множество имен которых определяет компонента Набор фрагментов. Набор дуг управления = (сер дуга управления : Дуга управления) Описание: Набор дуг управления представляет собой множество дуг управления. Дуга управления = (имя дуги : объед (Если, То, Иначе, Условие_цикла, Начальная_граница_цикла, Конечная_раница_цикла, Шаг, Тело, Описание_параметров, Описание_переменных, Описание_функций, Выражение_справа, Выражение_слева, Другое имя дуги управления), фрагмент-начало дуги : объед (Программный_блок, Условный_оператор, Цикл_с_шагом, Цикл_с_предусловием, Вызов_процедуры, Присваивание, Ввод, Вывод, Описание_одной_функции, Блок_описаний_переменных, Блок_описаний_функций, Имя другого класса фрагмента), фрагмент-конец дуги : объед (Выражение, Программный_блок, Условный_оператор, Цикл_с_шагом, Цикл_с_предусловием, Вызов_процедуры, Присваивание, Ввод, Вывод, Описание_одной_пременной, Описание_одной_функции, Блок_описаний_функций, Имя другого класса фрагмента) ) Блок_описаний_переменных, Другое имя дуги управления = (имя : СТРОК) Описание: Дуга управления представляет собой направленную дугу, которая характеризуется своим именем и соединяет два фрагмента. Началом дуги является фрагмент, определяемый селектором “фрагмент-начало дуги”, концом дуги – фрагмент, определяемый селектором “фрагмент-конец дуги”. Семантика: Создать дугу управления с именем, определяемым селектором имя дуги, назначить фрагмент, определяемый селектором фрагмент-начало дуги, начальным фрагментом дуги управления, а фрагмент, определяемый селектором фрагмент-конец дуги – конечным фрагментом дуги управления. Если фрагмент, определяемый селектором фрагмент-конец дуги, при интерпретации описания соответствия для текущего понятия еще не существует (не создан), это означает, что он будет создан в результате интерпретации описания соответствия для понятия, встреченного позже, и назначен конечным фрагментом данной дуги управления. Набор атрибутов = (сер атрибут : Атрибут) Описание: Набор атрибутов представляет собой множество атрибутов. Атрибут = (имя атрибута : объед (Идентификатор, Счетчик_цикла, Тип_левой_части, Левая_часть_выражения, Тип_правой_части, Правая_часть_выражения, Символ_операции, Передача_по_значению, Является_массивом, Является_указателем, Переменная_результат_функции, Оригинальное_строковое_имя, Тип, Нижняя_граница_массива, Верхняя_граница_массива, Другое имя атрибута), аргумент атрибута : объед (Выражение, Программный_блок, Условный_оператор, Цикл_с_шагом, Цикл_с_предусловием, Вызов_процедуры, Присваивание, Ввод, Вывод, Описание_одной_пременной, Описание_одной_функции, Имя другого класса фрагмента), вычислимый : ЛОГ, [ значение атрибута : Значение ] ) Другое имя атрибута = (имя : СТРОК) Значение = объед (СТРОК, ЦЕЛ, ВЕЩ, ЛОГ, Класс фрагмента) Описание: Атрибут характеризуется своим именем, аргументом, на котором он определен, и значением, которое он может принимать. Кроме того, атрибут может быть вычислимым и невычислимым. Значение признака “вычислимый” указывает либо на необходимость вычислить значение данного атрибута на этапе сканирования программы на языке программирования, либо на ее отсутствие, т.е. атрибут примет значение, заданное непосредственно на этапе описания проекции. При необходимости вычислить значение атрибута предполагается, что такая информация всегда доступна в результате лексико-синтаксического анализа исходной программы (без обращения, например, к каким-либо методам потокового анализа программ). Семантика: Создать атрибут с именем, определяемым селектором имя атрибута, аргумент которого определяется селектором аргумент атрибута, а в качестве значения присвоить ему компоненту Значение, определяемую селектором значение атрибута. Если у данного атрибута значение, определяемое селектором вычислимый – истина, то значение, определяемое селектором значение атрибута, должно быть вычислено на этапе сканирования программы на языке программирования, и на этапе описания проекции его задавать не нужно. На рис.1 и рис. 2 приведены примеры описания соответствий между понятиями языка программирования Паскаль “Оператор присваивания”, “Имя переменной” и соответствующими им конструкциями языка единого представления. Данные описания представляют собой фрагмент описания проекции языка программирования Паскаль на единое внутреннее представление и выполнены в соответствии с представленной выше моделью онтологии. Рис. 1. Описание соответствия между понятием “Имя переменной” языка Паскаль и конструкцией языка единого представления. Рис. 2. Описание соответствия между понятием “Оператор присваивания” языка Паскаль и конструкцией языка единого представления. Заключение В работе представлен краткий обзор существующих систем оптимизации и распараллеливания программ, в котором указано на трудности, с которыми приходится сталкиваться при переводе этих программ, представленных на языках программирования, во внутреннее промежуточное представление. Также в работе описана общая идея использования проекционного подхода к решению этой задачи, позволяющего преодолеть недостатки, присутствующие в существующих системах. Приведен фрагмент модели онтологии проекций языков программирования высокого уровня на единое представление и на примере продемонстрировано, как в соответствии с моделью онтологии представляется описание (фрагмента) конкретной проекции. Список литературы 1. Тапкинов Б. Ю. Внутреннее представление программы в Системе построения оптимизирующих и распараллеливающих компиляторов // Труды Всероссийской научной конференции “Научный сервис в сети Интернет: технологии параллельного программирования”, Новороссийск, 18-23 сентября 2006. С. 88-91. 2. Кауфман В.Ш. О технологии создания трансляторов (проекционный подход). // “Программирование”. 1978. № 5. – С. 36 – 44. 3. Ершов А.П., В.В. Грушецкий. Метод описания алгоритмических языков, ориентированный на реализацию. Препринт, ВЦ Сибирское отделение АН СССР, Новосибирск, 1977.