ВОССТАНОВЛЕНИЕ ТЕКСТА ФОРТРАН-ПРОГРАММЫ ИЗ ВНУТРЕННЕГО ПРЕДСТАВЛЕНИЯ СИСТЕМЫ КОМПИЛЯТОРОВ GCC Выполнила: студентка 527 группы Алексашина Татьяна Михайловна Научный руководитель: профессор, д. ф-м. н. Крюков Виктор Алексеевич Москва, 2011
Текст программы и промежуточное представление Компиляторы используют в своей работе промежуточное представление. На уровне промежуточного представления можно проводить оптимизации и трансформации программы. Необходимо вернуться из промежуточного представления к тексту программы на исходном языке программирования для того, чтобы: o увидеть произведенные изменения; o иметь возможность использовать другие компиляторы для работы с измененной программой. 2
Постановка задачи Требуется разработать и реализовать алгоритм восстановления текста программы на языке Фортран из внутреннего представления GIMPLE системы компиляторов GCC. Полученная программа должна быть «читаема» и близка к исходной. 3
Компилятор GCC Back End Front End C parser C++ parser Fortran parser Java parser RTLAssembly 4
Компилятор GCC версии 4.0 Back End Middle End Front End C parser C++ parser Fortran parser Java parser GENERICGIMPLERTLAssembly 5
GIMPLE FortranHigh GIMPLELow GIMPLE if ( foo(a+b, c) ) c = (b+1)/a endif t1 = a+b t2 = foo(t1, c) if (t2 != 0) t3 = b+1 c = t3/a endif t1 = a+b t2 = foo(t1, c) if (t2 != 0) L1: t3 = b+1 c = t3/a goto L3 L2: L3: 6
Построение решения задачи Решение поставленной задачи строится для языка Фортран-77. Для проведения анализа внутреннего представления используется библиотека UTL (Universal Translating Library). Внутреннее представление программы получается от модифицированного компилятора GCC в виде xml-файла с описанием семантики. 7
Граф потока управления GIMPLE: t1 = a+b t2 = foo(t1, c) if (t2 != 0) t3 = b+1 c = t3/a endif Entry Exit if (t2 != 0) t1 = a+b t2 = foo(t1, c) t3 = b+1 c = t3/a 8
Алгоритм восстановления текста Алгоритм восстановления текста основан на обходе графа потока управления. С помощью графа потока управления и дерева циклов восстанавливается структура исходной программы. Для восстановления описания переменных проводится дополнительный анализ внутреннего представления. Удаляются вспомогательные переменные, введенные компилятором, восстанавливаются управляющие структуры. 9
Алгоритм восстановления текста: восстановление структуры Entry Exit if (t2 != 0) t1 = a+b t2 = foo(t1, c) L1: t3 = b+1 c = t3/a Запишем в файл текст каждой вершины в процессе обхода графа потока управления. Содержимое файла: t1 = a+b t2 = foo(t1, c) if (t2 != 0) then goto L1 else goto L1 endif Хотим получить: if (t2 != 0) then else endif L2 10
Алгоритм восстановления текста: восстановление структуры Entry Exit if (c1) if (c2) if (c3) … … … … … Граф потока управления: Обходим граф потока управления снизу вверх и строим граф, в вершинах которого текст на Фортране: Exit … … … … … … … 11
Алгоритм восстановления текста: восстановление структуры Exit … … if (c3) then else endif … Exit … … … … … … … … 12
Алгоритм восстановления текста: удаление вспомогательных переменных GIMPLE: t1 = a+b t2 = foo(t1, c) if (t2 != 0) t3 = b+1 c = t3/a endif ( t1, a+b ) ( t2, foo(a+b, c) ) ( t3, b+1 ) Ассоциативный массив Текст на Фортране: if ( foo(a+b, c) != 0) c = (b+1)/a endif 13
Схема работы программы восстановления текста Модифицированный компилятор GCC Файл с текстом исходной программы на языке Фортран Файл с текстом программы на языке Фортран xml-файл с описанием семантики исходной программы Разработанная программа восстановления текста 14
Результаты Разработан и реализован алгоритм восстановления текста Фортран-программы из представления GIMPLE. Разработанный алгоритм может быть расширен для работы с другими языками высокого уровня. В дальнейшем: o усовершенствование и оптимизация алгоритма; o возможность работы программы восстановления текста с другими языками программирования высокого уровня. 15