Csak az idő-összeállítás magyarázata

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.