У програмуванні та теорії компіляторів, недося́жним ко́дом називають частину коду програми, яка за жодних умов не може бути виконаною, оскільки є недосяжною в графі потоку управління.
Недосяжний код часто вважають одним із типів мертвого коду, така термінологія зазвичай застосовується при розгляді сирцевого коду програми. Однак у теорії компіляторів, ці поняття ніяк не пов'язані, мертвим кодом там називають тільки досяжний код, який не впливає на (вивід) програми.
Основні недоліки наявності в програмі недосяжного коду:
- займає зайву пам'ять;
- є причиною зайвого кешування інструкцій у кеші інструкцій процесора, яке також знижує локальність даних;
- ускладнює підтримку застосунків — час і сили можуть витрачатися на підтримку і документування частини коду, яка є недосяжною, а отже ніколи не виконується.
Причини виникнення
Існування недосяжного коду обумовлюють різні фактори, наприклад:
- програмні помилки в складних умовних переходах;
- наслідки внутрішніх перетворень; виконуваних оптимізувальним компілятором;
- неповне тестування нової або модифікованої програми, за якого не вдалося виявити недосяжний код;
- виправляючи одну помилку, програміст створив іншу помилку, яка обходить недосяжний код і не була виявлена під час тестування;
- застарілий код, який не був повністю видалений програмістом, оскільки був змішаний з робочим кодом;
- застарілий код, який програміст забув видалити;
- раніше корисний код, який ніколи не буде виконаний, оскільки (введення) даних ніколи не призведе до виконання цього коду;
- застарілий код, який навмисно збережено, але зроблено недосяжним, для того щоб його можна було, за необхідності, знову включити в програму;
- налагоджувальні конструкції і залишкові частини коду, які ще мають бути видалені з програми.
В останніх п'яти випадках, недосяжний код є успадкованим, тобто це код, який раніше був корисним, але зараз не використовується.
Приклад
Розглянемо наступний приклад на мові Сі:
int foo(int x, int y) { return x + y; int z = x*y; /* Недостижимый код */ }
Операція int z = x*y
є недосяжним кодом, оскільки перед нею виконується вихід з процедури (операції, що стоять після повернення з процедури можуть і не бути недосяжним кодом, наприклад, якщо на мітку, розташовану після повернення посилається оператор goto).
Аналіз
Пошук недосяжного коду в сирцевому коді можна провести за допомогою статичного аналізу коду. За використання оптимізувального компілятора, виявити і видалити недосяжний код здатна оптимізація видалення недосяжного коду, яка знаходить у графі потоку керування недосяжні вузли і видаляє їх. Простий аналіз цього графа на наявність недосяжних вузлів часто буває реалізованим у компіляторі у вигляді окремої функції, так званого прибиральника, яка викликається зразу після перетворень, здатних змінювати граф потоку керування.
Код може ставати недосяжним унаслідок виконання компілятором інших перетворень над [en], наприклад оптимізації усунення спільних підвиразів.
На практиці, складність реалізованого аналізу істотно впливає на кількість виявленого недосяжного коду. Наприклад, після [en] і простого аналізу потоку керування можна виявити, що код усередині оператора if
у такому прикладі є недосяжним:
int foo(void) { int n = 2 + 1; if (n > 4) { printf("%d", n); /* Недостижимый код */ } }
Однак, для того щоб виявити недосяжний код у наступному прикладі, слід застосувати значно складніший алгоритм аналізу:
int foo(void) { double x = sqrt(2); if (x > 4) { printf("%lf", x); /* Недостижимый код */ } }
Одним із практичних рішень є підхід, за якого спочатку виконується простий аналіз наявності недосяжного коду, а потім використовується профілювальник для опрацювання складніших випадків. Профілювальник не може довести, що певна ділянка коду є недосяжною, але він може бути гарною евристикою для пошуку підозрілих вузлів, які, ймовірно, є недосяжними. Після виявлення цих потенційно недосяжних вузлів, можна застосувати якийсь потужний алгоритм аналізу недосяжного коду.
Див. також
Примітки
- Engineering a Compiler — С. 544.
- Debray, S. K., Evans, W., Muth, R., and De Sutter, B. 2000. Compiler techniques for code compaction [ 22 травня 2003 у Wayback Machine.]. ACM Trans. Program. Lang. Syst. 22, 2 (Mar. 2000), 378—415. (summary)
- Dead code detection and removal. Aivosto. Архів оригіналу за 5 серпня 2012. Процитовано 12 липня 2012.
- Compares some free alternatives to DCD (Dead Code Detector). Java.net. Архів оригіналу за 23 вересня 2012. Процитовано 12 липня 2012.
- Компиляторы — принципы, технологии, инструменты — С. 669 (недостижимый код), 713 (мёртвый код).
- Engineering a Compiler — С. 550.
- А. Ю. Дроздов, А. М. Степаненков. Управляемые пакеты оптимизаций. В Информационные технологии и вычислительные системы, 2004, № 3 (текст [ 2016-03-04 у Wayback Machine.])
Література
- Cooper and Torczon. Engineering a Compiler. — Morgan Kaufmann, 2011. — С. 544-550, 593. — .
- Альфред Ахо, Моника Лам, Рави Сети, Джеффри Ульман. Компиляторы: принципы, технологии и инструментарий = Compilers: Principles, Techniques, and Tools. — 2-е издание. — М.: «Вильямс», 2008. — 1184 с. — 1500 экз. — ISBN 978-5-8459-1349-4.
- Muchnick, Steven S. Advanced Compiler Design and Implementation. — , 1997. — С. 580-582. — .
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
U programuvanni ta teoriyi kompilyatoriv nedosya zhnim ko dom nazivayut chastinu kodu programi yaka za zhodnih umov ne mozhe buti vikonanoyu oskilki ye nedosyazhnoyu v grafi potoku upravlinnya Nedosyazhnij kod chasto vvazhayut odnim iz tipiv mertvogo kodu taka terminologiya zazvichaj zastosovuyetsya pri rozglyadi sircevogo kodu programi Odnak u teoriyi kompilyatoriv ci ponyattya niyak ne pov yazani mertvim kodom tam nazivayut tilki dosyazhnij kod yakij ne vplivaye na vivid programi Osnovni nedoliki nayavnosti v programi nedosyazhnogo kodu zajmaye zajvu pam yat ye prichinoyu zajvogo keshuvannya instrukcij u keshi instrukcij procesora yake takozh znizhuye lokalnist danih uskladnyuye pidtrimku zastosunkiv chas i sili mozhut vitrachatisya na pidtrimku i dokumentuvannya chastini kodu yaka ye nedosyazhnoyu a otzhe nikoli ne vikonuyetsya Prichini viniknennyaIsnuvannya nedosyazhnogo kodu obumovlyuyut rizni faktori napriklad programni pomilki v skladnih umovnih perehodah naslidki vnutrishnih peretvoren vikonuvanih optimizuvalnim kompilyatorom nepovne testuvannya novoyi abo modifikovanoyi programi za yakogo ne vdalosya viyaviti nedosyazhnij kod vipravlyayuchi odnu pomilku programist stvoriv inshu pomilku yaka obhodit nedosyazhnij kod i ne bula viyavlena pid chas testuvannya zastarilij kod yakij ne buv povnistyu vidalenij programistom oskilki buv zmishanij z robochim kodom zastarilij kod yakij programist zabuv vidaliti ranishe korisnij kod yakij nikoli ne bude vikonanij oskilki vvedennya danih nikoli ne prizvede do vikonannya cogo kodu zastarilij kod yakij navmisno zberezheno ale zrobleno nedosyazhnim dlya togo shob jogo mozhna bulo za neobhidnosti znovu vklyuchiti v programu nalagodzhuvalni konstrukciyi i zalishkovi chastini kodu yaki she mayut buti vidaleni z programi V ostannih p yati vipadkah nedosyazhnij kod ye uspadkovanim tobto ce kod yakij ranishe buv korisnim ale zaraz ne vikoristovuyetsya PrikladRozglyanemo nastupnij priklad na movi Si int foo int x int y return x y int z x y Nedostizhimyj kod Operaciya int z x y ye nedosyazhnim kodom oskilki pered neyu vikonuyetsya vihid z proceduri operaciyi sho stoyat pislya povernennya z proceduri mozhut i ne buti nedosyazhnim kodom napriklad yaksho na mitku roztashovanu pislya povernennya posilayetsya operator goto AnalizPoshuk nedosyazhnogo kodu v sircevomu kodi mozhna provesti za dopomogoyu statichnogo analizu kodu Za vikoristannya optimizuvalnogo kompilyatora viyaviti i vidaliti nedosyazhnij kod zdatna optimizaciya vidalennya nedosyazhnogo kodu yaka znahodit u grafi potoku keruvannya nedosyazhni vuzli i vidalyaye yih Prostij analiz cogo grafa na nayavnist nedosyazhnih vuzliv chasto buvaye realizovanim u kompilyatori u viglyadi okremoyi funkciyi tak zvanogo pribiralnika yaka viklikayetsya zrazu pislya peretvoren zdatnih zminyuvati graf potoku keruvannya Kod mozhe stavati nedosyazhnim unaslidok vikonannya kompilyatorom inshih peretvoren nad en napriklad optimizaciyi usunennya spilnih pidviraziv Na praktici skladnist realizovanogo analizu istotno vplivaye na kilkist viyavlenogo nedosyazhnogo kodu Napriklad pislya en i prostogo analizu potoku keruvannya mozhna viyaviti sho kod useredini operatora if u takomu prikladi ye nedosyazhnim int foo void int n 2 1 if n gt 4 printf d n Nedostizhimyj kod Odnak dlya togo shob viyaviti nedosyazhnij kod u nastupnomu prikladi slid zastosuvati znachno skladnishij algoritm analizu int foo void double x sqrt 2 if x gt 4 printf lf x Nedostizhimyj kod Odnim iz praktichnih rishen ye pidhid za yakogo spochatku vikonuyetsya prostij analiz nayavnosti nedosyazhnogo kodu a potim vikoristovuyetsya profilyuvalnik dlya opracyuvannya skladnishih vipadkiv Profilyuvalnik ne mozhe dovesti sho pevna dilyanka kodu ye nedosyazhnoyu ale vin mozhe buti garnoyu evristikoyu dlya poshuku pidozrilih vuzliv yaki jmovirno ye nedosyazhnimi Pislya viyavlennya cih potencijno nedosyazhnih vuzliv mozhna zastosuvati yakijs potuzhnij algoritm analizu nedosyazhnogo kodu Div takozhMertvij kod Vidalennya mertvogo kodu Vidalennya nedosyazhnogo koduPrimitkiEngineering a Compiler S 544 Debray S K Evans W Muth R and De Sutter B 2000 Compiler techniques for code compaction 22 travnya 2003 u Wayback Machine ACM Trans Program Lang Syst 22 2 Mar 2000 378 415 summary Dead code detection and removal Aivosto Arhiv originalu za 5 serpnya 2012 Procitovano 12 lipnya 2012 Compares some free alternatives to DCD Dead Code Detector Java net Arhiv originalu za 23 veresnya 2012 Procitovano 12 lipnya 2012 Kompilyatory principy tehnologii instrumenty S 669 nedostizhimyj kod 713 myortvyj kod Engineering a Compiler S 550 A Yu Drozdov A M Stepanenkov Upravlyaemye pakety optimizacij V Informacionnye tehnologii i vychislitelnye sistemy 2004 3 tekst 2016 03 04 u Wayback Machine LiteraturaCooper and Torczon Engineering a Compiler Morgan Kaufmann 2011 S 544 550 593 ISBN 978 0 12 088478 0 Alfred Aho Monika Lam Ravi Seti Dzheffri Ulman Kompilyatory principy tehnologii i instrumentarij Compilers Principles Techniques and Tools 2 e izdanie M Vilyams 2008 1184 s 1500 ekz ISBN 978 5 8459 1349 4 Muchnick Steven S Advanced Compiler Design and Implementation 1997 S 580 582 ISBN 1 55860 320 4