WikiDer > Индукционная переменная
Эта статья нужны дополнительные цитаты для проверка. (Ноябрь 2018) (Узнайте, как и когда удалить этот шаблон сообщения) |
В Информатика, индукционная переменная это переменная, которая получает повысился либо уменьшается на фиксированную величину на каждой итерации цикла, либо является линейная функция другой индукционной переменной.[1]
Например, в следующем цикле я
и j
- индукционные переменные:
за (я = 0; я < 10; ++я) { j = 17 * я;}
Применение для снижения прочности
Обычный оптимизация компилятора состоит в том, чтобы распознать существование индукционных переменных и заменить их более простыми вычислениями; например, приведенный выше код может быть переписан компилятором следующим образом, исходя из предположения, что добавление константы будет дешевле, чем умножение.
j = -17;за (я = 0; я < 10; ++я) { j = j + 17;}
Эта оптимизация - частный случай снижение силы.
Приложение для снижения давления в регистре
В некоторых случаях можно отменить эту оптимизацию, чтобы полностью удалить индукционную переменную из кода. Например:
внешний int сумма;int фу(int п) { int я, j; j = 5; за (я = 0; я < п; ++я) { j += 2; сумма += j; } возвращаться сумма;}
Цикл этой функции имеет две индукционные переменные: я
и j
. Любой из них можно переписать как линейную функцию другого; поэтому компилятор может оптимизировать этот код, как если бы он был написан
внешний int сумма;int фу(int п) { int я; за (я = 0; я < п; ++я) { сумма += 5 + 2 * (я + 1); } возвращаться сумма;}
Подстановка индукционной переменной
Подстановка индукционной переменной - это преобразование компилятора для распознавания переменных, которые могут быть выражены как функции индексов включающих циклов, и замены их выражениями, включающими индексы цикла.
Это преобразование делает явной связь между переменными и индексами цикла, что помогает другим анализам компилятора, например анализ зависимости.
Пример:
Код ввода:
int c, я;c = 10;за (я = 0; я < 10; я++) { c = c + 5; // c увеличивается на 5 для каждой итерации цикла}
Выходной код
int c, я;c = 10;за (я = 0; я < 10; я++) { c = 10 + 5 * (я + 1); // c явно выражается как функция индекса цикла}
Нелинейные индукционные переменные
Те же оптимизации можно применить к индукционным переменным, которые не обязательно являются линейными функциями счетчика цикла; например, петля
j = 1;за (я = 0; я < 10; ++я) { j = j << 1;}
может быть преобразован в
за (я = 0; я < 10; ++я) { j = 1 << (я+1);}
Смотрите также
Рекомендации
- ^ Стивен Мучник; Muchnick and Associates (15 августа 1997 г.). Расширенная реализация проекта компилятора. Морган Кауфманн. ISBN 978-1-55860-320-2.
индукционная переменная.
дальнейшее чтение
- Ахо, Альфред V .; Сетхи, Рави; Ульман, Джеффри Д. (1986), Компиляторы: принципы, методы и инструменты (2-е изд.), ISBN 978-0-201-10088-4
- Аллен, Фрэнсис Э .; Кок, Джон; Кеннеди, Кен (1981), «Снижение силы оператора», в Munchnik, Steven S .; Джонс, Нил Д. (ред.), Анализ потока программы: теория и приложения, Прентис-Холл, ISBN 978-0-13-729681-1
- Кок, Джон; Кеннеди, Кен (ноябрь 1977 г.), "Алгоритм уменьшения силы оператора", Коммуникации ACM, 20 (11), Дои:10.1145/359863.359888
- Купер, Кит; Симпсон, Тейлор; Вик, Кристофер (1995), Снижение силы оператора (PDF), Университет Райса, получено 22 апреля, 2010