"Филипп Н.Хислей. Генерация высококачественного кода для программ, написанных на СИ " - читать интересную книгу автора

|РИСУНОК 1: Выделение общих подвыражений |
+-------------------------------+
|Исходный текст на Си BORLAND LATTICE |
| Turbo C 1.5 MS-DOS C 3.2 |
+-------------------------------+
|if((h3 + k3) " 0 || mov AX,h3 mov AX,h3 |
| (h3 + k3) · 5) add AX,k3 add AX,k3 |
| printf("Common\ jl @18 js L0187 |
| subexpression\ mov AX,h3 cmp AX,5 |
| elimination"); add AX,k3 jle L0193 |
| cmp AX,5 L0187: |
| jle @17 mov AX,01.0000 |
| @18: push AX |
| mov AX,offset s@ call printf |
| push AX add SP,2 |
| call printf L0193: |
| mov SP,BP |
| @17: |
+-------------------------------+
|Многократные вхождения вычислений заменяются значением, |
|которое является результатом единственного вхождения |
|вычисления. Borland Turbo C вычисляет значение выделенного |
|выражения h3+k3 дважды, тогда как LATTICE MS-DOS C и другие |
|применяют выделение общих подвыражений и вычисляют |
|выражение только один раз. |
L-------------------------------
"Снижение мощности" подразумевает замещение операций, которые требуют
большего времени выполнения, более быстрыми. Компилятор может применять
снижение мощности несколькими способами. Например, применяя снижение
мощности к сгенерированному коду, компилятор может подменять операции,
которые умножают или делят целые числа на степени двойки, операциями сдвига.
"Удаление недостижимого кода" - еще один метод оптимизации.
Недостижимый код - это некоторая последовательность инструкций программы,
которая недостижима ни по одному пути в программе. Он может образоваться как
следствие предыдущих операций оптимизации, кода условной отладки, или частых
изменений программы многими программистами. Следующие операторы - это
вариант кода для проверки компилятора на выполнение этого метода
оптимизации.
#define DEBUG 0
if(DEBUG)
printf("Debug Function\n");
Манифестные константы часто могут скрывать существование недостижимого
кода, особенно если такой код определяется внутри включаемого
файла-заголовка.
"Удаление лишних присваиваний" включает нахождение промежутка жизни
переменной и удаление присваиваний этой переменной, если эти присваивания не
могут изменить логику программы. Этот метод освобождает ограниченные
ресурсы, такие как пространство стека или машинные регистры. В следующей
последовательности команд:
a = 5;