Az éppen időben történő összeállítás az értelmezett programok teljesítményének javítására szolgáló módszer. A végrehajtás során a program natív kódba fordítható a teljesítmény javítása érdekében. Dinamikus összeállításnak is nevezik.
A dinamikus fordításnak van néhány előnye a statikus fordítással szemben. Java vagy C # alkalmazások futtatásakor a futásidejű környezet képes futtatni az alkalmazást. Ez lehetővé teszi az optimalizált kód előállítását. Ha az alkalmazás viselkedése megváltozik futása közben, a futásidejű környezet újrafordíthatja a kódot.
Néhány hátrány közé tartozik az indítási késedelem és a futás közbeni fordítás költségei. Az általános költségek korlátozása érdekében sok JIT-fordító csak a gyakran használt kódútvonalakat állítja össze.
Áttekintés
Hagyományosan két módszer létezik a forráskód konvertálására egy platformon futtatható formává. A statikus fordítás a kódot egy adott platform nyelvére konvertálja. Egy tolmács közvetlenül végrehajtja a forráskódot.
A JIT összeállítása megpróbálja kihasználni mindkettő előnyeit. Amíg az értelmezett program fut, a JIT fordító meghatározza a leggyakrabban használt kódot és gépi kódra fordítja. A fordítótól függően ez megtehető egy metóduson vagy egy kisebb kódrészen.
A dinamikus összeállítást először J. McCarthy írta le 1960-ban a LISP-nél.
A Just In Time Compilation, a JIT vagy a dinamikus fordítás olyan összeállítás, amelyet egy program végrehajtása során végeznek. Jelentés futási időben, szemben a végrehajtás előtt. Mi történik, az a fordítás gépi kódra. A JIT előnyei abból fakadnak, hogy mivel az összeállítás futási időben zajlik, a JIT fordító hozzáfér a dinamikus futásidejű információkhoz, amelyek lehetővé teszik számára jobb optimalizálást (például beillesztési funkciókat).
A JIT-fordításban fontos megérteni, hogy a byte-kódot a futó gép gépkód-utasításaiba fordítja. Ez azt jelenti, hogy az eredményül kapott gépkód a futó gép CPU-architektúrájára van optimalizálva.
Néhány példa a JIT fordítókra: JVM (Java virtuális gép) a Java-ban és CLR (Common Language Runtime), C # nyelven.
Történelem
Kezdetben egy fordító volt felelős azért, hogy egy magas szintű (az összeszerelőnél magasabb szintként definiált) nyelvet objektumkódokká (gépi utasításokká) alakítson, amelyet aztán (egy összekötő segítségével) futtathatóvá alakítanak.
A nyelvek fejlődésének egy pontján a fordítók egy magas szintű nyelvet álkódokká állítanának össze, amelyet aztán (tolmács) tolmácsolna a program futtatásához. Ez kiküszöbölte az objektumkódot és a futtatható fájlokat, és lehetővé tette ezeknek a nyelveknek a hordozhatóságát több operációs rendszer és hardver platform számára. Pascal (amely P-Code-ra fordult) az elsők között volt; A Java és a C # újabb példák. Végül a P-Code kifejezést bájtkódra cserélték, mivel az álműveletek többsége bájt hosszú.
A Just-In-Time (JIT) fordító a futási idejű tolmács jellemzője, hogy ahelyett, hogy a metódusokat minden alkalommal meghívnák, a bájtkódot értelmezi, a bájtkódot a futó gép gépkód-utasításaiba fordítja, majd ezt meghívja objektumkód helyett. Ideális esetben az objektumkód futtatásának hatékonysága kiküszöböli a program minden fordításának újrafordításának hatékonyságát.
Tipikus forgatókönyv
A forráskód teljesen átalakul gépi kódgá
JIT forgatókönyv
A forráskód konvertálási nyelvre, például struktúrára lesz konvertálva [ex IL (köztes nyelv) C # esetén, ByteCode java esetén].
A köztes kód csak akkor konvertálódik gépi nyelvre, ha az alkalmazásnak szüksége van a szükséges kódokra, és csak akkor konvertálódik gépi kódra.
JIT vs Non-JIT összehasonlítás
A JIT-ben nem minden kód konvertálódik gépi kódgá, először a szükséges kód egy része konvertálódik gépi kódgá, majd ha egy meghívott módszer vagy funkció nincs a gépben, akkor ez gépi kóddá alakul, ami csökkenti a terhelést a CPU. Mivel a gépi kód futás közben jön létre, a JIT fordító olyan gépi kódot állít elő, amely a gép processzor-architektúrájának optimalizálására szolgál.
Néhány példa a JIT-re:
- Java: JVM (Java virtuális gép)
- C #: CLR (Common Language Runtime)
- Android: DVM (Dalvik Virtual Machine) vagy ART (Android RunTime) újabb verziókban
A Java virtuális gép (JVM) bájtkódot hajt végre, és megőrzi a függvény végrehajtásának hányadik számát. Ha ez a szám meghaladja az előre meghatározott határt, a JIT gépi nyelvre fordítja a kódot, amelyet a processzor közvetlenül végrehajthat (ellentétben azzal a normál esettel, amelyben a javac bytecóddá, majd Java-ba fordítja a kódot, az értelmező ezt a bytecode-ot soronként értelmezi, gépi kódot és végrehajtja).
A következő alkalommal, amikor ezt a függvényt kiszámoljuk, ugyanaz a fordított kód kerül végrehajtásra, ellentétben a normál értelmezéssel, amelyben a kódot ismételten értelmezzük soronként. Ez gyorsabbá teszi a végrehajtást.