|
Некоторые компиляторы выполняют оптимизацию, которая состоит в исключении повторяющихся вычислений, однако существуют сильные ограничения на количество топов оптимизирующих операций. Чем больше их число, тем больше компилятор и, следовательно, тем медленнее выполняется компилирование. Программист может облегчить оптимизацию для компилятора, предприняв некоторые действия на уровне входного языка. Так, компилятор, как правило, не устраняет повторяющегося выражения в операторе типа
A = X*Y-f 2.0 + Y*X
Так как порядок переменных отличается, компилятор не может определить, что X *Y— то же самое, что и Y*X. Подобным же образом некоторые компиляторы не могут обнаружить, что 2.00 X— то же самое выражение, что и 2.0 *Х, или что нижеследующий оператор содержит повторяющееся выражение
А = В*В*С*С
Если выполнить перестановку, то повторяемость выражения станет очевидной:
А = (В*С)*(В*С)
Вот другой тип повторяющегося выражения:
А = В — С
D = С — В
Два выражения справа от знака присваивания одинаковы, за исключением знака. Эти примеры показывают, как трудно оптимизирующему компилятору обнаружить все повторяющиеся выражения. Поэтому программисты должны записывать программу так, чтобы исключить, насколько возможно, повторяющиеся выражения.
Другим ограничением на оптимизацию в процессе компилирования является то, что компилятор может оптимизировать только линейные участки программы, т. е. те, которые имеют один вход (первая выполняемая команда) и один выход (последняя выполняемая команда). Так, например, может быть оптимизирована нижеследующая группа операторов:
ПЛ/1:
К = 1/3.0*В; р = 3 + 1/3.0*В; А = В*В + 1/3.0*В;
Операторы, предшествующие этой группе, должны обратиться к первому оператору и выйти после последнего оператора. Однако, если второй оператор имеет метку, компилятор не может продолжать оптимизацию программы, так как не знает, какое влияние окажет переход на второй оператор из другого места программы. Например,
ПЛ/1:
К = 1/3.0*В; LOOP1: Р = 3 + 1/3.0*В;
А = В*В + 1/3.0*В;
Метка LOOP1 мешает оптимизации в процессе компилирования, и только автор программы, который хорошо разбирается в ее логике, знает, можно ли оптимизировать эти три оператора.
Подобная ситуация возникает, если встречается обращение к нестандартной подпрограмме или функции, которое будет мешать оптимизации в процессе компилирования, поскольку компилятор не знает, какие переменные изменяются в подпрограмме.
⇐3.10. Обращения к функциям || Оглавление || 3.12. Исключение циклов⇒
|