Использование оптимизирующего компилятора (Методические указания и задания на лабораторную работу № 1)

Страницы работы

Фрагмент текста работы

Лабораторная работа №1

Использование оптимизирующего компилятора

Оптимизирующий компилятор

Компилятор

Компилятор – это программа, которая преобразует текст на одном языке в текст на другом языке. Например, компилятор языка Си переводит программу на языке Си в коды процессора, которые затем могут быть непосредственно исполнены. Существует множество различных компиляторов языков С/С++. Некоторые из них приведены в следующей таблице:

Windows

UNIX

Название

Команда

Название

Команда

Microsoft C/C++ Optimizing Compiler в составе Visual Studio

cl.exe

GNU C/C++ Compiler

gcc

Intel C/C++ Compiler

icl.exe

Intel C/C++ Compiler

icc

Borland C++ в составе Borland C++ Builder

bcc32.exe

Compaq C Compiler

Compaq C++ Compiler

ccc

cxx

Исполняемый код, который компилятор должен сгенерировать, зависит от программной архитектуры процессора. Программная архитектура – это «язык» процессора, который определяется его набором команд и регистров. Некоторые компиляторы могут создавать код для большого числа различных архитектур (GNU C/C++ Compiler), некоторые предназначены только для конкретной архитектуры (Intel C/C++ Compiler для архитектур IA-32 и IA-64, Compaq C Compiler для архитектуры Alpha).

Компилятору не нужен сложный интерфейс, поэтому большинство компиляторов представляют собой консольное приложение, которое управляются с помощью параметров командной строки. Даже если среда разработки программ имеет мощный редактор (как, например, MS Visual C++ или Borland C++), сам компилятор является отдельной программой, которая автоматически вызывается из редактора. В следующей таблице представлены некоторые ключи компилятора C/C++ в составе Microsoft Visual Studio 6.0:

Ключ

Описание

/Fefilename

Создать исполняемый файл с именем filename.exe

/FA

Сгенерировать ассемблерный код программы

/Od

Не использовать оптимизацию (по умолчанию)

/O2

Оптимизировать код по скорости исполнения

Оптимизация кода

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

1) размер кода программы,

2) время исполнения программы.

Результатом оптимизации является более эффективный код (т.е. более быстрый или меньший по объему), дающий при выполнении такой же результат. Наиболее важным критерием обычно считается время исполнения программы (память можно еще докупить, а вот время купить сложнее).

Современные компиляторы обладают большими возможностями по оптимизации генерируемого кода и настройки его на конкретные архитектуры процессоров. Пользователь может влиять на применение компилятором различных оптимизационных техник с помощью опций компилятора. Оптимизирующие компиляторы обычно имеют большое число специальных опций, влияющих на использование конкретных оптимизационных техник. Оптимизационная техника (прием) – это такое преобразование кода программы, которое приводит к улучшению некоторых его свойств (уменьшение размера, уменьшение времени исполнения). Примеры оптимизационных техник:

  • планирование размещения переменных на регистрах процессора,
  • изменение порядка инструкций в коде программы,
  • замена долгих инструкций на более быстрые,
  • устранение избыточного кода,
  • оптимизация циклов и условных переходов,
  • использование команд предвыборки данных,
  • использование специальных расширений архитектуры,

Настройка на архитектуру процессора

Компилятор по умолчанию производит код, который может исполняться на процессорах, относящихся к нескольким поколениям или версиям реализации некоторой базовой архитектуры. Достигается это ограничением используемого множества команд и регистров процессора ресурсами самого старого представителя семейства, и все архитектурные нововведения следующих поколений не используются. Например, программа, сгенерированная для выполнения на процессоре 80386, сможет выполняться на всех последующих процессорах архитектуры x86, в частности, на всех Pentium-ах. Понятно, что программа, оптимизированная для работы на конкретном процессоре, использующая все предоставляемые им вычислительные возможности, будут работать быстрее, чем некоторая общая версия. Поэтому, если известно, на процессоре какой именно архитектуры будет выполняться код, можно требовать от компилятора соответствующей оптимизации.

Ниже представлен пример команды компиляции программы prog.c компилятором от Microsoft с использованием с оптимизацией по скорости исполнения и учетом архитектуры процессора Pentium:

     cl.exe /O2 /G5 prog.c

Результат компиляции – исполняемый файл prog.exe, который может выполняться только на процессорах архитектуры x86 не младше Pentium. Например, попытка исполнения этой программы на процессоре 80486 может оказаться неудачной, т.к. в коде может оказаться такая команда, которой еще не было в этом процессоре.

Похожие материалы

Информация о работе