Eljárások közötti optimalizálás

Interprocedurális optimalizálás ( eng.  Inter p rocedural O ptimization , IPO ), vagy a programok teljes program optimalizálása ( eng.  whole program optimization ) - olyan fordítóoptimalizálás , amely globális vezérlési folyamatelemzést használ , és számos eljárást érint, még a különböző modulokban találhatókat is. amelyhez jelentős sebességnövekedés érhető el.

Ahogy a programok mérete nőtt, a fejlesztők elkezdték olvashatóbbá és újrafelhasználhatóbbá tenni a kódjukat . Ez gyakran oda vezet, hogy az eljárások rendkívül általánossá válnak, míg egy konkrét programban egy speciális esettel meg lehet boldogulni. Az interprocedurális optimalizálás feladata éppen az ilyen speciális esetek generálása.

Az eljárások közötti optimalizálást a fordító automatikusan elvégzi (néha speciális direktívákkal). Aktiválása jelentősen megnövelheti a fordítási időt. Az optimalizálást végrehajtó fordítók közé tartozik az MLton és az MLKit a Standard ML -hez , a Stalin for Scheme , a a Haskellhez , az Intel C++ Compiler .

Példák

Funkcióparaméter cseréje konstansra

A kódon való átlépés után a fordító gondoskodik arról, hogy az egyik paraméter mindig konstans legyen, és megsemmisíti azt.

Ez volt void DoSomething ( Object * aObj , int aParam ) { if ( aObj == NULL ) throw logic_error ( "aObj==NULL" ); cout << "DoSomething(" << aObj -> name () << "," << aParam << ")" << endl ; } int main () { Objektum obj1 , obj2 ; DoSomething ( & obj1 , 1 ); DoSomething ( & obj2 , 1 ); return 0 ; } lett érvénytelen DoSomething ( objektum * aObj ) { if ( aObj == NULL ) throw logic_error ( "aObj==NULL" ); cout << "DoSomething(" << aObj -> név () << "," << 1 << ")" << endl ; } int main () { Objektum obj1 , obj2 ; DoSomething ( & obj1 ); DoSomething ( & obj2 ); return 0 ; }

Virtuális hívás lecserélése statikusra

A fordító itt gondoskodik arról, hogy minden ténylegesen végrehajtott virtuális hívás ugyanahhoz a függvényhíváshoz vezessen. A virtuális metódustábla elérése helyett a fordító közvetlen függvényhívást hajt végre.

Ugyanebben a példában, ha Object::name() egy virtuális metódus, az optimalizált függvény így fog kinézni.

érvénytelen DoSomething ( objektum * aObj ) { if ( aObj == NULL ) throw logic_error ( "aObj==NULL" ); cout << "DoSomething(" << Objektum :: név ( aObj ) << "," << 1 << ")" << endl ; }

A nem használt kód eltávolítása

A törlés után a következőket kapja:

érvénytelen DoSomething ( objektum * aObj ) { cout << "DoSomething(" << Objektum :: név ( aObj ) << "," << 1 << ")" << endl ; }

Ugyanakkor a virtuális metódustáblák törölhetők .

Inlining

Ha egy függvényt egyszer használunk, akkor az közvetlenül azon a helyen szerepel, ahonnan meghívjuk.

Kis funkciók közvetlenül is beépíthetők a hívókódba.

Sok programozási nyelvben ( Pascal , Java , D ) nincs kulcsszó inline , és a függvény beszúrásáról az optimalizáló dönt ( Java  esetében az obfuszkátor ).

Ez volt inline int DoSomething ( int aParam ) { return aParam * aParam ; } int main () { int x = 2 ; int y = 3 ; cout << x << "^2=" << DoSomething ( x ) << ", " << y << "^2=" << DoSomething ( y ) << endl ; return 0 ; } lett int main () { int x = 2 ; int y = 3 ; cout << x << "^2=" << x * x << ", " << y << "^2=" << y * y << endl ; return 0 ; }

Linkek

  • Thomas C. Spillman, "Exposing side effects in a PL/I optimizing compiler", Proceedings of IFIPS 1971 , North-Holland Publishing Company, 376-381. oldal.
  • Frances E. Allen, "Interprocedural Data Flow Analysis", IFIPS Proceedings, 1974.
  • Frances E. Allen és Jack Schwartz, "Determining the Data Flow Relationships in a Collection of Procedures", IBM Research Report RC 4989, aug. 1974.
  • Philip Abrams , "An APL Machine", Stanford University Computer Science Department, STAN-CS-70-158 jelentés, 1970. február.
  • Terrence C. Miller, "Testative Compilation: A Design for an APL Compiler", Ph.D. Szakdolgozat, Yale Egyetem, 1978.