Vra

Wat is die verskil tussen die JIT samesteller en CLR?As jy stel jou kode te il en CLR loop dat die kode wat is dan die JIT doen?Hoe het JIT samestelling verander met die toevoeging van generiese om die CLR?

Was dit nuttig?

Oplossing

Die JIT is een aspek van die CLR.

spesifiek is dit die deel wat verantwoordelik is vir die verandering van CIL / MSIL (hierna genoem IL) geproduseer deur samesteller die oorspronklike taal se (csc.exe vir Microsoft c # byvoorbeeld) in masjienkode inheems aan die huidige verwerker (en argitektuur wat dit ontbloot in die huidige proses, byvoorbeeld 32 / 64bit). As die vergadering in vraag dan is ngen'd die die JIT proses is heeltemal onnodig en die CLR sal hierdie kode net mooi loop sonder dit.

Voordat 'n metode gebruik wat nog nie tot bekering uit die intermediêre verteenwoordiging dit is die verantwoordelikheid van die JIT se om dit te omskep.
Presies toe die JIT skop in is implementering spesifieke, en onderhewig aan verandering. Maar die CLR ontwerp mandate dat die JIT gebeur voor die relevante kode voer, JVM se in teenstelling vry om die kode vir 'n rukkie te interpreteer sou wees, terwyl 'n aparte draad skep 'n masjien-kode verteenwoordiging.
Die "normale" CLR gebruik 'n pre-JIT stomp benadering waar deur metodes JIT saamgestel net as dit gebruik word. Dit behels dat die aanvanklike moedertaal metode stomp wees 'n indirection om die JIT om die metode te stel dan die oorspronklike oproep om oor te slaan verby die aanvanklike stomp verander onderrig. Die huidige kompakte uitgawe stel in plaas al die metodes op 'n tipe wanneer dit gelaai.

Om die toevoeging van generiese medisyne aan te spreek.

Dit was die laaste groot verandering aan die IL spesifikasie en betyds in terme van sy semantiek in teenstelling met sy interne besonderhede implementering.

Verskeie nuwe IL instruksies is bygevoeg, en nog baie meer meta data opsies verskaf vir instrumenting tipes en lede. Beperkings is bygevoeg by die IL vlak as well.

Wanneer die JIT stel 'n metode wat generiese argumente het (hetsy uitdruklik of implisiet deur die wat die klas) dit kan opstel verskillende kode paaie (masjienkode instruksies) vir elke gebruik tipe. In die praktyk gebruik die JIT 'n gedeelde implementering vir alle vorme verwysing sedert veranderlikes vir hierdie sal dieselfde semantiek te stal en te beset dieselfde ruimte (IntPtr.Size).

Elke tipe waarde sal kry spesifieke kode gegenereer vir dit, wat handel oor die verminderde / verhoogde grootte van die veranderlikes op die stapel / hoop is vandag 'n groot rede hiervoor. Ook deur afgee die ingeperk opcode voor metode roep baie aanroepingen op non verwysing tipes hoef nie boks die waarde aan die metode noem (dit optimization gebruik in nie generiese gevalle sowel). Dit laat ook die default<T> gedrag korrek te hanteer en vir vergelykings om nul te gestroop word as geen ops (altyd vals) wanneer 'n nie waarvoor geen nul mag waarde tipe gebruik word.

As 'n poging aangewend tydens looptyd om 'n geval van 'n generiese tipe skep via weerspieëling dan die tipe parameters sal bekragtig deur die runtime te verseker dat hulle enige beperkings te slaag. Dit beteken egter nie direk die JIT raak tensy dit binne die tipe stelsel word gebruik (waarskynlik al moontlik).

Ander wenke

Jy stel jou kode te IL wat kry uitgevoer en saamgestel om die masjien kode gedurende runtime, dit is wat genoem JIT.

Wysig, na die vlees uit die antwoord op'n paar meer (nog té vereenvoudigde):

Wanneer jy stel jou C# kode in visual studio dit verander in IL dat die CLR verstaan, die IL is dieselfde vir alle tale hardloop op die top van die CLR (wat is wat in staat stel om die .NETTO runtime verskeie tale te gebruik en inter-op tussen hulle maklik).

Tydens runtime die IL geïnterpreteer in die masjien kode (wat is spesifiek vir die argitektuur is jy op) en dan is dit uitgevoer word.Hierdie proses word genoem Net In die Tyd samestelling of JIT vir'n kort.Slegs die IL wat nodig is, is omskep in'n masjien kode (en slegs een keer, dit se "kas" wanneer dit is saamgestel in machinecode), net in die tyd voordat dit uitgevoer word, vandaar die naam JIT.

Dit is wat dit sou lyk vir C#

C# Kode > C# Samesteller > IL > .NETTO Runtime > JIT Samesteller > Machinecode > Uitvoering

En dit is wat dit sou lyk vir VB

VB-Kode > VB Samesteller > IL > .NETTO Runtime > JIT Samesteller > Machinecode > Uitvoering

En soos jy kan sien slegs die eerste twee stappe is uniek aan elke taal, en na alles is dit is verander in IL is dieselfde wat, soos ek gesê het voordat, die rede waarom jy kan hardloop verskillende tale op die top van .NETTO

As Jon Kleiduiven sê, JIT is deel van die CLR.Basies dit is wat gebeur onder die enjinkap:

  1. Jou bron-kode is saamgestel in'n byte kode ken as die algemene intermediêre taal (CIL).
  2. Metadata van elke klas en elke metodes (en elke ander ding :O) is ingesluit in die PE kop van die gevolglike uitvoerbare (word dit'n dll of'n exe).
  3. As jy die vervaardiging van'n uitvoerbare die PE Kop sluit ook'n konvensionele bootstrapper wat in beheer is van die laai van die CLR (Gemeenskaplike taal runtime) wanneer jy uit te voer jy uitvoerbare.

Nou, wanneer jy uit te voer:

  1. Die bootstraper initialiseert die CLR (hoofsaaklik deur die laai van die mscorlib vergadering) en opdrag gee om dit uit te voer jou vergadering.
  2. Die CLR voer jou belangrikste inskrywing.
  3. Nou, klasse het'n vektor tafel wat hou die adresse van die metode funksies, sodat wanneer jy bel MyMethod, hierdie tabel is deursoek en dan'n ooreenstemmende oproep na die adres is gemaak.Op ALLE inskrywings vir al die tafels het die adres van die JIT samesteller.
  4. Wanneer'n oproep na een van so'n metode is gemaak, die JIT is drie maande in plaas van die werklike metode en neem beheer.Die JIT dan stel die CIL-kode in werklike vergadering kode vir die appropiate argitektuur.
  5. Sodra die kode is opgestel die JIT gaan in die metode vektor tafel en die plek van die adres met die een van die saamgestel kode, sodat elke daaropvolgende oproep nie meer beroep op die JIT.
  6. Ten slotte, die JIT hanteer die uitvoering van die saamgestel kode.
  7. As jy bel'n ander metode wat nog nie wat saamgestel dan terug te gaan na 4...en so aan...

Die JIT is basies deel van die CLR. Die vullis versamelaar is 'n ander. Nogal waar jy sit interop verantwoordelikhede ens is 'n ander saak, en een waar Ek is uiters ondergekwalifiseerd om kommentaar te lewer:)

Ek weet die draad is redelik oud, maar ek het gedink ek kan sit in die prentjie wat my verstaan JIT.Dit is uit die uitstekende boek CLR via C# deur Jeffrey Ritcher.In die prentjie, die metadata hy is praat oor die metadata wat uitgestraal word in die vergadering kop waar al die inligting oor die tipes in die vergadering gestoor word:

JIT image from CLR via C#

1), terwyl die opstel van die NET program, is net programkode omskep in Intermediêre taal (IL) kode

2) op die uitvoering van die program die Intermediêre taal-kode omgeskakel word na bedryfstelsel Native kode soos en wanneer 'n metode genoem word; Dit is die sogenaamde JIT (Just in Time) samestelling.

  1. Common Language Runtime (CLR) is tolk terwyl Net In Time (JIT) is samesteller in NET Framework.

2.JIT is die interne samesteller van NET waarop Microsoft Intermediêre Kode Taal (MSICL) kode neem van CLR en voer dit na masjien spesifieke instruksies terwyl CLR werk as 'n enjin sy belangrikste taak is om MSICL kode verskaf om betyds te verseker dat kode is ten volle saamgestel soos per masjien spesifikasie.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top