Современные информационные технологии/ 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г.