Видалення недосяжного коду

оптимізація компілятора, що видаляє код, який міститься в програмі, але з певних причин ніколи не виконується

У теорії компіляторів ви́даленням недося́жного ко́ду (англ. 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 - С++ комментарии. Архів оригіналу за 31 січня 2022. Процитовано 5 липня 2012.

Література ред.