Halott kód eltávolítása

A fordítóelméletben a holt kód elimináció ( DCE ) egy olyan optimalizálás , amely eltávolítja a holt kódot .  Holt kód (egyben haszontalan kód ) olyan kód, amelynek végrehajtása nem befolyásolja a program kimenetét , az ilyen kód kiszámításának minden eredménye holt változó , azaz olyan változó, amelynek értékeit később nem használjuk fel a programban. program [1] [2] .

A holt kód [3] [4] kifejezés meglévő többértelműsége kapcsán fontos megjegyezni, hogy a holt kód eltávolításának optimalizálása nem foglalkozik az elérhetetlen kód eltávolításával . Az elérhetetlen kódok lokalizálása és eltávolítása megoldható a szemétgyűjtővel [5] vagy más optimalizálással, például az elérhetetlen kód eltávolításával [2] .

A haszontalan kód eltávolítása felgyorsíthatja a programot azáltal, hogy csökkenti a benne végrehajtott műveletek számát, és csökkenti a program vagy a köztes reprezentáció méretét .

Példák

Vegye figyelembe a következő C kódot :

int foo ( üres ) { int a = 24 ; int b ; b = a + 3 ; /* Haszontalan kód */ return a << 2 ; }

Ebben a példában az összeadási művelet b = a + 3holt kód, mivel a változót bnem használjuk fel további számításokban, és ettől a ponttól az eljárás végéig halott. Az utasítás eltávolítása után a következőket kapjuk:

int foo ( üres ) { int a = 24 ; int b ; /* Halott változó */ return a << 2 ; }

Az összeadási művelet eltávolítása után a változó ba teljes eljárásban halottá válik. Mivel helyileg van deklarálva , teljesen eltávolítható a programból:

int foo ( üres ) { int a = 24 ; return a << 2 ; }

Annak ellenére, hogy a kiértékelés egy függvényen belül történik, az eredmény egy olyan változóba kerül, amely csak az adott függvény hatókörébe tartozik ; és mivel a függvény feltétel nélkül a 96-os számot adja vissza, leegyszerűsíthető az állandó terjedés optimalizálásával úgy, hogy törzse csak a műveletből álljon return 96. Ezután a fordító lecserélheti a függvény összes hívását a visszatérési értékre.

Algoritmusok

A klasszikus DCE ( "Dead" ) algoritmus az SSA-reprezentáción dolgozik, és két bypassból áll: az első bypass ( "Mark" ) minden nyilvánvalóan élő műveletet (eljáráskilépési műveletek, globális változókat megváltoztató bemeneti-kimeneti műveletek) megjelöl (megjelöl) ; a második sweep ( "Sweep" ) élő műveletekkel kezdődik, és feljebb lép az argumentumdefiníciók között, és az útvonalában lévő összes műveletet élőként jelöli meg, és azokkal a műveletekkel végződik, amelyeknek nincs elődje SSA formában [6] . Egy ilyen algoritmus maximális számítási bonyolultsága a program méretétől függ, mint O(n 2 ) [7] .

A DCE nem végezhet független elemzést, hanem egyszerűen felhasználja az aktív változók elemzésének eredményeit [8] , de egy ilyen elemzés számítási bonyolultsága a legrosszabb esetben O(n 3 ) [7] . Vannak speciális algoritmusok, amelyek az üres csomópontok eltávolításával foglalkoznak egy CFG gráfban , több alapvető blokk egyesítésével stb. Egy ilyen elemzéshez egy beépített vezérlőfolyamat gráfra van szükség [9] .

A "Dead" algoritmust először a "Static Single Assignment Form and the Program Dependence Graph" című cikkben publikálták az ACM TOPLAS -ban 1991-ben [10] . A CFG gráfokkal működő " Clean " algoritmust Rob Schiller fejlesztette ki és implementálta 1992 - ben [ 11 ] .

Alkalmazás

