Удаление недостижимого кода

В теории компиляторов удалением недостижимого кода (англ. 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. Advanced compiler design and implementation — С. 580.
  2. Engineering a Compiler — С. 544.
  3. MSDN шаг за шагом. Шаг 3 - С++ комментарии.. Дата обращения: 5 июля 2012.

Литература

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.