В теории компиляторов удалением недостижимого кода () называется оптимизация, удаляющая недостижимый код, то есть код, который содержится в программе, но по каким-то причинам никогда не исполняетсяAdvanced compiler design and implementation — С. 580.. В графе потока управления программы этот код содержится в узлах, недостижимых из начального узлаEngineering a Compiler — С. 544.. Само преобразование напрямую не влияет на скорость исполнения программы, ведь удаляемые инструкции всё равно никогда не исполняются и не занимают процессорного времени; но оно оказывает косвенный положительный эффект, снижая давление на кэш инструкций и расширяя возможности последующих оптимизаций, работающих с графом потока управления.

Примеры Рассмотрим следующий пример на языке Си: 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;

Распространённой практикой в отладке программ является временное отключение части кода. Обычно это делается с помощью комментирования этого участка кода (что часто бывает затруднительно, из-за наличия в программе других комментариев) или директив препроцессора (в 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 не может выполнится, так как является недостижимым, и будет полностью удалён оптимизацией.

См. также Недостижимый код Мёртвый код Удаление мёртвого кода Оптимизирующий компилятор

Примечания

Литература

Категория:Оптимизации компилятора