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

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

¦ мого кода ¦ * ¦ * ¦ * ¦ * ¦ ¦ * ¦ * ¦ ¦ * ¦

¦Удаление излишних ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦

¦ присваиваний ¦ ¦ * ¦ * ¦ ¦ ¦ * ¦ * ¦ ¦ * ¦

¦Использ. машинно- ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦

¦ зависимых команд ¦ ¦ * ¦ ¦ * ¦ ¦ * ¦ * ¦ * ¦ * ¦

¦Поддержка встроенных ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦

¦ функций ¦ ¦ ¦ ¦ ¦ ¦ ¦ * ¦ ¦ * ¦

¦Размещение переменных ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦

¦ в регистрах ¦ * ¦ * ¦ * ¦ * ¦ * ¦ * ¦ * ¦ * ¦ * ¦

¦Непосредственные инструк-¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦

¦ ции 80287 ¦ * ¦ * ¦ * ¦ * ¦ * ¦ * ¦ * ¦ ¦ * ¦

¦Сжатие цепочки переходов ¦ * ¦ ¦ * ¦ * ¦ ¦ * ¦ * ¦ ¦ * ¦

¦Вынесение инвариантного ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦

¦ кода ¦ ¦ ¦ ¦ ¦ ¦ ¦ * ¦ ¦ ¦

¦Удаление переменных ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦

¦ индукции циклов ¦ ¦ ¦ ¦ ¦ ¦ ¦ * ¦ ¦ ¦

¦Удаление циклов ¦ ¦ ¦ ¦ ¦ ¦ ¦ * ¦ ¦ ¦

¦Удал. глуб. подвыражений ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦

¦Разворачивание циклов ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦

¦Слияние циклов ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦

+-------------------------+---+---+---+---+---+---+---+---+---+

¦ 1 - BORLAND Turbo C 1.5, 2 - COMPUTER INNOVATIONS ¦

¦ C86Plus 1.1, 3 - DATALIGHT Optimum-C 3.14, 4 - LATTICE ¦

¦ MS-DOS C 3.2, 5 - MANX Aztec C 4.0, 6 - METAWARE High C ¦

¦ 1.4, 7 - MICROSOFT C 5.0, 8 - MICROSOFT QuickC 1.0, 9 - ¦

¦ WATCOM C 6.0. ¦

¦ * - компилятор применяет этот метод оптимизации. ¦

+-------------------------------------------------------------+

¦ Большинство включенных в обзор компиляторов языка Си ¦

¦ поддерживают простые методы оптимизации, такие как ¦

¦ алгебраические упрощения, и только несколько компиляторов ¦

¦ применяют более сложные формы, такие как удаление общих ¦

¦ подвыражений. ¦

L--------------------------------------------------------------

Borland International.

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

Turbo C разумно управляет прологом и эпилогом функций и использованием регистров, засылая в стек и извлекая только те регистры, которые явно используются внутри тела функции.

Computer Innovation Inc.

Компилятор C86Plus вырабатывает хороший код со средним уровнем оптимизации. Он выполняет базовые приемы оптимизации, такие как свертка констант и размножение копий. Однако он не выполняет размножение констант для удаления лишних сохранений.

Хотя компилятор успешно выполняет алгебраические упрощения, он порождает лишние инструкции из-за того, что размещает результаты в регистрах, вместо того, чтобы помещать их в переменные. Этот эффект проявляется в том, что при размещении переменных в регистрах предпринимаются попытки переразмещения, так как при выполнении нескольких операторов результаты в действительности должны быть присвоены соответствующим переменным.

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

C86Plus - один из нескольких компиляторов рассматриваемого набора, который преобразует инициализацию элементов массива из функции проверки разворачивания циклов в эквивалентную команду STOSW процессора 80x86 с префиксом REP. Однако, что касается разумного уровня оптимизации в других областях, то он не смог решить задачу преобразования цепочки переходов в функции jump_chain_compression в один переход. Он не выполняет существенную оптимизацию циклов.

Datalight Inc.

С появлением Optimum-C Datalight стала одним из первых поставщиков, предложивших оптимизирующий компилятор. Хотя набор тестов не подтвердил наглядно претензии Datalight на глобальную оптимизацию, Optimum-C сработал так хорошо в некоторых фрагментах теста, что он продемонстрировал слабые фрагменты набора, требующие изменений для усовершенствования желаемой проверки. Например, в первой версии функции jump_compression не возвращалось значение, что делало все вычисления и присваивания в функции лишними. Optimum-C выявил это и удалил большую часть кода функции, включая цепочку переходов.


Рекомендуем почитать
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 так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.