- Удаление недостижимого кода
-
В теории компиляторов удалением недостижимого кода (англ. unreachable code elimination) называется оптимизация, удаляющая недостижимый код, то есть код, который содержится в программе, но по каким-то причинам, никогда не исполняется[1]. В графе потока управления программы, этот код содержится в узлах, недостижимых из начального узла[2]. Само преобразование, напрямую, не влияет на скорость исполнения программы, ведь удаляемые инструкции всё равно никогда не исполняются и не занимают процессорного времени; но оно оказывает косвенный положительный эффект, снижая давление на кэш инструкций и расширяя возможности последующих оптимизаций, работающих с графом потока управления[1].
Содержание
Примеры
Рассмотрим следующий пример на языке Си:
int foo(int a) { int b; b = a << 2; return b; b = 47; /* Недостижимый код */ return 0; }
В данном примере операция присваивания
b = 47
и последующий выход из процедуры являются недостижимым кодом, так как оно происходит после безусловного возврата из процедуры. После после того как оптимизация удалит указанные операции получим:int foo(int a) { int b; b = a << 2; return b; }
Распространённой практикой в отладке программ является временное отключение части кода[3]. Обычно это делается с помощью комментирования этого участка кода (что часто бывает затруднительно, из-за наличия в программе других комментариев) или директив препроцессора (в C/C++ это директивы
#if 0
...#endif
). Использование удаления недостижимого кода может служить альтернативой выключения кода с помощью препроцессора. Рассмотрим следующий пример на языке Java:public static int Sample() { int a = 5; int b = 6; int c; c = a + b; if(false) { /* DEBUG */ System.out.format("%d", c); } return c; }
Код внутри оператора
if
не может выполнится, так как является недостижимым, и будет полностью удалён оптимизацией.Алгоритмы
Применение
См. также
Примечания
- ↑ 1 2 Advanced compiler design and implementation — С. 580.
- ↑ Engineering a Compiler — С. 544.
- ↑ MSDN шаг за шагом. Шаг 3 - С++ комментарии.. Архивировано из первоисточника 28 сентября 2012. Проверено 5 июля 2012.
Литература
- Cooper and Torczon Engineering a Compiler. — Morgan Kaufmann, 2011. — С. 550, 593. — ISBN 978-0-12-088478-0
- Ахо, Альфред В.; Сети, Рави; Ульман, Джеффри Д. Компиляторы — принципы, технологии, инструменты. — Вильямс, 2003. — С. 568-613, 669. — ISBN 5-8459-0189-8
- Muchnick, Steven S. Advanced Compiler Design and Implementation. — Morgan Kaufmann Publishers, 1997. — С. 580-582. — ISBN 1-55860-320-4
Ссылки
Категория:- Оптимизации
Wikimedia Foundation. 2010.