Генерация высококачественного кода для программ, написанных на СИ - [12]

Шрифт
Интервал

В тесте размножения констант и копий Optimum-C определил, что присваивание i5 в обоих условных операторах является излишним по отношению к последующим присваиваниям. Компилятор удалил не только эти присваивания, но и условные операторы.

Неудовлетворительным оказалось удаление лишних сохранений значений регистров. Optimum-C удалил одно лишнее присваивание, i=k5, в тесте размножения констант и копий и лишнее присваивание в функции dead_code. Он не удалил второе лишнее присваивание, i=2, в тесте размножения констант и копий, и k=2, дублируемое присваивание.

Optimum-C - единственный компилятор, который пытался выполнить глубокое удаление общих выражений. Проверка сгенерированного кода показала, что общее выражение i5+i2 было перемещено выше первого базового блока условного оператора, но не было удалено из второго.

Вне ограничений на стандартное использование регистров, накладываемых семейством микропроцессоров 80x86, Optimum-C разумно использует регистры. В функции jump_compression каждый передаваемый параметр был помещен в регистр. Внутри тела функции не было ссылок в память, кроме начальной засылки в регистры.

Одной важной областью, в которой компилятор Optimum-C требует улучшений, является оптимизация циклов. Компилятор не пытается выполнять вынесение инвариантного кода и удаление переменных индукции цикла.

Тест выполнения показал, что компилятор Datalight очень эффективно управляет вводом/выводом getc/putc, а остальные тесты выполняются в приемлемое время.

Lattice Inc.

Имеющий большую историю компилятор Lattice MS-DOS C последовательно совершенствовался с каждой новой версией. Он известен как генератор стабильного, предсказуемого кода и выполняет умеренную оптимизацию. Lattice С выполняет снижение мощности, сжатие цепочки переходов и удаление общих подвыражений. Он не удаляет дублирующиеся присваивания после теста встроенных функций и лишние присваивания в функции dead_code. Хотя он не генерирует никакого кода для недостижимого printf в функции dead_code, компилятор Lattice C генерирует ненужный безусловный переход к LEAVE, которая является следующей инструкцией.

Единственными сгенерированными машинно-зависимыми инструкциями были ENTER и LEAVE, инструкции микропроцессоров 80x86 для прологов и эпилогов функций. Это сомнительное благо, поскольку выполнение ENTER требует больше циклов микропроцессора, чем установка адресации стекового фрейма отдельными инструкциями. Lattice C не выполняет оптимизацию циклов.

Manx Software Systems Inc.

Компилятор Aztec C86 сгенерировал хороший код с довольно хорошим уровнем оптимизации. Кроме свертки констант и алгебраических упрощений, Aztec C86 выполнил снижение мощности и удаление общих подвыражений. Однако, он не выполнил удаление лишних присваиваний и не удалял недостижимый код. Aztec C86 сгенерировал код для недостижимого оператора printf вместе с безусловным переходом через него.

Поскольку любая программа на Си имеет значительное количество вызовов функций, заголовок каждого вызова необходимо минимизировать. Aztec C86 использует необычный, но эффективный подход к решению этой проблемы. На выходе компилятора получается текст в языке ассемблера, который обрабатывается отдельным ассемблером. Компилятор вставляет в текст директивы условного ассемблирования вокруг кода, который устанавливает стековый фрейм и сохраняет регистры. После генерации кода функции компилятор определяет символы для управления установкой стекового фрейма и сохранения только тех регистров, которые используются в функции.

Aztec C86 не смог решить задачу преобразования цепочки переходов в один переход к конечной цели. Он также не выполнял оптимизацию циклов.

Metaware Inc.

High C вырабатывает хороший код со средним уровнем оптимизации. Компилятор выполняет все базовые виды оптимизации, включая свертку констант и алгебраические упрощения, удаление лишних операций загрузки регистров, снижение мощности и удаление общих подвыражений. Компилятор Metaware удаляет недостижимый код из функции dead_code, но не удаляет лишние присваивания.

High C разумно использует машинно-зависимые инструкции. Компилятор усовершенствует загрузку констант с плавающей точкой, используя команду копирования строк MOVS процессоров 80x86 для записи значений с плавающей точкой, вычисленных во время компиляции. Он также генерирует инструкцию LEAVE процессоров 80x86 для эпилога функций, но устанавливает адресацию стекового фрейма в прологе функции с помощью отдельных инструкций, а не используя более длительную инструкцию ENTER.

Компилятор High C не выполняет вынесение инвариантного кода, важный метод оптимизации циклов. Он также не смог применить успешно удаление переменных индукции циклов. Встроенные функции поддерживаются для нескольких целочисленных и строковых операций, таких как strlen.

Microsoft C.

В версии 5.0 своего компилятора Си корпорация Microsoft вывела высокий уровень оптимизации кода на рынок PC. Microsoft уделяет много внимания анализу циклов. C 5.0 – единственный из рассматриваемых компиляторов, который выполняет вынесение инвариантного кода и настоящее удаление переменных индукции циклов. Компилятор Microsoft C 5.0 превосходно использует регистры, стараясь минимизировать обращения к памяти в теле цикла (см. рис. 4 и 5).


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.