Видалення недосяжного коду
У теорії компіляторів ви́даленням недося́жного ко́ду (англ. 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
неможливо виконати, оскільки він недосяжний, і буде повністю видалений під час оптимізації.
Примітки
- Advanced compiler design and implementation — С. 580.
- Engineering a Compiler — С. 544.
- MSDN шаг за шагом. Шаг 3 - С++ комментарии. Процитовано 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.