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 .
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 ; }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 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 .
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 ; }