Induktív változó

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2020. május 6-án felülvizsgált verziótól ; az ellenőrzések 2 szerkesztést igényelnek .

Az  induktív változó olyan ciklusokban lévő változó , amelynek egymást követő értékei aritmetikai progressziót alkotnak. A leggyakoribb példa a hurokszámláló. Az induktív változókat gyakran használják a tömb indexkifejezéseiben.

Például a következő példában iés jinduktív változók:

for ( i = 0 ; i < 10 ; i ++ ) { j = 17 * i ; }

A hagyományos optimalizálási módszerek magukban foglalják az induktív változók felismerését és eltávolítását a hurokból.

Alkalmazás a műveletek költségeinek csökkentésére

Az általános optimalizálási elv az induktív változók felismerése és egyszerű számításokkal való helyettesítése. Például a fenti kód módosítható egy optimalizáló fordítóval , azon a feltételezésen alapulva, hogy az állandó összeadás olcsóbb lenne, mint a szorzás:

j = -17 ; for ( i = 0 ; i < 10 ; i ++ ) { j = j + 17_ _ }

Ez az alkalmazás a költségcsökkentési optimalizálás speciális esete .

Alkalmazás a regiszterekre nehezedő nyomás enyhítésére

Egyes esetekben ezt az optimalizálást használhatja az induktív változó teljes eltávolítására a kódból. Például:

extern int összeg ; int foo ( int n ) { int i , j ; j = 5_ _ for ( i = 0 ; i < n ; i ++ ) { j += 2 ; összeg += j ; } visszatérési összeg ; _ }

A függvény ciklusának két induktív változója van: iés j. Az egyik a másik lineáris függvényeként ábrázolható, így a fordító a következőképpen optimalizálhatja ezt a kódot:

extern int összeg ; int foo ( int n ) { int i ; for ( i = 0 ; i < n ; i ++ ) { összeg += ( 5 + 2 * ( i + 1 )); } visszatérési összeg ; _ }

Induktív változó változása

Az induktív változóhelyettesítés olyan transzformáció, amely a ciklusindex függvényében ábrázolható változókat felismeri és a megfelelő kifejezésekkel helyettesíti. Ez az átalakítás explicitté teszi a változók és a ciklusindexek közötti kapcsolatokat, ami segít más fordítóoptimalizálásban. Vegyünk egy példát:

int c , i ; c = 10_ _ for ( i = 0 ; i < 10 ; i ++ ) { c = c + 5 ; // c 5-tel növekszik a ciklus minden iterációjában }

A fent leírt módszernek megfelelően a forráskód következő reprezentációját kapjuk:

int c , i ; c = 10_ _ for ( i = 0 ; i < 10 ; i ++ ) { c = 10 + 5 * ( i + 1 ); // c az index függvénye }

Nemlineáris induktív változók

Ugyanezek az optimalizálások alkalmazhatók olyan induktív változókra is, amelyek nem a hurokszámláló lineáris függvényei. Például a következő kód:

j = 1_ _ for ( i = 0 ; i < 10 ; i ++ ) { j = j << 1 ; }

átalakítható:

for ( i = 0 ; i < 10 ; i ++ ) { j = 1 << i + 1 ; }

Jegyzetek

Irodalom

  • Alfred Aho, Monica Lam, Ravi Seti, Jeffrey Ullman. Fordítók: alapelvek, technikák és eszközök = Compilers : Principles, Techniques, and Tools. — 2. kiadás. - M . : "Williams", 2008. - 1184 p. - 1500 példány.  - ISBN 978-5-8459-1349-4 .
  • Steven S. Muchnick. Fejlett fordítói tervezés és megvalósítás. — 5. kiadás. - San Francisco: Morgan Kaufmann Publishers , 1997. - 856 p. - ISBN 1-55860-320-4 .
  • Kennedy, Ken; & Allen, Randy. Fordítóprogramok optimalizálása modern építészetekhez : Függőség-alapú megközelítés  . - Morgan Kaufmann , 2001. - ISBN 1-55860-286-0 .
  • Allen, Francis E.; Cocke, John & Kennedy, Ken (1981), Kezelői erő csökkentése, Munchnik, Steven S. & Jones, Neil D., Program Flow Analysis: Theory and Applications , Prentice-Hall, ISBN 978-0-13-729681- egy 
  • Cocke, John & Kennedy, Ken (1977. november), Egy algoritmus a kezelői erő csökkentésére, Communications of the ACM , 20. kötet (11) 
  • Cooper, Keith; Simpson, Taylor és Vick, Christopher (1995), Operator Strength Reduction , Rice University , < http://softlib.rice.edu/pub/CRPC-TRs/reports/CRPC-TR95635-S.pdf > . Letöltve: 2010. április 22.