Just-In-Time (JIT) compiler: hvad det er, og hvordan det virker i programmering

Programmering er ikke bare at skrive kode i en editor. Det er hele processen fra vi forbereder projektet, skriver pseudokoden og konverterer den til kode, til vi kompilerer og fejlretter den og verificerer, at den faktisk kører korrekt. Alle disse trin er vigtige i et projekt. Men en af ​​dem, som vi mindst ved, hvordan de fungerer, og de forskellige typer, der findes, er den sidste, kompileringen. Og det er det, vi skal lære i dag.

Hvad er kompilering?

Just-In-Time (JIT) compiler

Medmindre vi programmerer i binært eller i et meget meget lavt sprog, såsom assembler, forstår maskiner ikke de kodelinjer, vi skriver. Og jo højere sprog vi bruger, jo mere naturligt vil det være for os, men jo mere komplekst vil det være for maskinen. Og det er derfor, at vi skal konvertere vores højniveausprog til maskinsprog kompiler koden .

At kompilere koden er den proces, hvorved vi konverterer vores kodelinjer på højt niveau til maskinsprog. For at gøre dette er det nødvendigt på den ene side at have en almindelig tekstfil med al koden, og på den anden side et program, compiler , som er ansvarlig for at konvertere hver af kodelinjerne til binær eller til det tilsvarende sprog på lavt niveau.

Esquema compiler programa

Takket være brugen af ​​disse compilere er programmeringen meget enkel, og den samme kode kan med nogle justeringer bruges på flere forskellige typer maskiner. Også fordi disse programmer er optimeret til at arbejde på specifikke arkitekturer, har de en tendens til at tilbyde god samlet ydeevne. Dog ikke alle fordele. Et kompileret program vil kun virke på den maskine, som compileren er designet til, for eksempel en x64 CPU or ARM processor. Det er også nødvendigt at kompilere det samme program flere gange afhængigt af operativsystemerne (Windows, macOS, Linux, Android, iOSosv.), hvor vi skal køre det.

Forskelle med tolken

tolke er skabt netop for at løse de to problemer, som vi lige har set i compilere. Disse er programmer, der kører mellem vores originale kode og vores maskine og er ansvarlige for at fortolke hver af instruktionerne afhængigt af maskinen eller operativsystemet, hvor vi udfører den.

Disse fortolkere er placeret på samme sted, hvor kompilatorerne ville begynde at oversætte koden. Dermed eliminerer de alle operativsystem- eller platformsbegrænsninger, idet de er i stand til at bruge den samme kode til alt.

Vi kan selvfølgelig ikke tro, at en tolk er perfekt. Den første ting at huske på er, at disse ikke er gyldige for alle typer programmeringssprog. Tolkene kan arbejde, for eksempel med Python eller JavaScript, men de ville ikke være brugbare på andre sprog, såsom C++. Også at skulle fortolke koden samtidig med, at den udføres, indebærer et betydeligt tab af ydeevne ved at skulle oversætte og håndtere hver instruktion, som om den var en separat compiler.

Og det er her, JIT-kompilerne kommer i spil.

Hvad er en Just-In-Time Compiler

Mens en normal compiler er ansvarlig for at kompilere al koden, når vi skal køre programmet, konvertere koden til binær og generere den eksekverbare, optimerer JIT-kompileren dette arbejde ved at kompilerer kun koden for hver funktion, når det er nødvendigt. .

På denne måde, når vi skal udføre et program, vil Just-In-Time eller JIT, compileren kun kompilere de funktioner, der skal bruges i det øjeblik, og gemmer resultatet i en cache. Da vi bruger programmet, når vi støder på en ny funktion, der endnu ikke er kompileret, kompileres den igen. Men når vi finder en funktion, der allerede er brugt, i stedet for at kompilere den igen, søges den i cachen, hvilket sparer en betydelig mængde tid.

Nogle eksempler på brug JIT compilere er som følger:

  • Java: Den virtuelle Java-maskine, JVM, bruger Just-In-Time.
  • .NET Framework – Microsofts programmeringsmiljø.
  • C #: CLR (Common Language Runtime).
  • Android: når det bruges med DVM (Dalvik Virtual Machine) eller ART (Android RunTime).
  • Emulatorer: Disse compilere bruges også i emulatorer til konsoller og andre pc'er. Sådan oversættes maskinkode fra én CPU-arkitektur til en anden.

Sammenlign JIT Java

Disse typer af compilere har bedre ydeevne end tolke , da de i stedet for at fortolke al koden kompilerer det, de har brug for, efterhånden som de har brug for det. Men at skulle kompilere koden ved runtime har i større eller mindre grad indflydelse på ydeevnen sammenlignet med at bruge en standard compiler, der genererer det binære og giver os mulighed for at eksekvere det direkte på maskinen. Og jo større det program, vi forsøger at køre, jo større er præstationspåvirkningen. Dette får nogle meget store programmer til at tage op til et minut at udføre de første par funktioner.

For at reducere denne påvirkning er der nogle præ-kompilatorer , Såsom microsoft's Native Image Generator (Ngen) , som sørger for at eliminere eksekveringstiden og få JIT compileren til at fungere fra starten.

Desuden, da Just-In-Time kompilering primært bruger eksekverbare data, beskytter det mod potentielle udnyttelser er en stor udfordring for udviklere. Hukommelsen skal overvåges nøje og beskyttes med avancerede sikkerhedsteknikker, såsom isolation, for at undgå at tage unødvendige risici.

Optimer JIT (Just-In-Time) compileren

Afhængigt af hvilken type compiler vi bruger, er det muligt at finde forskellige niveauer af kodeoptimering. For eksempel i tilfælde af ÅbenJ9 (Eclipse JIT compiler til Java-kode ), er det muligt at vælge det niveau af kodeoptimering, vi ønsker. Jo højere optimering af Just-In-Time compileren er, jo hurtigere vil koden eksekvere på vores computer, selvfølgelig på bekostning af en meget større brug af RAM og CPU.

Derudover er disse kompilatorer designet til at analysere og spore et programs funktioner og detektere, hvilke der er de mest gentagne. Der anvendes således visse optimeringer på dem, og hvilke der kaldes de mindste, hvilket efterlader dem lidt i baggrunden for at undgå unødvendig brug af ressourcer.