Koodi, jota ei tavoiteta

Ohjelmointi- ja kääntäjäteoriassa tavoittamaton koodi on osa ohjelmakoodia, jota ei voida missään olosuhteissa suorittaa, koska se ei ole tavoitettavissa ohjausvuokaaviossa [ 1] [2] .

Tavoittelematonta koodia kutsutaan usein yhdeksi kuolleen koodin tyypeistä , tätä terminologiaa käytetään yleensä harkittaessa ohjelmien lähdekoodia [ 3] [4] . Kääntäjäteoriassa nämä käsitteet eivät kuitenkaan liity millään tavalla, kuollut koodi on vain saavutettavissa oleva koodi, joka ei vaikuta ohjelman ulostuloon [ 1] [2] [5] .

Tärkeimmät haitat siitä, että ohjelmassa on tavoittamaton koodi, ovat:

Syyt

Tavoittelemattoman koodin olemassaolo voi johtua useista tekijöistä, kuten:

Viidessä viimeisessä tapauksessa tavoittamaton koodi on vanhaa koodia, toisin sanoen koodia, joka oli kerran hyödyllinen, mutta jota ei enää käytetä.

Esimerkkejä

Harkitse seuraavaa C -esimerkkiä :

int foo ( int x , int y ) { paluu x + y _ int z = x * y ; /* Koodi, jota ei tavoiteta */ }

Toiminto int z = x*yon tavoittamaton koodi, koska proseduuri poistuu ennen sitä (proseduurista palaamisen jälkeiset toiminnot eivät välttämättä ole tavoittamaton koodi, esim. jos returnin jälkeiseen etikettiin viitataan goto -käskyllä ​​).

Analyysi

Saavutettavan koodin löytäminen lähdekoodista voidaan tehdä staattisen koodianalyysin avulla [3] [4] . Optimoivassa kääntäjässä tavoittamattoman koodin poiston optimointi pystyy havaitsemaan ja poistamaan tavoittamattoman koodin , joka löytää tavoittamattomat solmut ohjausvuokaaviosta (CFG) ja poistaa ne [6] . Yksinkertainen CFG-graafin analyysi tavoittamattomiin solmuihin on usein toteutettu kääntäjässä erillisenä funktiona, ns. roskakeräin , jota kutsutaan välittömästi muunnosten jälkeen, jotka voivat muuttaa ohjausvirtauskaaviota [7] .

-väliesitykseen suoritettujen kääntäjien muunnosten , kuten yleisten alilausekkeiden poistooptimointien seurauksena .

Käytännössä toteutettavan analyysin monimutkaisuus vaikuttaa merkittävästi havaittavan tavoittamattoman koodin määrään. Esimerkiksi jatkuvan taittamisen ja yksinkertaisen ohjausvirta - analyysin jälkeen saatat huomata, että ifseuraavan esimerkin käskyn sisällä oleva koodi ei ole tavoitettavissa:

int foo ( tyhjä ) { int n = 2 + 1 ; jos ( n > 4 ) { printf ( "%d" , n ); /* Koodi, jota ei tavoiteta */ } }

Kuitenkin, jotta tunnistettaisiin koodi, jota ei voida saavuttaa seuraavassa esimerkissä, on käytettävä paljon kehittyneempää analyysialgoritmia:

int foo ( tyhjä ) { tupla x = sqrt ( 2 ); jos ( x > 4 ) { printf ( "%lf" , x ); /* Koodi, jota ei tavoiteta */ } }

Yksi käytännöllinen ratkaisu on tehdä ensin yksinkertainen saavuttamaton koodianalyysi ja sitten käsitellä monimutkaisempia tapauksia profiloijalla . Profiloija ei voi todistaa, että koodinpätkä ei ole tavoitettavissa, mutta se voi olla hyvä heuristinen keino löytää epäilyttäviä solmuja, joihin ei todennäköisesti saada yhteyttä. Kun nämä mahdollisesti tavoittamattomat solmut on löydetty, voidaan käyttää jotakin tehokasta tavoittamattoman koodin analyysialgoritmia.

Katso myös

Muistiinpanot

  1. 1 2 Kääntäjän suunnittelu - s. 544.
  2. 1 2 Debray, SK, Evans, W., Muth, R. ja De Sutter , B. 2000. Kääntäjätekniikat koodin pakkaamiseen Arkistoitu 22. toukokuuta 2003 Wayback Machinessa . ACM Trans. ohjelmoida. Lang. Syst. 22, 2 (maaliskuu 2000), 378-415. ( yhteenveto )
  3. 12 Kuolleen koodin havaitseminen ja poistaminen . Aivosto. Haettu 12. heinäkuuta 2012. Arkistoitu alkuperäisestä 5. elokuuta 2012.
  4. 1 2 Vertaa joitakin ilmaisia ​​vaihtoehtoja DCD:hen (Dead Code Detector) (downlink) . java.net Haettu 12. heinäkuuta 2012. Arkistoitu alkuperäisestä 23. syyskuuta 2012. 
  5. Kääntäjät - periaatteet, tekniikat, työkalut - S. 669 ( tavoittamaton koodi ), 713 ( kuollut koodi ).
  6. Kääntäjän suunnittelu - S. 550.
  7. A. Yu. Drozdov, A. M. Stepanenkov. Hallitut optimointipaketit. Teoksessa Tietotekniikka ja laskentajärjestelmät , 2004, nro 3 ( teksti arkistoitu )

Kirjallisuus

  • Cooper ja Torczon. Kääntäjän suunnittelu. - Morgan Kaufmann, 2011. - P. 544-550, 593. - ISBN 978-0-12-088478-0 .
  • Alfred Aho, Monica Lam, Ravi Seti, Jeffrey Ullman. Kääntäjät : periaatteet, tekniikat ja työkalut = kääntäjät: periaatteet, tekniikat ja työkalut. – 2. painos. - M . : "Williams", 2008. - 1184 s. - 1500 kappaletta.  - ISBN 978-5-8459-1349-4 .
  • Muchnick, Steven S. Advanced Compiler Design and Implementation . - Morgan Kaufmann Publishers , 1997. - S.  580-582 . - ISBN 1-55860-320-4 .