Современные информационные
технологии/ 3.Программное обеспечение
Махамбетова Г.И.
Костанайский гос. университет им.А.Байтурсынова, Казахстан
Тестирование
компиляторов.
PC
Tech Journal разработал
тест оптимизации Си
как подспорье в оценке оптимизационных возможностей компиляторов Си.
Тест проверяет степень оптимизации, проводимой компилятором. Для обеспечения
основы для сравнения измерений времени
выполнения для каждого
компилятора запускался тест исполнения PC Tech Journal с ключами,
разрешающими оптимизацию. Результаты его работы для каждого компилятора суммируются. Целью обоих тестов,
исполнения и оптимизации, было получить
наиболее быстрый код,
который может дать
каждый компилятор. Если компилятор предоставляет опции для генерации
кода, они выбирались с
приоритетом времени выполнения
над размером программного кода,
генерировались команды микропроцессора 80286 и
непосредственные команды сопроцессора 80287, запрещалось проверять переполнение
стека. Таким образом, минимальная
конфигурация системы, требуемая для запуска тестов в том виде, в каком
они компилировались, - машина с процессором
80286 и математическим сопроцессором 80287.
Многие компиляторы также имеют опции
для генерации кода процессоров 80186 и NEC V20/V30, которые
могут использоваться для машин класса XT.
Эти процессоры имеют большинство средств 80286, исключая
команды защищенного режима,
так что сгенерированный для них код совпадает с
кодом для 80286.
Процесс оптимизации кода
сложен, и степень
повышения эффективности зависит
не только от типа и изощренности методов
оптимизации компилятора, но также и от того, как исходный текст
программы написан и структурирован. Результат также зависит от
того, как в
исходном тексте используются переменные и выражения [1].
Каждый компилятор из
рассматриваемого набора выполняет простейшие приемы оптимизации,
такие как свертка констант и алгебраические упрощения. Большинство применяют методы оптимизации некоторого
промежуточного уровня, включающего снижение мощности и
удаление общих подвыражений. Некоторые выполняют оптимизацию высокого
уровня, такую как
вынесение инвариантного кода
и удаление переменных индукции
циклов. Ни один не выполняет успешно слияние циклов, и только Datalight Optimum-C делает
попытки, далеко не
удовлетворительные, применения
глубокого удаления общих подвыражений.
Borland International.
Выход компилятора Turbo C
представляет собой разумный, но не очень оптимизированный код. Кроме свертки
констант, удаления лишних загрузок
регистров и алгебраических упрощений,
компилятор выполняет только
снижение мощности, удаление
недостижимого кода и размещение переменных в регистрах. Он
не поддерживает другие общие
методы оптимизации, такие
как удаление лишних сохранений,
общих подвыражений и
переменных индукции цикла, а
также вынесение инвариантного кода. Turbo C разумно
управляет прологом и эпилогом функций и использованием регистров, засылая
в стек и извлекая только те
регистры, которые явно используются внутри тела функции.
Computer
Innovation Inc.
Компилятор C86Plus вырабатывает хороший код со средним
уровнем оптимизации. Он выполняет базовые
приемы оптимизации, такие
как свертка констант и размножение копий. Однако он не
выполняет размножение констант для удаления лишних сохранений. Хотя компилятор успешно выполняет алгебраические упрощения, он
порождает лишние инструкции
из-за того, что размещает результаты
в регистрах, вместо того, чтобы помещать
их в переменные. Этот эффект
проявляется в том,
что при размещении переменных
в регистрах предпринимаются попытки
переразмещения, так как
при выполнении нескольких операторов результаты в
действительности должны быть
присвоены соответствующим
переменным. Однако C86Plus
успешно справляется со
сверткой явных дублирующихся
присваиваний в одно присваивание, удаление лишних сохранений он
выполняет неустойчиво. Единственное лишнее присваивание в
функции dead_code остается единственной командой после того, как компилятор
удаляет недостижимый код из функции. C86Plus - один из нескольких компиляторов
рассматриваемого набора, который преобразует инициализацию элементов массива из функции
проверки разворачивания циклов в эквивалентную команду STOSW процессора
80x86 с префиксом REP.
Lattice Inc.
Имеющий большую историю
компилятор Lattice MS-DOS
C последовательно совершенствовался с каждой новой версией.
Он известен как генератор стабильного, предсказуемого кода и выполняет
умеренную оптимизацию. Lattice С
выполняет снижение мощности, сжатие
цепочки переходов и
удаление общих подвыражений. Он не удаляет дублирующиеся присваивания после
теста встроенных функций
и лишние присваивания в функции dead_code.
Хотя он не
генерирует никакого кода
для недостижимого printf в функции dead_code, компилятор Lattice C
генерирует ненужный безусловный
переход к LEAVE,
которая является следующей инструкцией. Единственными сгенерированными машинно-зависимыми инструкциями были
ENTER и LEAVE, инструкции
микропроцессоров 80x86 для прологов и эпилогов функций. Это
сомнительное благо, поскольку выполнение ENTER требует больше
циклов микропроцессора,
чем установка адресации
стекового фрейма отдельными
инструкциями. Lattice C не
выполняет оптимизацию циклов.
Литература:
1.
Б.Керниган, Д.Ритчи Язык программирования Си- Москва -Финансы и
статистика- 1992г.
2.
С.О.Бочков,
Д.М.Субботин Язык программирования Си
для персонального компьютера- Москва СП-Диалог- 1996г.