Gyakori részkifejezések eltávolítása

A gyakori részkifejezések eltávolítása ( eng.  Common subexpression elimination vagy CSE) egy olyan fordítóoptimalizálás , amely olyan számításokat keres a programban , amelyeket a szóban forgó szakaszban többször is végrehajtanak, és eltávolítja a második és az azt követő azonos műveleteket, ha lehetséges és hatékony . Ez az optimalizálás adatfolyam-elemzést igényelredundáns számítások megtalálásához, és alkalmazásakor szinte mindig javítja a program végrehajtási idejét [1] .

A probléma általános leírása

Egy programban lévő részkifejezést akkor nevezünk közös részkifejezésnek , ha van még egy ilyen részkifejezés, amely mindig az adott előtt kerül kiértékelésre, és az operandusok nem változnak a kiértékelések között. Például az alábbi példában a b * c kifejezés egy általános részkifejezés.

E definíció alapján a közös részkifejezések eltávolítása olyan transzformáció , amely kiküszöböli a közös részkifejezések ismételt kiértékelését, és helyettesíti azokat az első kiértékelés után tárolt érték használatával. A vizsgált példában azonban lehetetlen a közös részkifejezést azonnal lecserélni az a változó értékére d kiszámításakor, mert ez a változó a szóban forgó számítások között változhat.

Vegye figyelembe a következő kódrészletet:

a = b * c + g ; d = b * c * d_ _

A következő átalakítás vonatkozik rá:

tmp = b * c ; a = tmp + g ; d = tmp * d ;

amely akkor lesz hatásos, ha az új "tmp" változó írásának és többszöri olvasásának teljes ideje kevesebb, mint a "b * c" kifejezés kiértékelésére fordított teljes idő, minden alkalommal, amikor az előfordul a kódban.

Ennek az optimalizálásnak két típusa van:

  • a közös részkifejezések helyi törlése , amely ugyanazon a lineáris régión belül működik ;
  • a közös részkifejezések globális törlése , amely az egész eljáráson belül működik.

Mindkét optimalizálás adatfolyam-elemzésen alapul, melynek során a kifejezés elérhetősége a program minden pontján meghatározásra kerül.

Alapelv

Az optimalizáló alkalmazás az elérhető kifejezések elemzésén alapul . Egy kifejezés x + yelérhető a pprogram egy pontján, ha: [2]

  • pa kezdő csomóponttól a kifejezésig tartó tetszőleges útvonal mentén x + ykiértékelődik a pont eléréséig p;
  • a kifejezések kiértékelése és a pont elérése pközött nincs változás a és a változók xértékeiben y.

Az átalakítás hatékonyságát elsősorban az határozza meg, hogy az új "tmp" változó írásának és több leolvasásának teljes ideje kevesebbnek bizonyul, mint a "b * c" kifejezés kiértékelésére fordított teljes idő, minden alkalommal, amikor az a változóban előfordul. kód. A gyakorlatban számos egyéb tényező is befolyásolja a végső hatékonyságot, különösen a változók regiszterek közötti eloszlása .

Előny

Egyszerű esetekben, mint például a fent tárgyalt esetben, az aritmetikai kifejezések számításainak megkettőzése megszűnik. Ez az optimalizálás a fordító belső reprezentációja szempontjából a legjelentősebb, például tömb indexek számításakor, ahol a kézi optimalizálás nagyon nehéz vagy lehetetlen. Egyes programozási nyelvekben lehetőség van sok azonos számítás elkészítésére. Megjelenhetnek például a C nyelv makrói , amelyek a forráskódban nem ugyanazokat a kifejezéseket alkotják, de miután az előfeldolgozó általi feldolgozás során a makró nevét lecserélték egy programutasítássorozatra, megjelenhetnek ilyenek.

Az optimalizálás globális alkalmazása esetén további kritériumok befolyásolják a hasznot. Például figyelembe kell venni az alapblokkok végrehajtási számlálóit, mivel a kifejezéskiértékelések statikus számának csökkentésével növelhető a dinamikus szám, ami negatívan befolyásolja a programban végrehajtott műveletek számát. Ez oda vezet, hogy a PRE (partial redundancia elimination) osztályhoz kapcsolódó fordított optimalizálás előnyös lehet.

Jegyzetek

  1. Advanced Compiler Design and Implementation, 1997 , p. 377.
  2. Összeállítók: alapelvek, technológiák és eszközök, 2008 , p. 735.

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. - 378-396. — 856 p. - ISBN 1-55860-320-4 .
  • John Cocke . "Globális közös részkifejezés megszüntetése." Proceedings of a Symposium on Compiler Construction , ACM SIGPLAN Notices 5(7), 1970. július, 850-856.
  • Briggs, Preston, Cooper, Keith D. és Simpson, L. Taylor. "Értékszámozás". Software-Practice and Experience , 27(6), 1997. június, 701-724. oldal.