Научная статья на тему 'Автоматическая генерация тестов на основе конфигурационных файлов для оптимизирующих преобразований компилятор'

Автоматическая генерация тестов на основе конфигурационных файлов для оптимизирующих преобразований компилятор Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
124
32
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
автоматическая генерация тестов / оптимизирующие преобразования / конфигурационный файл / Automatic test generation / optimizing transformations / config-file

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Алымова Елена Владимировна

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

i Надоели баннеры? Вы всегда можете отключить рекламу.

Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Алымова Елена Владимировна

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

An automatic tests generator based on config-files containing information about the terms of the feasibility of conversion is described.

Текст научной работы на тему «Автоматическая генерация тестов на основе конфигурационных файлов для оптимизирующих преобразований компилятор»

МАТЕМАТИКА

УДК 004.074

АВТОМАТИЧЕСКАЯ ГЕНЕРАЦИЯ ТЕСТОВ НА ОСНОВЕ КОНФИГУРАЦИОННЫХ ФАЙЛОВ ДЛЯ ОПТИМИЗИРУЮЩИХ ПРЕОБРАЗОВАНИЙ КОМПИЛЯТОРА

© 2010 г. Е.В. Алымова

Южный федеральный университет, Southern Federal University,

ул. Мильчакова, 8а, г. Ростов н/Д, 344090, Milchakov St., 8a, Rostov-on-Don, 344090,

dnjme@math.sfedu. ru dnjme@math.sfedu. ru

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

Ключевые слова: автоматическая генерация тестов, оптимизирующие преобразования, конфигурационный файл.

An automatic tests generator based on config-files containing information about the terms of the feasibility of conversion is described.

Keywords: automatic test generation, optimizing transformations, config-file.

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

Существует несколько различных подходов к формированию тестовых наборов для компилятора. В [1] предлагается анализировать самостоятельные модули и подбирать тесты, ориентированные на проверку отдельных функций компилятора. Для оптимизирующих компиляторов в [2] строятся модели оптимизации на основе абстрактного описания их алгоритма. В [3] рассмотрена разработка генератора тестов для оптимизирующего компилятора языка Fortran-77. Описываемый метод основывается на анализе частоты использования функций и расстановке самопроверяющихся фрагментов кода.

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

Оптимизирующие преобразования программ

Оптимизация - это последовательность эквивалентных преобразований исходной программы. Ее цель - повышение качества программы при сохранении ее смысла [4]. Наиболее распространенными являются преобразования циклов, поскольку наибольшее время работы программы отнимается циклически повторяющимися участками.

Рассмотрим подробнее следующие преобразования циклов: раскрутка; развертка; слияние.

Развертка цикла кратности h заменяет цикл БО 999 I = 1, N 999 ТЕЛОЦИКЛА(1) следующим фрагментом программы: БО 888 I = 1, N Ъ ТЕЛОЦИКЛА(1) ТЕЛОЦИКЛА(1+1)

888 ТЕЛОЦИКЛА(Нй-1)

N2 = N mod h //остаток от деления числа N на к БО 777 I = N-N2+1, N 777 ТЕЛОЦИКЛА(1) Раскрутка цикла заменяет цикл БО 999 1=1,N 999 ТЕЛОЦИКЛА(1) на следующий фрагмент программы: ТЕЛОЦИКЛА(1) ТЕЛОЦИКЛА(2)

ТЕЛОЦИКЛА(К)

I = N

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

Построение тестовой программы, ориентированной на конкретное преобразование с помощью конфигурационного файла

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

Пример 1. Пусть задана формальная грамматика вида

S := a | aS.

Она содержит одно правило с именем «8». Альтернативами для него являются символы, разделенные знаком «|».

(Конец примера 1).

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

Формальная грамматика (вход)

Программа (выход)

Схема автоматической генерации программы

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

Пример 2. Рассмотрим программу на языке С:

void main()

{

int a, b, c;

a = 2;

b = 3;

c = 4;

if (a > b)

{

a = c + 1;

b = 10;

}

for (int i = 1; i <= 5; i++)

{

if (i > a)

{

b = b + i;

}

}

c = 6;

}

Для этого примера словарь будет иметь следующую структуру:

- уровень 1: оператор присваивания, условный оператор, оператор цикла;

- уровень 2 (для условного оператора): оператор присваивания;

- уровень 2 (для оператора цикла): условный оператор.

(Конец примера 2).

Словарь с иерархической структурой позволяет ориентировать генерацию тестовой программы на конкретное преобразование.

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

При развертке циклов должно выполняться следующее условие: пусть тело цикла содержит операторы присваивания, логические или блочные условные операторы, операторы безусловного перехода GOTO (кроме вычислимого). Тогда развертка цикла, выполненная по описанным выше правилам, является эквивалентным преобразованием [5].

Чтобы сгенерировать набор тестов для этого преобразования, достаточно ограничить состав операторов в циклах. Ограничения описываются в конфигурационном файле формата XML. Для преобразования «развертка цикла» конфигурационный файл имеет следующий вид (листинг 1):

Листинг 1. Конфигурационный файл для преобразования «Развертка цикла»

