Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Построение расширенного графа управления




 

Выполнение задач дипломной работы осуществлялось на языке C++ с использованием библиотеки Sage++ 2.0. В данном пункте приведены описания классов, составляющих программный код дипломной работы, использованные в их наиболее существенных методах алгоритмы, а также условия, которым должна удовлетворять входная программа для успешной ее обработки системой в целом, и реализованным в дипломной работе блоком в частности.

Ограничения на входную программу

 

Первое требование к входной программе заключается в ее корректности с точки зрения синтаксиса и семантики Fortran77. Заключенные в ней ошибки, не определенные на этапе разбора текста средствами Sage++, могут привести к непредсказуемым результатам.

Общим для всей системы ограничением является также ее достаточно высокая чувствительность к плохой структурированности программы, а именно:

· в программе не должны присутствовать операторы прекращения выполнения;

· запрещены операторы перехода, за исключением выхода из тела цикла на первый за концом цикла оператор по условию.

Другим существенным требованием является запрет на использование COMMON-областей.

Ограничения, накладываемые в данной дипломной работе:

· выражения в заголовках циклов (начальное, конечное, шаг) могут быть только линейными относительно некоторой переменной, т.е. иметь вид C1*V+C0, где C1 и C0 - константы, V - переменная;

· индексные выражения в обращениях к массивам должны удовлетворять тому же условию;

· отсутствие аппарата поиска зависимостей по данным влечет необходимость вставки пользователем комментария “DEPENDENCE” в теле цикла, содержащего зависимость.

 

Описание классов

 

В рамках дипломной работы реализовано два набора классов:

1. Классы, выполняющие построение внутреннего представления, экспорт данных для блока распределения вычислений и данных, последующий импорт результатов работы этого блока и генерацию текста на FortranDVM.

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

Рассмотрим назначение классов 1-го набора и их наиболее важные члены.

1) Класс cSourceProgramSg - представляет исходную последовательную программу. Обработка входной программы должна начинаться с создания объекта этого класса.

cSourceProgramSg (char *projfile) - конструктор класса, projfile - имя файла проекта Sage++; в этом конструкторе происходит открытие проекта, разбор входящего в него файла исходной программы, создание незаполненных графа, списка циклов и таблицы символов.

SgStatement             * FirstSt () - 1-й оператор программы.

SgStatement             * LastSt () - последний оператор программы.

cProgramGraphSg   * PrgGraph () - граф программы.

cLoopListSg             * LpList () - список циклов.

cSymbolTabSg * SymTab () - таблица символов.

void PrepareConsts () - замена в теле программы обращений к константам на их значения.

void PrepareLoops () - конвертация циклов программы к виду DO-ENDDO.

void                BuildLoopList () - построение списка циклов.

void                BuildProgGraph () - построение графа программы.

void PrintLoopList (ostream&) - вывод в поток списка циклов для просмотра.

void                PrintProgGraph (ostream&) - вывод графа.

void                PrintSymbolTab (ostream&) - вывод таблицы имен.

void                ExportData (char*) - экспорт данных в файлы.

void                ImportData (char*) - импорт данных из файлов;

void Unparse (char*) - генерация результирующего текста в файле, имя которого определяется параметром метода.

При экспорте данных в файлы образуются следующие файлы:

filename.gr - узлы графа;

filename.gri - индексный файл;

filename.lp - список циклов;

filename.st - таблица символов, где filename - параметр метода ExportData(char*).

2) Класс cProgramGraphSg - представляет расширенный граф программы.

cProgramGraphSg (cSymbolTabSg*, cLoopListSg*) - конструктор класса, создает пустой граф управления. Параметры - таблица символов и список циклов, на которые будет ссылаться граф.

cLoopListSg                      * LpList () - список циклов, используемый графом.

cSymbolTabSg         * SymTab () - таблица имен, используемая графом.

cProgramGraphNodeSg    * CurNode () - текущий узел.

int                            IsStart () - является ли текущий узел начальным.

int                            GoStart (), GoDown (), GoUp (), GoLeft1 (), GoLeft2 (),

GoRight1 (), GoRight2 (), GoId (long int) - переместить указатель на текущий узел соответственно на 1-й узел, вниз, вверх, влево по 1-й ссылке, влево по 2-й ссылке, вправо по 1-й ссылке, вправо по 2-й ссылке, на узел с заданным номером. Возвращает 1 при удачном переходе, 0 в противном случае..

void CountOpers () - подсчет числа операций для каждого узла графа.

void ExportData (ofstream&, ofstream&) - экспорт графа и индексной информации в потоки.

