Objašnjeno upravo u vremenu

Pravovremena kompilacija metoda je za poboljšanje izvedbe protumačenih programa. Tijekom izvršavanja program se može kompilirati u izvorni kôd radi poboljšanja njegovih performansi. Poznata je i pod nazivom dinamička kompilacija.

Dinamička kompilacija ima neke prednosti u odnosu na statičku kompilaciju. Kada se izvode Java ili C # aplikacije, runtime okruženje može profilirati aplikaciju dok se izvodi. To omogućuje generiranje optimiziranijeg koda. Ako se ponašanje aplikacije promijeni dok je pokrenuta, runtime okruženje može ponovno sastaviti kôd.

Neki od nedostataka uključuju kašnjenja pri pokretanju i opće troškove kompilacije tijekom izvođenja. Da bi ograničili opće troškove, mnogi JIT-ovi kompajleri sastavljaju samo često korištene putove koda.

Pregled

Tradicionalno postoje dvije metode za pretvaranje izvornog koda u oblik koji se može pokrenuti na platformi. Statička kompilacija pretvara kôd u jezik za određenu platformu. Tumač izravno izvršava izvorni kod.

JIT kompilacija pokušava iskoristiti blagodati oba. Dok se interpretirani program izvodi, JIT kompajler određuje najčešće korišteni kôd i kompajlira ga u strojni kod. Ovisno o prevoditelju, to se može učiniti na metodi ili manjem dijelu koda.

Dinamička kompilacija prvi je put opisana u radu J. McCarthyja o LISP-u 1960.

Just In Time Compilation, JIT ili Dynamic Translation, kompilacija je koja se radi tijekom izvršavanja programa. Znači, u vrijeme izvođenja, za razliku od prije izvršenja. Ono što se događa je prijevod na strojni kod. Prednosti JIT-a su zbog činjenice da, budući da se kompilacija odvija u vrijeme izvođenja, JIT-ov kompajler ima pristup dinamičkim informacijama o vremenu izvođenja, što mu omogućuje bolju optimizaciju (kao što su ugradbene funkcije).

Ono što je važno razumjeti o JIT kompilaciji, jest da će on sastaviti bajtkod u upute strojnog koda pokrenutog stroja. To znači da je rezultirajući strojni kod optimiziran za CPU arhitekturu pokrenutog stroja.

Neki primjeri JIT kompajlera su JVM (Java virtualni stroj) u Javi i CLR (Common Language Runtime), u C #.

Povijest

U početku je prevodilac bio odgovoran za pretvaranje jezika visoke razine (definiran kao viša razina od asemblera) u objektni kod (strojne upute), koji bi zatim (povezivač) povezao u izvršnu datoteku.

U jednom trenutku evolucije jezika, kompajleri bi kompajlirali jezik visoke razine u pseudo-kôd, koji bi zatim protumačio (tumač) za pokretanje vašeg programa. To je eliminiralo objektni kod i izvršne datoteke i omogućilo prijenos ovih jezika na više operativnih sustava i hardverskih platformi. Pascal (koji je preveden u P-Code) bio je jedan od prvih; Java i C # noviji su primjeri. Na kraju je pojam P-Code zamijenjen bytecodeom, jer je većina pseudo-operacija bajt dugačka.

Just-in-Time (JIT) prevoditelj značajka je interpretatora vremena izvođenja, koji će umjesto interpretacije bajt-koda svaki put kada se metoda pozove, bajt-kôd kompilirati u upute strojnog koda pokrenutog stroja, a zatim pozvati ovo umjesto toga objektni kod. Idealno bi bilo da učinkovitost izvođenja objektnog koda prevlada neučinkovitost ponovnog sastavljanja programa svaki put kad se pokrene.

Tipični scenarij

Izvorni kod u potpunosti se pretvara u strojni kod

JIT scenarij

Izvorni kôd pretvorit će se u strukturu poput jezika sklopa [za ex IL (srednji jezik) za C #, ByteCode za javu].

Međusobni kôd pretvara se u strojni jezik samo kada aplikacija zahtijeva potrebne kodove samo u strojni kôd.

Usporedba JIT-a protiv Non-JIT-a

U JIT-u se ne pretvara sav kôd u strojni kôd, dio potrebnog koda pretvorit će se u strojni kôd, a zatim ako metoda ili funkcionalnost koja se poziva nisu u stroju, a zatim će se pretvoriti u strojni kod, što smanjuje opterećenje CPU. Kako će se strojni kôd generirati u vrijeme izvođenja, JIT kompajler proizvest će strojni kôd koji je optimiziran za izvršavanje CPU arhitekture stroja.

Neki primjeri JIT-a su:

  • Java: JVM (Java virtualni stroj)
  • C #: CLR (uobičajeno vrijeme izvođenja)
  • Android: DVM (Dalvik virtualni stroj) ili ART (Android RunTime) u novijim verzijama

Java virtualni stroj (JVM) izvršava bajt kod i održava broj koliko se puta funkcija izvršava. Ako ovaj broj premaši unaprijed definirano ograničenje, JIT kompajlira kôd u strojni jezik koji procesor može izravno izvršiti (za razliku od uobičajenog slučaja u kojem javac kompajlira kôd u bytecode, a zatim Java, tumač interpretira ovaj bytecode red po red pretvara ga u strojni kod i izvršava).

Također sljedeći put kada se izračuna ova funkcija, isti se kompajlirani kôd ponovno izvršava za razliku od normalne interpretacije u kojoj se kôd tumači ponovno redak po redak. To čini izvršenje bržim.