<?xml version="1.0" encoding="UTF-8"?> <program class="loop unrolling"> <params intArray="4" realArray="4" lengthAr-ray="100" intIndex="4" />

<body statAssign="1" statFor="1" statWhile="0" sta-tIf="0" statIfThenElse="0" statSwitch="0" statLogica-lIf="0" />

<statFor statAssign="1" statFor="1" statWhile="1" statIf="1" statIfThenElse=" 1" statGoTo="1" stat-Break="0" statContinue="0" statSwitch="0" statGoTo-Calc="0" />

<statWhile statAssign="1" statFor="0" statWhile="0" statIf="1" statIfThenElse="0" statBreak="0" statConti-nue="0" statSwitch="0" />

<statIf statAssign="1" statFor="1" statWhile="0" sta-tIf="0" statIfThenElse="0" statSwitch="0" statGoTo="0" />

<statIfThenElse statAssign="1" statFor="0" statW-hile="0" statIf="1" statIfThenElse="0" statSwitch="0" statGoTo="0" />

<statSwitch statAssign="1" statFor="1" statWhile="1" statIf="1" statIfThenElse="0" /> <statLogicalIf statAssign="1" /> </program>

Словарь парсера согласно заданной конфигурации будет иметь вид:

- уровень 1 (контекст циклов): оператор присваивания, оператор цикла;

- уровень 2 (для цикла): оператор присваивания, оператор цикла, условный оператор, оператор безусловного перехода;

- уровень 2 (операторы): произвольный выбор операторов.

Разработанный генератор тестов способен формировать тестовые наборы для конкретных преобразований на различных языках программирования. На листингах 2а и 2б представлены примеры сгенерированных программ по одному конфигурационному файлу. В качестве входного параметра использовались формальные грамматики языка C и языка Fortran-77.

Листинг 2а. Тест для преобразования «Развертка цикла» (Си)

int intlndex 0; int intlndex 2; int intlndex 1; int intlndex 3; int intArray_0[100]; int intArray_2[100]; int intArray_1[10 0]; double realArray 2[100]; double realArray 1[100]; double realArray_0[100];

void main() {

for( intIndex_0 =13 ; intIndex_0 <= 84 ; intln-

dex_0 + 3 ) {

intArray_0[ intIndex_0 + 2 ] = 45 - 59 - intAr-ray_2[ intIndex_2 + 0 ] - 65 + intArray_2[ intIndex_1 + 3 ] ;

if ( intArray_2[ intIndex_1 - 1 ] < 20)

{

intArray_2[ intIndex_3 + 1 ] = 43 - intAr-

ray_1[ intIndex_1 - 1 ] ; }

realArray_2[ intIndex_0 + 2 ] = 6 + 19 + rea-

lArray_1[ intIndex_0 + 1 ] ; }

realArray_0[ intIndex_3 + 0 ] = 93 + 0.19 - intAr-

ray_1[ intIndex_1 - 4 ] ; }

Листинг 2б. Тест для преобразования «Развертка цикла» (Fortran 77)

INTEGER intIndex_0 INTEGER intIndex_1 INTEGER intIndex_2 INTEGER intArray_0(10 0) INTEGER intArray_2(100) INTEGER intArray_3(10 0) INTEGER intArray_1(10 0) REAL realArray_2(100) REAL realArray_1(100) REAL realArray_0(100) REAL realArray_3(10 0) DO 1 intIndex_0=11,85

IF(intArray_0(intIndex_1-3).LT.8)THEN IF(intArray_2(intIndex_0+0).GT.intAr-ray_0(I F ntIndex_0+0))THEN

intArray 3(intIndex 2-2)=64+intAr-ray_0(intIndex_1+2 F ) ENDIF

intArray_1(intIndex_0+0)=2 9-2 0+intAr-ray 2(intIndex F 0+2)

intArray_3(intIndex_1+0)=7 6+3+intAr-ray 2(intIndex 0 F +3) ENDIF

1 CONTINUE

realArray 2(intIndex 1-0)=36-0+realer-ray 1(intIndex F 1-1)

realArray 0(intIndex 1-0)=72+intAr-ray 2(intIndex 2+4

F )+0.32-realArray_2(intIndex_1-3) END

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

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

Литература

1. Зеленое С.В., Пакулин Н.В. Верификация компиляторов -

систематический подход // Тр. Ин-та системного программирования РАН. Т. 7. М., 2007. С. 39 - 56.

2. Зеленое С.В., Зеленоеа С.А. Автоматическая генерация

позитивных и негативных тестов для тестирования фа-

зы синтаксического анализа // Тр. Ин-та системного программирования РАН. Т. 8. М., 2004. С. 41-58.

3. Burgess C.J., Saidi M. The automatic generation of test cases for optimizing Fortran compilers // Information and Software Technology. 1996. Vol. 38, № 2. P. 111-119.

Поступила в редакцию

4. Касьянов В.Н. Оптимизирующие преобразования про-

грамм. М., 1988. 336 с.

5. Штейнберг Б.Я. Математические методы распараллели-

вания рекуррентных циклов для суперкомпьютеров с параллельной памятью. Ростов н/Д, 2004. 192 с.

_29 апреля 2009 г.

i Надоели баннеры? Вы всегда можете отключить рекламу.