Domanda

Q1) Perché è C # inizialmente compilato per IL e poi in fase di esecuzione JIT rispettato ed eseguito sulla cima di una macchina virtuale (?). O è JIT rispettato in codice macchina nativo?

Q2) Se il secondo è vero (JIT rispettato in codice macchina nativo), allora dove è la sandbox .NET il codice viene eseguito sotto?

Q3) Inoltre, perché è il codice compilato per IL, in primo luogo. Perché non è sufficiente compilare in codice macchina nativo per tutto il tempo? V'è uno strumento da MS da questa chiamata ngen ma perché è quella facoltativa?

È stato utile?

Soluzione

L'IL è JIT'd (JIT = Just In Time) compilato in codice macchina nativo come il processo viene eseguito.

L'uso di uno strato di macchina virtuale consente .NET a comportarsi in modo coerente tra le piattaforme (ad esempio un int è sempre 32 bit, indipendentemente dal fatto che si sta eseguendo su una macchina a 32 o 64 bit, questo non è il caso con C ++).

JIT compilazione permette ottimizzazioni a se stessi adattare dinamicamente il codice durante l'esecuzione (ad esempio, si applicano le ottimizzazioni più aggressive per pezzi di codice che sono chiamati di frequente, o fanno uso di istruzioni hardware disponibile sulla macchina specifico come SSE2), che si puo' t fare con un compilatore statico.

Altri suggerimenti

A1) JIT compila in codice macchina nativo

A2) In .net non esiste tale termine come sandbox. C'è invece AppDomain. E viene eseguito come parte del CLR (vale a dire come parte del processo eseguibile)

A3) NGen inconvenienti dal Jeffrey Richter:

    file
  • NGen'd possono ottenere fuori sincronia. Quando il CLR carica un file NGen'd, si confronta un numero di caratteristiche di codice precedentemente compilato e l'esecuzione corrente ambiente. Se una qualsiasi delle caratteristiche non corrispondono, il file non può essere NGen'd utilizzato, e il normale processo compilatore JIT viene usato preferibilmente.

  • Inferiore Load-Time Performance (rebasing / Binding). i file di montaggio sono file standard di Windows PE, e, come tale, ognuno contiene un indirizzo di base preferenziale. molti di Windows Gli sviluppatori hanno familiarità con le questioni che circondano indirizzi di base e rebasing. Quando JIT compila il codice, questi problemi non sono un problema, perché i riferimenti di indirizzo corretto di memoria sono calcolate in fase di esecuzione.

  • Inferiore tempo di esecuzione delle prestazioni. Quando si compila il codice, NGen non può fare come molti ipotesi circa l'ambiente di esecuzione come la lattina JIT compilatore. Questo causa Ngen.exe per produrre codice inferiore. Ad esempio, NGen non ottimizzare l'uso di alcune istruzioni della CPU; aggiunge indirections per l'accesso campo statico, perché l'attuale l'indirizzo dei campi statici non si sa fino a quando fase di esecuzione. NGen inserisce il codice per chiamare classe Costruttori in tutto il mondo, perché non conosce l'ordine in cui il codice viene eseguito e se un costruttore di classe è già stato chiamato.

È possibile utilizzare NGEN per creare versioni native dei vostri assembly .NET. Fare questo significa che il JIT non ha bisogno di fare questo in fase di esecuzione.

.NET viene compilato a IL prima e poi al nativo dal momento che il JIT è stato progettato per ottimizzare il codice IL per la CPU corrente il codice è in esecuzione.

NET codice viene compilato a IL per la compatibilità. Dal momento che è possibile creare codice utilizzando C #, VB.NET, ecc poi il JIT ha bisogno di un'istruzione comune definito (IL) al fine di compilare in codice nativo. Se il JIT doveva essere a conoscenza delle lingue, poi il JIT avrebbe bisogno di essere aggiornato in caso di nuove linguaggio .NET è stato rilasciato.

Non sono sicuro sulla questione sandbox, la mia ipotesi migliore è che un'applicazione .NET viene eseguito con 3 domini applicativi. Un dominio contiene i runtime .NET (mscorlib, System.dll, ecc), un altro dominio contiene il codice .NET, e non riesco a ricordare ciò che l'altro dominio del per. Scopri http://my.safaribooksonline.com/9780321584090

1. C # è stato compilato a CIL (o IL) perché condivide una piattaforma con il resto dei linguaggi .NET (che è il motivo per cui è possibile scrivere una DLL in C # e utilizzarlo in VB.NET o F # senza problemi). Il CLR verrà poi JIT Compilare il codice nativo in codice macchina.

.NET può essere eseguito anche su piattaforme multiple (Mono su * NIX e OS X). Se C # compilato in codice nativo, questo non sarebbe altrettanto facile.

2. Non v'è alcun sandbox.

3. Covered nella risposta alla 1 #

A1) In questo modo è indipendente dalla piattaforma (Windows, Linux, Mac) e può anche utilizzare le ottimizzazioni specifiche per il vostro hardware corrente. Quando viene compilato JIT è in codice macchina.

A2) L'intero quadro (framework .NET) è tutto sandbox quindi chiama tutti si potrebbe fare attraverso la vostra applicazione passerà attraverso la sandbox framework .NET.

A3) Come in risposta 1, permette al binario .NET di lavorare in diverse piattaforme ed eseguire ottimizzazioni specifiche nel computer client al volo.

NET compilato diventa IL, che è un linguaggio intermedio esattamente allo stesso modo di quello del codice oggetto Javas'. Sì, è possibile generare codice macchina nativo utilizzando il NGen strumento. NGen si lega l'immagine originaria risultante alla macchina, in modo da copiare il binario ngen'd ad un sistema diverso non produrrebbe risultati attesi. La compilazione di codice intermedio consente per le decisioni di esecuzione che possono essere fatte che altrimenti non può (facilmente) essere fatta con un linguaggio staticamente tipizzato come C ++, permette anche il funzionamento del codice su diversi archetectures hardware perché il codice diventa allora descrittivo nella senso che descrive anche l'intento di ciò che dovrebbe avvenire in un bit (ad esempio 32 o 64) -agnostic modo, al contrario di codice specifico macchina che funziona solo su sistemi a 32 bit o sistemi a 64 bit, ma non entrambe.

Inoltre, NGen è facoltativo perché come ho detto si lega il binario al sistema, può essere utile quando è necessario l'esecuzione di codice macchina compilato con la flessibilità di un linguaggio tipizzato in modo dinamico e si sa che il binario non sarà essere in movimento ad un sistema che non è legato a.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top