Kódgenerálás

A kódgenerálás  a fordítási folyamat része, amikor a fordító egy speciális része , a kódgenerátor egy szintaktikailag helyes programot egy gépen végrehajtható utasítássorozattá alakít át . Ebben az esetben különféle, elsősorban gépfüggő optimalizálás alkalmazható. A kódgenerátor gyakran sok fordító közös része. Mindegyik generál egy köztes kódot, amely a kódgenerátor bemenetére kerül.

Általában egy elemzőfa vagy egy absztrakt szintaxisfa kerül bemenetként a kódgenerátorba . A fa köztes nyelvi utasítások lineáris sorozatává alakul (például háromcímes kóddá).

Az összetett fordítók hajlamosak többszörös áthaladásra a különböző köztes kódformákon. Ezt a többlépcsős folyamatot azért használják, mert sok kódoptimalizáló algoritmust egyszerűbb megvalósítani egyenként, vagy mert egy optimalizálási lépés egy másik lépés eredményétől függ. Ezen túlmenően egy ilyen szervezettel könnyen létrehozható egy fordító, amely több platformra is létrehozza a kódot, mivel elegendő a kódgenerálás utolsó lépését lecserélni ( backend , angol háttér).

A további fordítási lépéseket „kódgenerálásnak” is nevezhetjük, vagy nem, attól függően, hogy az általuk végrehajtott változtatások mennyire lesznek jelentősek. Így a helyi optimalizálás aligha nevezhető "kódgenerálásnak", de maga a kódgenerátor is tartalmazhat egy helyi optimalizálási lépést.

Kódgenerátor feladatok

A fő feladaton túlmenően, hogy a kódot közbülső reprezentációból gépi utasításokká konvertálja, a kódgenerátor általában megpróbálja így vagy úgy optimalizálni a generált kódot. Például használhat gyorsabb utasításokat, kevesebb utasítást, használhat meglévő regisztereket, és megakadályozza a redundáns számításokat.

Néhány feladat, amelyet a komplex kódgenerátorok általában megoldanak:

Az utasítások kiválasztása általában az absztrakt szintaxisfa rekurzív bejárásával történik, amely esetben a fa konfigurációinak részeit összehasonlítják a mintákkal; például egy fa W:=ADD(X,MUL(Y,Z))átalakítható rekurzív sorozatgenerálási utasítások lineáris sorozatává, t1:=Xés t2:=MUL(Y,Z)ezt követheti az utasítás ADD W,t1,t2.

A közbenső nyelvet használó fordítóprogramokban az utasítások kiválasztásának két szakasza lehet - az egyik az elemzési fa konvertálása közbenső kóddá, a második (sokkal később) pedig a köztes kód konvertálása a cél utasításkészletben lévő utasításokká. A második szakasz nem igényel fa bejárást: szekvenciálisan végrehajtható, és általában a köztes nyelvi műveletek egyszerű helyettesítéséből áll a megfelelő műveleti kódokkal. Valójában, ha a fordító valójában egy fordító (például az Eiffelt C - re fordítjuk ), akkor a kódgenerálás második szakasza magában foglalhatja a fa felépítését a lineáris köztes kódból.

Kódgenerálás futás közben

Amikor a program végrehajtása során kódgenerálás történik, mint például a JIT esetében, fontos, hogy a teljes kódgenerálási folyamat hatékony legyen mind az idő, mind a memóriahasználat tekintetében. Például reguláris kifejezések értelmezésekor nagyobb valószínűséggel jönnek létre nem determinisztikus állapotgépek, mint determinisztikusak, mivel gyorsabbak és kevesebb memóriát foglalnak el. Bár általában kevésbé hatékony kódot állít elő, a JIT kódgenerálás lehetővé teszi a csak futásidőben elérhető információk profilozását.

Irodalom