Чтение онлайн

на главную

Жанры

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

Хислей Филипп Н.

Шрифт:

В тесте размножения констант и копий 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).

Простой пример цикла в коде теста демонстрирует степень оптимизации циклов, выполняемой Microsoft C 5.0 (см. рис. 3). Компилятор применяет снижение мощности и полностью удаляет константное умножение, выявляет конечное состояние переменных j5 и k5, и помещает в регистры все переменные внутри цикла.

Другой хороший пример оптимизации циклов этим компилятором отражен в функции unnecessary_loop. C 5.0 удаляет цикл for и генерирует код только с целью установки конечного состояния переменной - индекса цикла и оператора, включенного в цикл. Компилятор также хорошо использует регистры.

Внимание фирмы Microsoft к оптимизации вознаграждается при работе теста выполнения. Он выполняется за время, которое является лучшим или близко к лучшему по каждой категории.

Microsoft QuickC.

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

Популярные книги

Сердце Дракона. Том 20. Часть 1

Клеванский Кирилл Сергеевич
20. Сердце дракона
Фантастика:
фэнтези
боевая фантастика
городское фэнтези
5.00
рейтинг книги
Сердце Дракона. Том 20. Часть 1

Рота Его Величества

Дроздов Анатолий Федорович
Новые герои
Фантастика:
боевая фантастика
8.55
рейтинг книги
Рота Его Величества

Седьмая жена короля

Шёпот Светлана
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Седьмая жена короля

Шериф

Астахов Евгений Евгеньевич
2. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
6.25
рейтинг книги
Шериф

Волк 4: Лихие 90-е

Киров Никита
4. Волков
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Волк 4: Лихие 90-е

Жандарм 2

Семин Никита
2. Жандарм
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Жандарм 2

Аномальный наследник. Пенталогия

Тарс Элиан
Аномальный наследник
Фантастика:
фэнтези
6.70
рейтинг книги
Аномальный наследник. Пенталогия

Все зависит от нас

Конюшевский Владислав Николаевич
2. Попытка возврата
Фантастика:
альтернативная история
9.24
рейтинг книги
Все зависит от нас

Черный Маг Императора 8

Герда Александр
8. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 8

Ретроградный меркурий

Рам Янка
4. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Ретроградный меркурий

Лорд Системы 3

Токсик Саша
3. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Лорд Системы 3

Вперед в прошлое 2

Ратманов Денис
2. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 2

Бальмануг. (Не) Любовница 2

Лашина Полина
4. Мир Десяти
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Бальмануг. (Не) Любовница 2

Магия чистых душ 2

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.56
рейтинг книги
Магия чистых душ 2