Генерация высококачественного кода для программ на СИ
ОГЛАВЛЕНИЕ
Самое последнее направление в развитии компиляторов Си - оптимизация. Это
можно продемонстрировать такими сегодняшними заявлениями поставщиков
компиляторов: "Наиболее мощный оптимизирующий компилятор!" (Turbo C,
Borland); "Новые методы оптимизации генерируют самый быстрый код!" (C 5.0,
Microsoft); "Оптимизатор неутомимо ищет пути ускорения выполнения и
минимизации используемой памяти" (Optimum C, Datalight). Учитывая эту
моду, PC Tech Journal разработал тест для проверки возможностей
оптимизации кода у Си компиляторов, имеющихся на PC. Этот тест был
выполнен на девяти компиляторах: Borland Turbo C 1.5, Computer Innovations
C86Plus 1.10, Datalight Optimum-C 3.14, Lattice MS-DOS C 3.2, Manx Aztec
C86 4.0, Metaware High C 1.4, Microsoft C 5.0 и QuickC 1.0, а также WATCOM
C 6.0. Эти изделия представляют лучшие компиляторы Си, доступные на PC.
Проверка показала, что различные компиляторы применяют различные приемы
оптимизации с различным успехом. Доступны и другие компиляторы, но их
характеристики значительно хуже, чем у перечисленных. Большинство этих
компиляторов описаны в февральском номере PC Tech Journal 1988 года в
статье "The State of C" (см. "C Contenders" и "Turbo and Quick Weigh In",
Marty Franz, стр. 52 и 72 соответственно).
Поскольку современные компиляторы Си близки по предоставляемым
возможностям, оптимизация остается одним важным отличием, по которому их
можно дифференцировать. Работа компилятора заключается в том, чтобы
странслировать процедурное описание задачи и эффективно отобразить его в
выделенное множество машинных команд целевого процессора. Степень
эффективности генерации компилятором машинно-уровневого кода может иметь
существенное влияние на скорость выполнения программы и ее размер.
Основная цель оптимизации - выработка более быстрого и меньшего по размеру
кода. В обычной среде компьютера, где количество доступной оперативной
памяти есть ограниченный ресурс, разделяемый несколькими пользователями,
важна оптимизация размера кода. В среде PC оптимизация скорости имеет
более высокий приоритет, поскольку PC обычно используется одним лицом и
доступен большой объем памяти (большинство PC имеют по крайней мере 640KB
основной памяти и многие имеют несколько мегабайт дополнительной или
расширенной памяти). Следовательно, лучший способ оценки возможностей
оптимизации кода компилятора Си, предназначенного для PC, - оценка
скорости.
Тщательный анализ задачи и чистая программная реализация обеспечивают
прочную основу для любых последующих усовершенствований, которые могут
быть внесены оптимизирующим компилятором. Нельзя ожидать, что оптимизация
кода компенсирует программам плохо организованную структуру задачи или
выбор неподходящего алгоритма. Например, существующая технология
оптимизации никак не сможет автоматически подставить алгоритм быстрой
сортировки вместо записанного алгоритма пузырьковой сортировки, хотя,
возможно, будет получена программа, работающая быстрее. К тому же,
программисты могут просто влиять на некоторые способы оптимизации кода,
такие как вычисление константных выражений, вынесение инвариантов циклов и
совмещение циклов.