Lihtsalt ajas kompileerimine selgitatud

Just-in-time kompileerimine on meetod tõlgendatud programmide jõudluse parandamiseks. Käivitamise ajal võib programmi jõudluse parandamiseks kompileerida algkoodiks. Seda tuntakse ka kui dünaamilist kompileerimist.

Dünaamilisel kompileerimisel on staatilise kompileerimise ees mõningaid eeliseid. Java- või C # -rakenduste käitamisel saab käituskeskkond rakendust selle käitamise ajal profileerida. See võimaldab luua optimeerituma koodi. Kui rakenduse käitumine selle töötamise ajal muutub, võib käituskeskkond koodi uuesti kompileerida.

Mõned puudused hõlmavad käivitamise viivitusi ja kompileerimise üldkulusid käitamise ajal. Üldkulude piiramiseks koostavad paljud JIT-kompilaatorid ainult sageli kasutatavad kooditeed.

Ülevaade

Traditsiooniliselt on lähtekoodi teisendamiseks platvormil käitatavaks vormiks kaks meetodit. Staatiline kompileerimine teisendab koodi konkreetse platvormi keeleks. Tõlk täidab otse lähtekoodi.

Ühise uurimisrühma koostamisel püütakse kasutada mõlema eeliseid. Tõlgendatud programmi käitamise ajal määrab JIT kompilaator kõige sagedamini kasutatava koodi ja kompileerib selle masinkoodiks. Sõltuvalt kompilaatorist saab seda teha meetodil või väiksemal koodilõigul.

Dünaamilist kompileerimist kirjeldas J. McCarthy esmakordselt LISP-is 1960. aastal.

Just In Time Compilation, JIT ehk dünaamiline tõlge on kompileerimine, mida tehakse programmi käivitamise ajal. Tähendus jooksmise ajal, erinevalt enne hukkamist. Mis juhtub, on tõlkimine masinakoodi. Ühise uurimisrühma eelised tulenevad asjaolust, et kuna kompileerimine toimub tööajal, on JIT-kompilaatoril juurdepääs dünaamilisele käitusaja teabele, mis võimaldab tal paremaid optimeerimisi teha (näiteks funktsioonide lisamine).

JIT-i kompileerimisel on oluline mõista seda, et see kompileerib baitkoodi töötava masina masinkoodi juhisteks. See tähendab, et saadud masinakood on optimeeritud töötava masina protsessori arhitektuuri jaoks.

Mõned näited JIT-koostajatest on JVM (Java Virtual Machine) Java-s ja CLR (Common Language Runtime), C # -ga.

Ajalugu

Alguses oli koostaja ülesandeks muuta kõrgetasemeline keel (määratletud kui kõrgem tase kui assembler) objektikoodiks (masinjuhised), mis seejärel lingiti (linkeri abil) käivitatavaks.

Keelte evolutsiooni ühel hetkel kompileerivad kompilaatorid kõrgetasemelise keele pseudokoodiks, mida seejärel tõlgib (tõlk) teie programmi käivitamiseks. See välistas objektikoodi ja käivitatavad failid ning võimaldas neid keeli teisaldada mitmesse opsüsteemi ja riistvara platvormi. Pascal (mis kompileeriti P-koodiks) oli üks esimesi; Java ja C # on uuemad näited. Lõpuks asendati termin P-kood baitkoodiga, kuna enamik pseudotoiminguid on baidipikkused.

Just-in-time (JIT) kompilaator on jooksuaja interpretaatori funktsioon, mis selle asemel, et iga meetodi kasutamisel baitkoodi tõlgendada, kompileerib baidikoodi töötava masina masinkoodi juhistesse ja kutsub seejärel selle selle asemel objekti kood. Ideaalis ületab objekti koodi käitamise tõhusus programmi iga kord uuesti kompileerimise ebaefektiivsus.

Tüüpiline stsenaarium

Lähtekood teisendatakse täielikult masinakoodiks

JITi stsenaarium

Lähtekood teisendatakse montaažikeeleks nagu struktuur [C # jaoks ex IL (vahe keel), Java jaoks ByteCode]

Vahekood teisendatakse masinakeeleks ainult siis, kui rakendus vajab vajalikke koode teisendatakse ainult masinakoodiks.

JIT vs mitte-JIT võrdlus

JIT-is ei muundata kogu koodi masinakoodiks. Esiteks muudetakse vajalik osa koodist masinakoodiks, siis kui meetodit või funktsionaalsust pole masinas, muudetakse see masinakoodiks, mis vähendab koormust protsessori. Kuna masinakood genereeritakse tööajal, toodab JIT kompilaator masinakoodi, mis on optimeeritud masina protsessori käitamiseks.

Mõned ühise uurimisrühma näited on:

  • Java: JVM (Java virtuaalne masin)
  • C #: CLR (ühise keele käitamine)
  • Android: DVM (Dalvik Virtual Machine) või ART (Android RunTime) uuemates versioonides

Java virtuaalne masin (JVM) käivitab baitkoodi ja arvestab funktsiooni täitmise arvu. Kui see arv ületab ettemääratud piiri, kompileerib JIT koodi masinakeeleks, mille protsessor saab otse käivitada (erinevalt tavalisest juhtumist, kus javac kompileerib koodi baitkoodiks ja seejärel Java-ks, tõlgendab tõlk selle baidikoodi rea kaupa teisendades selle masinakood ja täidab).

Ka järgmine kord, kui see funktsioon arvutatakse, käivitatakse sama kompileeritud kood uuesti, erinevalt tavapärasest tõlgendusest, kus koodi tõlgendatakse uuesti rea kaupa. See muudab täitmise kiiremaks.