Fordítás / értelmezés folyamata

A Programozás Wiki wikiből

A fordítás ill. értelmezés gyakran több allépésből álló műveletek, amelyek a következő jól elkülöníthető, de egymással szorosan együttműködő egységekre bonthatók:

  • előfeldolgozás (preprocessing) - az előfeldolgozóra építő nyelvekben ez végzi a szövegszintű makrók, beszúrások (inserts, includes) kifejtését, előállítva az értelmezendő forráskód teljes, de továbbra is teljesen nyers, szöveges változatát
  • lexikai elemzés, tokenizálás (tokenization) - ebben a lépésben a beépített és fenntartott utasítások, kulcsszavak, a konstans kifejezések, valamint a műveleti, sorhatároló és egyéb speciális jelek, jelsorozatok kerülnek kódolásra egy később könnyen és egyértelműen azonosítható bináris formára. a művelet végén előálló közetes adatfolyam a forráskód gyakorlatilag egy "zanzásított", a nyelv szempontjából lényegtelen formai információitól (mint pl. ún. "whitespace"-ek, fizikai sortagolás, stb.) általában megfosztott változata, amelyből azonban továbbra is rekonstruálható az eredeti forráskód gyakorlatilag információvesztés nélkül, uniform módon
  • szintaktikai elemzés (syntax analysis) - e folyamat során az értelmező vagy a fordítóprogram ellenőrzi, hogy az - immár egyszerűen feldolgozható, értelmezhető - szimbólumok, kulcsszavak és más nyelvi kifejezések a nyelv szabályainak megfelelően lettek -e összeállítva a forráskódban, azaz, hogy pl. minden zárójel, utasításblokk, be van -e zárva, minden operátor között vannak operandusok, a nyelvi szerkezetek minden eleme jelen van -e. ha utóbbi feltétel nem teljesül, a fordító hibaüzenet - vagy nem egyértelmű, de értelmezhető helyzetben figyelmeztetést - küldhet erről. a műveletsor hiba nélküli végrehajtása után a további rutinok egy garantáltan a nyelv szabályait követő, tehát erősen megbízható adatsorral dolgozhatnak tovább
  • környezet- ill. érvényességi kör elemzés (scope analysis) - ez a lépés csak a különböző lexikai szkópegységeket, érvényességi köröket megkülönböztető nyelvek esetében van jelen, és a program kódjában szereplő azonosítók teljes értékűvé kifejtését végzi, ami lehetővé teszi a későbbi lépésekben az ugyanolyan nevű globális vagy lokális, ill. különböző modulokben, egységekben elhelyezkedő azonosítók megkülönböztetését a feldolgozás során
  • típuselemzés (type analysis) - ennek során az értelmező ellenőrzi azt, hogy az utasítások paraméterei és a műveletek operandusai megfelelnek -e a nyelv szabályainak és a program által megengedettnek. ebben a lépésben kerülnek azonosításra és egyértelműsítésre az ún. túltöltött (overloaded) operátorok és függvényhívások is, azaz itt dönti el az értelmező ill. a fordító, hogy az esetleg rendelkezésre álló több azonos nevű, de eltérő típusú paraméterekkel hívható, ill. az azonos módon jelölt, de több típuson vagy típus között is végrehajtható műveletek közül konkrétan melyik is kerüljön végrehajtásra az adott művelet ill. függvényhívás részeként (pl. több nyelvben is "+" operátor jelöli az összeadást és a sztringek összefűzését is, amelyek nyilván teljesen eltérő műveletek; hasonló módon eltérő kódot kell végrehajtani egész és tört formátumban tárolt számok közötti szorzási, osztási, stb. műveletek elvégzése során)
  • kódgenerálás ill. végrehajtás (code generation / execution) - ebben a lépésben a megelőző szakaszok nyomán egyszerűen feldolgozhatóvá és egyértelművé tett műveletsort az értelmező végrehajtja ill. a fordító ez alapján tárgykódot készít belőle

A felsorolásban az előfeldolgozás kakukktojás abban az értelemben, hogy azt általában egy a további fordítási ill. értelmezési folyamatoktól teljesen különálló rutinhalmaz ill. program végzi, amely maga is alkalmaz egy bizonyos fajta lexikai ill. szintaktikai elemzést. Ugyanakkor az ezekre használt feldolgozó rutinok jóval egyszerűbbek, mint azok amiket majdan a tényleges feldolgozás során az értelmező ill. a fordító alkalmaz, és mindössze a makrók, beszúrások és más előfeldolgozási szerkezetek azonosítására alkalmasak a forráskódon belül.