Just in Time Compilation Explained

Just-in-time kompilering er en metode til forbedring af ydeevnen for fortolkede programmer. Under udførelsen kan programmet kompileres i native kode for at forbedre dets ydeevne. Det er også kendt som dynamisk kompilering.

Dynamisk kompilering har nogle fordele i forhold til statisk kompilering. Når du kører Java- eller C # -applikationer, kan runtime-miljøet profilere applikationen, mens den køres. Dette giver mulighed for at generere mere optimeret kode. Hvis programmets opførsel ændres, mens det kører, kan runtime-miljøet kompilere koden igen.

Nogle af ulemperne inkluderer opstartsforsinkelser og omkostningerne ved kompilering under løbetid. For at begrænse omkostningerne kompilerer mange JIT-kompilatorer kun de kodestier, der ofte bruges.

Oversigt

Traditionelt er der to metoder til konvertering af kildekode til en form, der kan køres på en platform. Statisk kompilering konverterer koden til et sprog til en bestemt platform. En tolk udfører direkte kildekoden.

JIT-kompilering forsøger at bruge fordelene ved begge dele. Mens det fortolkede program køres, bestemmer JIT-kompilatoren den mest anvendte kode og kompilerer den til maskinkode. Afhængigt af kompilatoren kan dette gøres på en metode eller mindre sektion af kode.

Dynamisk kompilering blev først beskrevet i et papir af J. McCarthy om LISP i 1960.

Just In Time Compilation, JIT eller Dynamic Translation, er kompilering, der udføres under udførelsen af ​​et program. Betydning på kørselstid i modsætning til før udførelse. Hvad der sker er oversættelsen til maskinkode. Fordelene ved en JIT skyldes, at da kompilering finder sted i løbetid, har en JIT-kompilator adgang til dynamisk runtime-information, der gør det muligt at foretage bedre optimeringer (såsom inline-funktioner).

Hvad der er vigtigt at forstå om JIT-kompilering er, at det vil kompilere bytecode i maskinkodeinstruktioner for den kørende maskine. Det betyder, at den resulterende maskinkode er optimeret til den kørende maskins CPU-arkitektur.

Nogle eksempler på JIT Compilers er JVM (Java Virtual Machine) i Java og CLR (Common Language Runtime), i C #.

Historie

I starten var en kompilator ansvarlig for at omdanne et sprog på højt niveau (defineret som højere niveau end samler) til objektkode (maskineinstruktioner), som derefter ville blive linket (af en linker) til en eksekverbar.

På et tidspunkt i sprogudviklingen ville kompilatorer sammensætte et sprog på højt niveau til pseudokode, som derefter ville blive fortolket (af en tolk) for at køre dit program. Dette eliminerede objektkoden og eksekverbare filer og tillod disse sprog at være bærbare til flere operativsystemer og hardwareplatforme. Pascal (som udarbejdet til P-kode) var en af ​​de første; Java og C # er nyere eksempler. Til sidst blev udtrykket P-kode erstattet med bytecode, da de fleste af pseudo-operationerne er en byte lang.

En Just-In-Time (JIT) -compiler er et træk ved kørselstolken, der i stedet for at fortolke bytecode hver gang en metode påberåbes, vil kompilere bytecode i maskinens kodeinstruktioner på den kørende maskine og derefter påberåbe sig denne objektkode i stedet. Ideelt set vil effektiviteten ved at køre objektkode overvinde ineffektiviteten ved at genkompilere programmet hver gang det kører.

Typisk scenario

Kildekoden konverteres fuldstændigt til maskinkode

JIT-scenarie

Kildekoden konverteres til samlingssprog som struktur [for ex IL (mellem sprog) for C #, ByteCode for java].

Den mellemliggende kode konverteres kun til maskinsprog, når applikationen har brug for de krævede koder konverteres kun til maskinkode.

JIT vs ikke-JIT sammenligning

I JIT konverteres ikke al kode til maskinkode først en del af den nødvendige kode konverteres til maskinkode, så hvis en kaldet metode eller funktionalitet ikke findes i maskinen, bliver den omdannet til maskinkode, hvilket reducerer belastningen på CPU'en. Da maskinkoden genereres i løbetid, producerer JIT-kompilatoren maskinkode, der er optimeret til at køre maskinens CPU-arkitektur.

Nogle eksempler på JIT er:

  • Java: JVM (Java Virtual Machine)
  • C #: CLR (almindelig sprogkørsel)
  • Android: DVM (Dalvik Virtual Machine) eller ART (Android RunTime) i nyere versioner

Java Virtual Machine (JVM) udfører bytecode og opretholder en optælling af hvor mange tid en funktion udføres. Hvis dette antal overstiger en foruddefineret grænse, samler JIT koden til maskinsprog, som direkte kan udføres af processoren (i modsætning til det normale tilfælde, hvor javac kompilerer koden til bytekode og derefter Java, fortolker tolken denne bytekode linje for linje konverterer den til maskinkode og udfører).

Også næste gang denne funktion beregnes, udføres den samme kompilerede kode igen i modsætning til normal fortolkning, hvor koden fortolkes igen linje for linje. Dette gør udførelsen hurtigere.