Fordító tervezés-kód optimalizálás

hirdetések

az optimalizálás egy olyan programátalakítási technika, amely megpróbálja javítani a kódot azáltal, hogy kevesebb erőforrást (azaz CPU-t, memóriát) fogyaszt, és nagy sebességet biztosít.

az optimalizálás során a magas szintű általános programozási konstrukciókat nagyon hatékony alacsony szintű programozási kódok váltják fel. A kódoptimalizálási folyamatnak az alábbi három szabályt kell követnie:

  • a kimeneti kód semmilyen módon nem változtathatja meg a program jelentését.

  • az optimalizálásnak növelnie kell a program sebességét, és ha lehetséges, a programnak kevesebb erőforrást kell igényelnie.

  • az optimalizálásnak gyorsnak kell lennie, és nem késleltetheti a teljes fordítási folyamatot.

az optimalizált kód érdekében a folyamat összeállításának különböző szintjein lehet erőfeszítéseket tenni.

  • kezdetben a felhasználók megváltoztathatják/átrendezhetik a kódot, vagy jobb algoritmusokat használhatnak a kód megírásához.

  • a köztes kód generálása után a fordító módosíthatja a köztes kódot címszámításokkal és a hurkok javításával.

  • a cél gépi kód előállítása során a fordító felhasználhatja a memória hierarchiáját és a CPU regisztereket.

az optimalizálás két típusba sorolható : gépfüggetlen és gépfüggő.

gépfüggetlen optimalizálás

ebben az optimalizálásban a fordító felveszi a köztes kódot, és átalakítja a kód egy részét, amely nem tartalmaz CPU regisztereket és/vagy abszolút memóriahelyeket. Például:

do{ item = 10; value = value + item; } while(value

This code involves repeated assignment of the identifier item, which if we put this way:

Item = 10;do{ value = value + item; } while(value

should not only save the CPU cycles, but can be used on any processor.

Machine-dependent Optimization

Machine-dependent optimization is done after the target code has been generated and when the code is transformed according to the target machine architecture. It involves CPU registers and may have absolute memory references rather than relative references. Machine-dependent optimizers put efforts to take maximum advantage of memory hierarchy.

Basic Blocks

Source codes generally have a number of instructions, which are always executed in sequence and are considered as the basic blocks of the code. These basic blocks do not have any jump statements among them, i.e., when the first instruction is executed, all the instructions in the same basic block will be executed in their sequence of appearance without losing the flow control of the program.

A program can have various constructs as basic blocks, like IF-THEN-ELSE, SWITCH-CASE conditional statements and loops such as DO-WHILE, FOR, and REPEAT-UNTIL, etc.

Basic block identification

We may use the following algorithm to find the basic blocks in a program:

  • keresés fejléc nyilatkozatok az összes alapvető blokkok, ahonnan egy alap blokk kezdődik:

    • a program első nyilatkozata.
    • bármely ág célpontja (feltételes/feltétel nélküli).
    • bármely águtasítást követő utasítások.
  • a fejléc és az azt követő utasítások egy alapblokkot alkotnak.

  • az alapblokk nem tartalmaz semmilyen más alapblokk fejléc-utasítását.

az alapblokkok mind a kódgenerálás, mind az optimalizálás szempontjából fontos fogalmak.

alapblokkok

az alapblokkok fontos szerepet játszanak a változók azonosításában, amelyeket egynél többször használnak egyetlen alapblokkban. Ha bármelyik változót többször használják, akkor a változóhoz rendelt regisztermemóriát nem kell kiüríteni, hacsak a blokk nem fejezi be a végrehajtást.

Control Flow Graph

EGY program Alapblokkjai a control flow Graph segítségével ábrázolhatók. A vezérlési folyamat grafikon azt mutatja be, hogy a programvezérlés hogyan kerül átadásra a blokkok között. Ez egy hasznos eszköz, amely segít az optimalizálásban azáltal, hogy segít megtalálni a nem kívánt hurkokat a programban.

ellenőrzési folyamatábra

hurok optimalizálás

a legtöbb program hurokként fut a rendszerben. Szükségessé válik a hurkok optimalizálása A CPU ciklusok és a memória mentése érdekében. A hurkok a következő technikákkal optimalizálhatók:

  • invariáns kód: a hurokban található kódrészletet, amely minden iterációnál ugyanazt az értéket számítja ki, hurok-invariáns kódnak nevezzük. Ez a kód áthelyezhető a hurokból úgy, hogy csak egyszer menti el, nem pedig minden egyes iterációval.

  • indukciós elemzés: egy változót akkor nevezünk indukciós változónak, ha értékét a hurokon belül egy hurok-invariáns érték változtatja meg.

  • erő csökkentése: vannak olyan kifejezések, amelyek több CPU-ciklust, időt és memóriát fogyasztanak. Ezeket a kifejezéseket olcsóbb kifejezésekkel kell helyettesíteni anélkül, hogy veszélyeztetnék a kifejezés kimenetét. Például a szorzás (x * 2) drága a CPU ciklusok szempontjából, mint (x

Holt-kód megszüntetése

Holt kód egy vagy több kód utasítás, amelyek:

  • vagy soha nem hajtják végre, vagy elérhetetlen,
  • vagy ha végrehajtják, a kimenetet soha nem használják.

így a Holt kód nem játszik szerepet semmilyen programműveletben, ezért egyszerűen kiküszöbölhető.

részlegesen halott kód

vannak olyan kódutasítások, amelyek számított értékeit csak bizonyos körülmények között használják, azaz néha az értékeket használják, néha nem. Az ilyen kódokat részben Holt kódnak nevezik.

részlegesen halott Kód

a fenti vezérlési folyamat grafikon egy olyan programdarabot ábrázol, ahol az ‘a’ változót az ‘x * y’kifejezés kimenetének hozzárendelésére használják. Tegyük fel, hogy az ‘a’ – hoz rendelt érték soha nem kerül felhasználásra a hurokban.Közvetlenül azután, hogy a vezérlő elhagyja a hurkot, az ‘a’ A ‘Z’ változó értékét kapja, amelyet később a programban használnak. Itt arra a következtetésre jutunk, hogy az ‘a’ hozzárendelési kódot soha nem használják sehol, ezért kizárható.

Holt Kód

Hasonlóképpen, a fenti kép azt ábrázolja, hogy a feltételes állítás mindig hamis, ami azt jelenti, hogy a valódi esetben írt kód soha nem kerül végrehajtásra, ezért eltávolítható.

részleges redundancia

a redundáns kifejezések párhuzamos útvonalon többször kerülnek kiszámításra, az operandusok változása nélkül.míg a részleges redundáns kifejezéseket többször számítják ki egy útvonalon, az operandusok változása nélkül. Például,

redundáns kifejezés

részben redundáns kifejezés

a hurok-invariáns kód részben redundáns, és kódmozgatási technikával kiküszöbölhető.

egy másik példa a részben redundáns kód lehet:

If (condition){ a = y OP z;}else{ ...}c = y OP z;

feltételezzük, hogy az operandusok (y és z) értékei nem változnak az a változó hozzárendeléséből c változóba. A kódmozgás felhasználható ennek a redundanciának a kiküszöbölésére, az alábbiak szerint:

If (condition){ ... tmp = y OP z; a = tmp; ...}else{ ... tmp = y OP z;}c = tmp;

itt, hogy a feltétel igaz vagy hamis; y OP z csak egyszer kell kiszámítani.

reklámok

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.