Tar bort död kod

I kompilatorteorin är eliminering av död kod ( DCE ) en optimering som tar bort död kod .  Död kod (även värdelös kod ) är en kod vars exekvering inte påverkar programmets utdata , alla resultat av beräkningen av en sådan kod är döda variabler , det vill säga variabler vars värden inte används senare i program [1] [2] .

I samband med den befintliga oklarheten i termen död kod [3] [4] är det viktigt att notera att optimering av borttagning av död kod inte handlar om borttagning av oåtkomlig kod . Lokalisering och borttagning av oåtkomlig kod kan hanteras av sopsamlaren [5] eller andra optimeringar, såsom borttagning av oåtkomlig kod [2] .

Att ta bort värdelös kod kan påskynda programmet genom att minska antalet operationer som utförs i det och minska storleken på programmet eller mellanliggande representation .

Exempel

Tänk på följande C -kod :

int foo ( void ) { int a = 24 ; int b ; b = a + 3 ; /* onödig kod */ returnera en << 2 ; }

I det här exemplet är additionsoperationen b = a + 3död kod, eftersom variabeln binte används i ytterligare beräkningar och är död från denna punkt till slutet av proceduren. Efter att ha tagit bort den här instruktionen får vi:

int foo ( void ) { int a = 24 ; int b ; /* Död variabel */ returnera en << 2 ; }

Efter att ha tagit bort additionsoperationen blir variabeln bdöd under hela proceduren. Eftersom det deklareras lokalt kan det tas bort helt från programmet:

int foo ( void ) { int a = 24 ; returnera en << 2 ; }

Även om utvärderingen sker inuti en funktion, skrivs dess resultat till en variabel som endast ligger inom den funktionen; och med tanke på att funktionen ovillkorligen returnerar talet 96, kan den förenklas genom att optimera konstant utbredning så att dess kropp endast består av operationen return 96. Och sedan kan kompilatorn ersätta alla anrop till den funktionen med returvärdet.

Algoritmer

Den klassiska DCE ( "Dead" )-algoritmen fungerar på SSA-representationen och består av två förbikopplingar: den första förbikopplingen ( "Mark" ) markerar (markerar) alla uppenbarligen aktiva operationer (exitoperationer för procedurer, input-outputoperationer som ändrar globala variabler) ; det andra svepet ( "Sweep" ) börjar med liveoperationer och går upp argumentdefinitionerna, markerar alla operationer i dess väg som live, slutar med de operationer som inte har några föregångare i SSA-form [6] . Den maximala beräkningskomplexiteten för en sådan algoritm beror på storleken på programmet som O(n 2 ) [7] .

DCE kanske inte utför någon oberoende analys, utan använder helt enkelt resultaten av analysen av aktiva variabler [8] , men beräkningskomplexiteten för en sådan analys är O(n 3 ) i värsta fall [7] . Det finns specifika algoritmer som handlar om att ta bort tomma noder i en CFG-graf , kombinera flera grundläggande block till ett, etc. För en sådan analys behövs en inbyggd kontrollflödesgraf [9] .

Algoritmen "Döda" publicerades först i artikeln "Static Single Assignment Form and the Program Dependence Graph" i ACM TOPLAS 1991 [10] . Algoritmen "Clean " som fungerar med en CFG-graf utvecklades och implementerades av Rob Schiller 1992 [11] .

Applikation

Borttagning av död kod kan tillämpas flera gånger under kompileringsprocessen, eftersom död kod finns i programmet inte bara för att den finns i källkoden - vissa andra transformationer kan göra koden död. Till exempel förvandlar kopieringsförökningsoptimeringar och konstantförökningsoptimeringar ofta instruktioner till värdelös kod [1] [12] . Du måste också ta bort död kod skapad av andra transformationer i kompilatorn [12] . Till exempel ersätter den klassiska algoritmen för att minska styrkan på en operation arbetsintensiva operationer med mindre arbetsintensiva, varefter borttagningen av den döda koden eliminerar de gamla operationerna och fullbordar transformationen (utan att komplicera algoritmen för att minska styrkan ) [13] .

Intressanta fakta

  • I november 2010 släppte Microsoft en ny version av Internet Explorer 9 Platform Preview 7, som överträffade alla andra webbläsare i hastigheten att tolka JavaScriptSunSpiders benchmark . I den officiella Internet Explorer -bloggen uppgav ledaren för projektet, Dean J. Hachamovitch, att en av innovationerna med utgåvan är användningen av optimering för borttagning av död kod, på grund av vilket detta resultat uppnåddes. Det stod dock snart klart att mindre ändringar i benchmark-källkoden orsakade en betydande nedgång i prestanda för Internet Explorer 9, vilket inte hände när man testade Google Chrome eller Opera . Som ett resultat anklagades Internet Explorer-utvecklare för att "justera" produkten till ett specifikt riktmärke [14] [15] .

Se även

Anteckningar

  1. 1 2 Kompilatorer - principer, teknologier, verktyg - S. 713, 714.
  2. 1 2 Konstruera en kompilator - s. 544.
  3. Detektering och borttagning av död kod . Aivosto. Hämtad 14 juli 2012. Arkiverad från originalet 5 augusti 2012. ( blandning av begreppen döda och oåtkomliga koder )
  4. Kompilatorer - principer, teknologier, verktyg - S. 669 ( oåtkomlig kod ), 713 ( död kod ).
  5. A.Yu. Drozdov, A.M. Stepanenkov. Hanterade optimeringspaket. In Information Technology and Computing Systems , 2004, nr 3 ( arkiverad 4 mars 2016 på Wayback Machine )
  6. Konstruera en kompilator - s. 544-546.
  7. 1 2 Jan Olaf Blech, Lars Gesellensetter, Sabine Glesner . Formell verifiering av eliminering av död kod i Isabelle/HOL. IEEE Computer Society Press , september 2005 ( text arkiverad 7 mars 2016 på Wayback Machine ).
  8. Avancerad kompilatordesign och implementering - S. 443.
  9. Konstruera en kompilator - s. 547-550.
  10. Ron Cytron, Jeanne Ferrante, Barry Rosen och Ken Zadeck . Effektiv beräkning av statisk enkeltilldelningsformulär och programberoendegrafen. ACM TOPLAS 13(4), 1991 ( text Arkiverad 24 september 2011 på Wayback Machine ).
  11. Konstruera en kompilator - S. 593.
  12. 1 2 Avancerad kompilatordesign och implementering - S. 13, 327, 603.
  13. Frances Allen, John Cocke och Ken Kennedy . Minskad operatörsstyrka. I Program Flow Analysis: Theory & Application , Muchnick och Jones, Prentice-Hall, 1981.
  14. Webbläsardebatt: Fuskade Microsoft? . The H. Hämtad 12 juni 2012. Arkiverad från originalet 25 juni 2012.
  15. Lögner, förbannade lögner och riktmärken: fuskar IE9 på SunSpider? . Ars Technica. Hämtad 3 december 2017. Arkiverad från originalet 25 juni 2012.

Litteratur

Länkar