void ImportData (ifstream&) - импорт данных от блока распределения вычислений, подлежащих вставке в граф;

void Build (SgStatement*, SgStatement*, int, int) - построение графа.

void Unparse () - произвести вставку добавленных в граф данных во внутреннее представление Sage++;

3) Класс cProgramGraphNodeSg - представляет узел графа управления.

cProgramGraphNodeSg () - конструктор класса, создает новый узел.

SgStatement   * poSt1, * poSt2, * poSt3 - принимают значения после построения графа.

Для линейного участка: poSt1 - 1-й оператор блока, poSt2 - последний оператор.

Для цикла: poSt1 - оператор заголовка цикла, poSt2 - оператор, завершающий цикл (ENDDO)

Для ветвления: poSt1 - IF, poSt2 - ELSE, poSt3 - ENDIF.

int                   Level - уровень вложенности, внешнему уровню соответствует 0.

int                   IsParal - признак возможности распараллеливания.

long int  LoopId - для элементов типа “цикл” содержит номер соответствующего цикла из списка.

float Ver1, Ver2 - для элементов типа “ветвление” вероятность перехода соответственно по 1-й и 2-й ветви.

float Opers [df_OPERS_COUNT] - массив, в каждом элементе которого содержится количество соответствующих индексу элемента операций в блоке. Например, Opers[0] - число сложений, Opers[1] - вычитаний.

long int           Id () - уникальный номер узла.

int              NodeType () - тэг типа узла.

long int  ExportData (ofstream&) - экспорт узла в файловый поток, возвращает количество записанных байт.

void ImportData (ifstream&) - импорт данных из файлового потока.

void Unparse () - произвести вставку добавленных в узел данных во внутреннее представление Sage++.

4) Класс cLoopListSg - представляет список циклов программы.

cLoopListSg (cSymbolTabSg*) - конструктор класса, создает пустой список циклов, параметр - таблица символов, на которую будет ссылаться список.

cSymbolTabSg * SymTab () - таблица символов, используемая списком.

cLoopListNodeSg    * CurNode () - указатель на текущий элемент списка.

int GoStart (), GoEnd (), GoRight (), GoLeft (), GoId (long int) - переместить указатель на текущий узел соответственно на 1-й узел, последний узел, влево, вправо, на узел с заданным номером. Возвращает 1 при удачном переходе, 0 в противном случае.

void Analyse () - произвести необходимый анализ элементов списка.

void Build (SgStatement*, SgStatement*, int) - построить список.

void ExportData (ofstream&) - экспорт списка в файловый поток.

5) Класс cLoopListNodeSg - представляет элемент списка циклов.

cLoopListNodeSg () - конструктор класса, создает новый элемент.

long int  Id () - номер элемента.

SgStatement   * poSt1, * poSt2 - ссылки соответственно на оператор заголовка цикла и на оператор завершения цикла.

cSymbolSg * poCounterSym - ссылка на переменную-счетчик цикла.

cExpressionSg * poStartExpr, * poEndExpr, * poStepExpr - начальное, конечное выражения счетчика и выражение шага цикла.

long int  IterNum - количество итераций цикла.

int Level - уровень вложенности.

int IoOp, GotoOp - флаги наличия в теле цикла операторов ввода\вывода и операторов перехода за тело цикла.

cVarListElemSg * LVar [df_MAX_LRVAR_COUNT], * RVar [df_MAX_LRVAR_COUNT] - списки обращений к переменным и элементам массивов на модификацию и на чтение соответственно.

sReduct RedVar [df_MAX_REDVAR_COUNT] - список редукционных переменных, содержащихся в теле цикла.

void AnalyseHead (cSymbolTabSg *) - произвести анализ заголовка цикла.

void AnalyseBodyVars (cSymbolTabSg*) - произвести анализ обращений к переменным и элементам массивов в теле цикла.

void AnalyseRedVars (cSymbolTabSg*) - произвести поиск редукционных переменных в теле цикла.

void AnalyseIoOp () - определить присутствие в теле цикла операций ввода\вывода.

void AnalyseGotoOp () - определить присутствие в теле цикла операторов перехода за тело цикла.

long int  ExportData (ofstream&) - экспорт элемента в файловый поток, возвращает количество записанных байт.

6) Класс cSymbolTabSg - представляет таблицу символов. Реализована в виде двунаправленного списка элементов класса cSymbolSg.

cSymbolTabSg () - конструктор класса, создает пустую таблицу.

cSymbolSg * FirstSym () - указатель на 1-й элемент списка.

