PARUS
Страница проекта ПАРУС / Руководство / Утилиты / parser EnglishRus

Краткая информация

Имя файла parser
Краткое описание По С-программе строит граф зависимостей по данным
Формат вызова parser {filename1}, ... {filenameN}

Анализатор зависимостей по данным в C-программе

CвернутьОбщее описание

Целью является разработка программного средства, преобразующего текст последовательной программы в граф зависимостей по данным. В качестве языка выбран язык C (стандарт ANSI ISO). С помощью полученной реализации предполагается исследовать возможности и перспективы, связанные с применением полностью автоматического подхода к созданию параллельных программ. Построенный граф может использоваться как независимый от архитектуры машины способ представления программы.

Анализ текстов проводится в предположении статического распределения памяти. В программе не должно быть динамического выделения памяти, например системного вызова malloc. Конечно, при статическом анализе невозможно полностью учесть всех особенностей языка программирования C из-за разнообразия функциональных возможностей и широко применяемых программистами приемов программирования в своей повседневной практике. Например, очень сложно проводить статический анализ, если включить в представление тип данных указатель и операции над объектами этого типа, предусмотренные в языке C. Поэтому в текущей версии разработанного анализатора эта и подобные ей особенности языка не анализируются, и при их обнаружении программа прекращает свою работу выдачей диагностического сообщения. Проверка на наличие в C-программе не поддерживаемых в текущий момент особенностей проводится на этапе определения информационных зависимостей, который происходит после распознавания текста.

Основной стратегией при построении графа по C-программе является стратегия максимального разделения операций с целью получения наиболее широкого представления графа. То есть максимизации количества независимых между собой операций. Арифметические выражения переводятся в древовидную структуру, над которой реализован базовый набор операций и специальные преобразования. Например, можно вычислить значение выражения, если значения переменных в нем присутствующих определены, преобразовать в линейную форму и упростить индексное выражение и др. Далее эта же структура используется в представлении информации о зависимостях. Стоит заметить, что при работе не происходит анализа выражений на распараллеливаемость, поскольку изменение последовательности вычислений может привести к некорректным или «неправильным» результатам (обычные арифметические операции для чисел с плавающей запятой не коммутативны). Однако перераспределение вычислений в выражении возможно. Это может быть достигнуто путем предварительного вычисления результатов используемых функций, с последующей подстановкой результата в место вызова. Заметим, что такая функция не должна иметь побочных эффектов.

Для каждой функции определяется набор глобальных переменных, с которыми она оперирует. Определяется вес функции, характеризующий её вычислительную сложность. В теории, возможно сделать подстановку тела функции в место вызова, с подстановкой актуальных параметров. В С++ такие функции помечаются ключевым словом inline. К сожалению, в текущей реализации такая возможность не реализована. На такие функции накладывается некоторые существенные ограничения. В нашем случае самым серьезным ограничением является требование единственности оператора return у функции. Совершенно ясно, что оператор return задает так называемую зависимость по управлению, и на прямую не выразим в терминах информационных зависимостей. Единственный (безусловный) return может быть заменен на присвоение некоторой переменной возвращаемого значения. Если тело функции содержит условные операторы с return, в качестве выполняемого действия, то такой текст нельзя подставлять в место вызова данной функции. Подобный стиль написания функций довольно широко распространен в силу своих удобства и наглядности.

РазвернутьАнализ зависимостей

РазвернутьПостроение графа

РазвернутьОпределение весов операторов

 
Администратор: Алексей Сальников