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

Поделись знанием:
Перейти к: навигация, поиск

В теории компиляторов удалением недостижимого кода (англ. 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. 1 2 Advanced compiler design and implementation — С. 580.
  2. Engineering a Compiler — С. 544.
  3. [www.firststeps.ru/mfc/msdn/r.php?3 MSDN шаг за шагом. Шаг 3 - С++ комментарии.]. Проверено 5 июля 2012. [www.webcitation.org/6B1GNVHF3 Архивировано из первоисточника 28 сентября 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.

Отрывок, характеризующий Удаление недостижимого кода

– Нет, я знаю что.
– Ну знаете, и прекрасно, и подите к ней.
– Соооня! Одно слово! Можно ли так мучить меня и себя из за фантазии? – говорил Николай, взяв ее за руку.
Соня не вырывала у него руки и перестала плакать.
Наташа, не шевелясь и не дыша, блестящими главами смотрела из своей засады. «Что теперь будет»? думала она.
– Соня! Мне весь мир не нужен! Ты одна для меня всё, – говорил Николай. – Я докажу тебе.
– Я не люблю, когда ты так говоришь.
– Ну не буду, ну прости, Соня! – Он притянул ее к себе и поцеловал.
«Ах, как хорошо!» подумала Наташа, и когда Соня с Николаем вышли из комнаты, она пошла за ними и вызвала к себе Бориса.
– Борис, подите сюда, – сказала она с значительным и хитрым видом. – Мне нужно сказать вам одну вещь. Сюда, сюда, – сказала она и привела его в цветочную на то место между кадок, где она была спрятана. Борис, улыбаясь, шел за нею.
– Какая же это одна вещь ? – спросил он.
Она смутилась, оглянулась вокруг себя и, увидев брошенную на кадке свою куклу, взяла ее в руки.
– Поцелуйте куклу, – сказала она.
Борис внимательным, ласковым взглядом смотрел в ее оживленное лицо и ничего не отвечал.
– Не хотите? Ну, так подите сюда, – сказала она и глубже ушла в цветы и бросила куклу. – Ближе, ближе! – шептала она. Она поймала руками офицера за обшлага, и в покрасневшем лице ее видны были торжественность и страх.
– А меня хотите поцеловать? – прошептала она чуть слышно, исподлобья глядя на него, улыбаясь и чуть не плача от волненья.
Борис покраснел.
– Какая вы смешная! – проговорил он, нагибаясь к ней, еще более краснея, но ничего не предпринимая и выжидая.
Она вдруг вскочила на кадку, так что стала выше его, обняла его обеими руками, так что тонкие голые ручки согнулись выше его шеи и, откинув движением головы волосы назад, поцеловала его в самые губы.
Она проскользнула между горшками на другую сторону цветов и, опустив голову, остановилась.
– Наташа, – сказал он, – вы знаете, что я люблю вас, но…
– Вы влюблены в меня? – перебила его Наташа.
– Да, влюблен, но, пожалуйста, не будем делать того, что сейчас… Еще четыре года… Тогда я буду просить вашей руки.
Наташа подумала.
– Тринадцать, четырнадцать, пятнадцать, шестнадцать… – сказала она, считая по тоненьким пальчикам. – Хорошо! Так кончено?
И улыбка радости и успокоения осветила ее оживленное лицо.
– Кончено! – сказал Борис.
– Навсегда? – сказала девочка. – До самой смерти?
И, взяв его под руку, она с счастливым лицом тихо пошла с ним рядом в диванную.


Графиня так устала от визитов, что не велела принимать больше никого, и швейцару приказано было только звать непременно кушать всех, кто будет еще приезжать с поздравлениями. Графине хотелось с глазу на глаз поговорить с другом своего детства, княгиней Анной Михайловной, которую она не видала хорошенько с ее приезда из Петербурга. Анна Михайловна, с своим исплаканным и приятным лицом, подвинулась ближе к креслу графини.