Futásidejű fordítás
A futásidejű fordítás vagy röpfordítás (angolul just-in-time compilation, azaz JIT), a bájtkód-fordított rendszerek teljesítményének növelésére szolgáló technika. A bájtkódot futási időben fordítja natív kódra. A futásidejű fordításhoz két korábbi futtató környezet adta az ötletet: a bájtkódfordítás (bytecode compilation) és a dinamikus fordítás (dynamic compilation).
Egy bájtkódfordított rendszerben (ilyen a Java, a .NET nyelvek, Perl, a GNU CLISP) a forráskódot egy köztes kódba fordítják, amit bájtkódnak neveznek. A bájtkód nem gépi kód egy adott processzorra, így hordozható a különböző számítógép-architektúrák között. A bájtkódot aztán értelmezik vagy egy virtuális gépen futtatják.
A dinamikus fordítókörnyezetben a fordító futás közben végzi feladatát. Például a legtöbb Common Lisp rendszer rendelkezik egy compile
függvénnyel, ami képes a futás közben keletkezett új függvények lefordítására. Az előnye az interaktív hibakeresés, viszont ez az előny kész rendszerek esetén nem túl hasznos.
Egy JIT környezetben a bájtkódra fordítás az első lépés, azaz a forráskód hordozható és optimalizálható köztes reprezentációra alakítása. A bájtkódot telepítik a célrendszerre. A kód végrehajtása során a futtatókörnyezet fordítója fordítja azt natív gépi kódra. Ezt meg lehet fájl vagy függvény alapon tenni: a függvényeket csak végrehajtáskor szükséges lefordítani, (innen jön a „just-in-time”, éppen időben kifejezés).
A cél a natív- és a bájtkódfordítás előnyeinek egyesítése. Az eredeti forráskód feldolgozása és az alapvető optimalizálás fordítási időben történik, jóval a futtatás előtt – a bájtkódról gépi kódra történő fordítás jóval gyorsabb, mint forráskódról. A keletkezett bájtkód hordozható, nem úgy, mint az architektúrához kötött gépi kód. A bájtkódról gépi kódra fordítók megírása is egyszerűbb, mivel a bájtkódfordító elvégzi a munka nehezét.
Történelem
[szerkesztés]A dinamikus fordítás úttörője egy kereskedelmi Smalltalk-implementáció volt a 80-as évek elején, ami ma VisualWorks néven ismert.
A Sun HotSpot Java virtuális gép implementációja a sikeres JIT-implementáció egy példája.[1] Két részből áll:
- Egy „kliens” fordító, ami gyors fordítási sebességet biztosít a rövid életű alkalmazások számára,
- Egy „szerver” fordítót, ami erősen optimalizált kódot állít elő hosszú életű alkalmazások számára.
A felhasználó választhat a dinamikus fordítók közül az adott alkalmazás sajátosságainak megfelelően.
A Microsoft is egy JIT-alapú rendszert választott a .NET-környezet számára, valamint a Crusoe processzor is hasonló módszert használ hardver szinten. A Parrot virtuális gép is JIT-et használ. A Psyco egy Python JIT-fordító.
Kapcsolódó szócikkek
[szerkesztés]- HotSpot
- Java bájtkód
- Common Language Runtime
- Crusoe, egy mikroprocesszor, amely kifejezetten just-in-time fordítást hajt végre az x86 kódból mikrokódba a mikroprocesszoron belül
- LLVM