void ExportData (ofstream&) - экспорт таблицы в файловый поток.

7) Класс cSymbolSg - представляет элемент таблицы символов.

cSymbolSg () - конструктор класса, создает новый элемент.     

long int  Id () - уникальный номер элемента.

SgSymbol * poSgSym - ссылка на соответствующий элемент таблицы символов Sage++.

int Variant () - тэг вида элемента: переменная или массив.

int Type - код типа.

char * Name - строка имени.

int Dim () - размерность (для массива).

int DimLen (int i) - длина по i-му измерению (для массива).

cSymbolSg * LinkRight () - следующий в списке элемент.

cSymbolSg * LinkLeft () - предыдущий в списке элемент.

long int  ExportData (ofstream&) - экспорт элемента в файловый поток.

int operator == (cSymbolSg&), operator!= (cSymbolSg&)

8) Класс cExpressionSg - представляет выражение. Текущая реализация класса позволяет хранить только выражения вида c1*V+c0, где c1,c0 - константы, V - переменная.

cExpressionSg (SgExpression*, cSymbolTabSg*) - конструктор класса, параметрами являются подлежащее разбору выражение, представленное объектом Sage++, и таблица символов, которая будет дополнена входящим в состав выражения идентификатором.

int Variant () - тэг вида выражения.

cSymbolSg * poVariable - ссылка на переменную выражения.

int IntC0 (), IntC1 () - значения констант, приведенные к типу int.

float RealC0 (), RealC1 () - аналогично, float.

double   DoubleC0 (), DoubleC1 () - аналогично, double.

long int  ExportData (ofstream&) - экспорт выражения в файловый поток.

int operator == (cExpressionSg&), operator!= (cExpressionSg&)

9) Класс cArrayRefSg - представляет ссылку на элемент массива.

cArrayRefSg (SgArrayRefExp*, cSymbolTabSg*) - конструктор класса, параметрами являются подлежащая разбору ссылка на элемент массива, представленная объектом Sage++, и таблица символов, в которую будут добавлены входящие в ссылку переменные и имя массива.

SgArrayRefExp * poSgArrRef - исходный объект Sage++.

cSymbolSg * poSym - идентификатор массива.

int SubscrNum - количество индексных выражений в ссылке.

cExpressionSg* SubscrList [df_MAX_DIM] - массив индексных выражений.

long int  ExportData (ofstream&) - экспорт в файловый поток.

int operator == (cArrayRefSg&)

int operator!= (cArrayRefSg&)

10) Класс cVarListElemSg - представляет элемент списка обращений к переменным и массивам.

cVarListElemSg (SgVarRefExp*, cSymbolTabSg*), cVarListElemSg (SgArrayRefExp*, cSymbolTabSg*) - конструкторы класса, 1-й для разбора обращения к переменной, параметрами являются ссылка на переменную, представленная объектом Sage++, и таблица символов, в которую будут добавлены идентификаторы; 2-й для разбора ссылки на массив, параметры имеют тот же смысл.

int Variant () - тэг вида элемента (ссылка на переменную или на массив).

cSymbolSg * poSym - идентификатор переменной для ссылки 1-го вида.

cArrayRefSg   * poArr - ссылка на массив для 2-го вида.

long int  ExportData (ofstream&) - экспорт в файловый поток.

int operator == (cVarListElemSg&)

int operator!= (cVarListElemSg&).

Для каждого из описанных классов существует его аналог во втором наборе, имеющий такое же имя за исключением постфикса “Sg”. В классах-аналогах отсутствуют методы для построения структур и конструкторы разбора. Корректная инициализация объектов этих классов производится только за счет введенных методов импорта из файлового потока. В классе cProgramGraphNode добавлены члены-данные для хранения директив FortranDVM, формирование которых осуществляет блок распределения вычислений и данных, и методы для их вставки, а также реализован экспорт этих комментариев в файл.

 

Алгоритмы

 

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

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

cSourceProgramSg TestProg(projfile);

TestProg.PrepareAll();

TestProg.BuildAll();

TestProg.PrintAll(cout);

TestProg.ExportData(trgfile);

В первую очередь создается объект класса cSourceProgramSg, параметром конструктора которого является имя файла-проекта Sage++. Далее вызываются методы этого класса:

PrepareAll() - предварительная обработка Sage++ представления исходного приложения;

BuildAll() - построение всех структур;

PrintAll(cout) - вывод в поток cout построенных структур для просмотра;

ExportData(trgfile) - экспорт данных в файлы.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...