Генерация высококачественного кода для программ на СИ - 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. Здесь он близок к наихудшим
компиляторам.