Генерация высококачественного кода для программ на СИ
Страница 16. Microsoft QuickC.


 

Microsoft QuickC.

 Когда речь идет об оптимизации, QuickC становится настолько беспомощным,
 насколько C 5.0 изощренным. Код, сгенерированный QuickC, был в основном
 дословным переводом, насыщенным излишними загрузками и сохранениями
 регистров, переходами на переходы. Этот компилятор применяет лишь наиболее
 первичные методы оптимизации, свертку констант и некоторые алгебраические
 упрощения. Он сгенерировал недостижимый код, поместил переход через него и
 не смог выполнить сжатие цепочки переходов.
 В пользу компилятора свидетельствует то, что что он разумно управляет
 прологами и эпилогами функций, используя отдельные инструкции для
 установки адресации стекового фрейма при входе и инструкцию LEAVE при
 завершении функции. При входе сохраняются и при выходе восстанавливаются
 только те регистры, которые используются в теле функции.
 QuickC был влючен в этот обзор, потому что он имеет ключ оптимизации в
 командной строке (-Ox). Генерируя код, который по своей природе -
 дословный перевод исходного текста, QuickC был разработан исключительно
 как быстрый прототип компилятора, но не как оптимизирующий компилятор.
 WATCOM.
 Новейший соперник, завоевывающий позиции на рынке компиляторов C - WATCOM
 C 6.0 (см. Product Watch, Philip N. Hisley, за этот месяц). C 6.0
 вырабатывает компактный код, который прекрасно использует несколько
 ограниченный комплект регистров семейства 80x86. Кроме выполнения базовых
 приемов оптимизации, он поддерживает снижение мощности и удаление
 недостижимого кода и общих подвыражений. В то время, как Microsoft
 достигает улучшения кода благодаря оптимизации циклов, WATCOM увеличивает
 скорость путем уменьшения управляющих заголовков вызовов функций к их
 абсолютно минимальному размеру. Он достигает этого путем преимущественной
 передачи параметров через регистры, а не через стек.
 WATCOM очень хорошо удаляет недостижимый код. C 6.0 не только удалил
 ненужные присваивания и недостижимый код внутри функции, но он также
 удалил пролог и эпилог функции и свернул всю функцию к простому возврату,
 приписав имя функции к инструкции возврата основной функции. В завершение
 всего, компилятор удалил локальный вызов функции.
 Насколько C 6.0 изощрен в уничтожении бесполезной функции, настолько же он
 беспомощен при удалении бесполезного дублирующегося присваивания. Наиболее
 важная область, за которую WATCOM C 6.0, как и Optimum-C, не смог взяться,
 была оптимизация циклов. Он не поддерживает вынесение инвариантного кода и
 удаление переменных индукции циклов. Хотя C 6.0 не выполняет
 разворачивание циклов в отдельные команды, он (также как Datalight
 Optimum-C и Computer Innovations C86Plus) использует команду REP/STOSW
 процессоров 80x86 для инициализации тестового массива, благодаря чему
 удаляет цикл.
 Прекрасная генерация кода в WATCOM, в частности, разумное использование
 регистров, дает ему очень важное преимущество. В тесте выполнения он
 победил в большинстве тестов, интенсивно использующих процессор, и при
 этом выполнялся для большой модели в лучшее время, чем большинство других
 компиляторов для малой модели. К слабым сторонам WATCOM можно отнести
 ввод/вывод файлов, использование getc и putc. Здесь он близок к наихудшим
 компиляторам.

 
« Предыдущая статья   Следующая статья »