A holt kód eltávolítása többször is végrehajtható a fordítási folyamat során, mivel a holt kód nem csak azért van a programban, mert a forráskód tartalmazza – bizonyos más átalakítások a kódot holttá tehetik. Például a másolásterjedés optimalizálás és az állandó terjedés optimalizálás gyakran használhatatlan kóddá változtatja az utasításokat [1] [12] . Ezenkívül el kell távolítania a fordító egyéb átalakításai által létrehozott halott kódot [12] . Például egy művelet erősségének csökkentésére szolgáló klasszikus algoritmus a munkaigényes műveleteket kevésbé munkaigényesekre cseréli, ami után a halott kód eltávolítása megszünteti a régi műveleteket és befejezi az átalakítást (anélkül, hogy bonyolítaná az erősség csökkentésére szolgáló algoritmust ) [13] .

Érdekes tények

  • 2010 novemberében a Microsoft kiadta az Internet Explorer 9 Platform Preview 7 új verzióját, amely a SunSpider benchmark alapján minden más böngészőt felülmúlt a JavaScript értelmezésének sebességében . Az Internet Explorer hivatalos blogjában a projekt vezetője, Dean J. Hachamovitch úgy nyilatkozott, hogy a kiadás egyik újítása a holtkód-eltávolító optimalizálás alkalmazása, aminek köszönhetően ez az eredmény meg is született. Hamar kiderült azonban, hogy a benchmark forráskód kisebb változtatásai jelentős visszaesést okoztak az Internet Explorer 9 teljesítményében, ami a Google Chrome vagy az Opera tesztelésekor nem történt meg . Ennek eredményeként az Internet Explorer fejlesztőit azzal vádolták, hogy a terméket egy meghatározott referenciaértékre "hangolták" [14] [15] .

Lásd még

Jegyzetek

  1. 1 2 Fordítók - alapelvek, technológiák, eszközök - S. 713, 714.
  2. 1 2 Fordítóprogram tervezése – 544. o.
  3. Holt kód észlelése és eltávolítása . Aivosto. Letöltve: 2012. július 14. Az eredetiből archiválva : 2012. augusztus 5.. ( a holt és az elérhetetlen kódok fogalmának keverése )
  4. Fordítók - alapelvek, technológiák, eszközök - S. 669 ( elérhetetlen kód ), 713 ( holt kód ).
  5. A. Yu. Drozdov, A. M. Sztyepanenkov. Felügyelt optimalizálási csomagok. In Information Technology and Computing Systems , 2004, No. 3 ( archiválva : 2016. március 4. a Wayback Machine -nél )
  6. Fordítóprogram tervezése – 544-546.
  7. ↑ Január 1 2. Olaf Blech, Lars Gesellensetter, Sabine Glesner . A holt kód megszüntetésének formális ellenőrzése az Isabelle/HOL-ban. IEEE Computer Society Press , 2005. szeptember ( a szöveg archiválva 2016. március 7-én a Wayback Machine -nél ).
  8. Fejlett fordítói tervezés és megvalósítás - 443. o.
  9. Fordítóprogram tervezése – 547-550.
  10. Ron Cytron, Jeanne Ferrante, Barry Rosen és Ken Zadeck . A statikus egyszeri hozzárendelési űrlap és a programfüggőségi grafikon hatékony kiszámítása. ACM TOPLAS 13(4), 1991 ( szöveg archiválva 2011. szeptember 24-én a Wayback Machine -nél ).
  11. Fordítóprogram tervezése – S. 593.
  12. 1 2 Fejlett fordítói tervezés és megvalósítás - S. 13, 327, 603.
  13. Frances Allen, John Cocke és Ken Kennedy . A kezelői erő csökkentése. In Program Flow Analysis: Theory & Application , Muchnick és Jones, Prentice-Hall, 1981.
  14. Böngészővel kapcsolatos vita: csalt a Microsoft? . The H. Letöltve: 2012. június 12. Az eredetiből archiválva : 2012. június 25..
  15. Hazugságok, átkozott hazugságok és mércék: csal az IE9 a SunSpidernél? . Ars Technica. Letöltve: 2017. december 3. Az eredetiből archiválva : 2012. június 25.

Irodalom

Linkek