2012-01-12 52 views
42

Ci sono molte informazioni contraddittorie su questo. Mentre alcuni dicono che C# è compilato (dato che è compilato in IL e quindi in codice nativo quando viene eseguito), altri dicono che è interpretato in quanto ha bisogno di .NET. IT Wiki dice:C# è parzialmente interpretato o realmente compilato?

Molti interpretato lingue vengono prima compilati a qualche forma di codice macchina virtuale, che viene poi o interpretato o compilato in fase di esecuzione in codice nativo.

Quindi sono abbastanza confuso. Qualcuno potrebbe spiegarlo chiaramente?

+0

possibile duplicato del [è il C# interpretati o Compilato?] (Http://stackoverflow.com/questions/2777242/is-c-sharp-interpreted-or-compiled) –

risposta

47

C# è compilato in IL, dal compilatore C#.

Questo IL viene quindi compilato just-in-time (JIT) in base alla necessità, nella lingua di assemblaggio nativa della macchina host. Tuttavia, sarebbe possibile scrivere un runtime .NET che interpretasse l'IL. Anche se fosse stato fatto, continuerei a sostenere che C# è un linguaggio compilato.

+3

Ma perché è allora considerato un linguaggio interpretato da molti programmatori? – user970696

+9

Personalmente, non ho mai sentito nessuno chiamare C# una lingua interpretata. – jrummell

+8

Forse si sbagliano o si informano male. O forse ho sbagliato :-) – Simon

9

Guardate qui: http://msdn.microsoft.com/library/z1zx9t92

codice sorgente scritto in C# viene compilato in un linguaggio intermedio (IL), che è conforme alla specifica CLI.

(...)

Quando viene eseguito il programma C#, l'assembly viene caricato nel CLR, che potrebbe richiedere diverse azioni in base alle informazioni in manifesto. Quindi, se i requisiti di sicurezza sono soddisfatti, il CLR esegue la compilazione JIT just in time (JIT) per convertire il codice IL in istruzioni macchina originali .

+0

Grazie, quindi se ho undernstand correttamente, la confusione con intepretes potrebbe provenire dalla macchina virtuale (CRM) che è necessaria, tuttavia non è vero nell'interprete. – user970696

0

C# è una lingua compilabile.

probbably, ripeto, probbably, come ho incontrato troppo questo tipo di opinioni, il fatto che qualcuno pensa che ci sia un interprete per il linguaggio C#, è dovuto il tipo di progetti come

C# Interpreter Console

o, per esempio, famoso

LinqPAD

cui è possibile scrivere solo righe del codice ed eseguire loro, che porta a pensare che si tratta di Python come lingua, che è non vero. Compila queste righe e le esegue, come un normale linguaggio di compilazione (dal punto di vista del flusso di lavoro).

+1

grazie. Tuttavia, C++ e C# sarebbero entrambi linguaggi compilati da quel punto di vista. Ma penso che non sia così chiaro come con C++ è stato compilato direttamente in codice nativo mentre con .NET è solo CIL. – user970696

+1

C#, come è stato risposto qui, viene prima compilato in Intermidiate Language e solo dopo essere stato compilato nel codice macchina specifico della macchina. C'è un motivo per controllare Eric Lippert answer http://stackoverflow.com/questions/7875253/what-is-the-purpose-of-a-stack-why-do-we-need-it-msil/7877736#7877736 a capire le ragioni dietro a ciò. – Tigran

25

Un linguaggio puramente compilato presenta alcuni vantaggi. La velocità, di regola, e spesso la dimensione del set di lavoro. Un linguaggio puramente interpretato presenta alcuni vantaggi. Flessibilità di non aver bisogno di una fase di compilazione esplicita che ci permetta di modificare sul posto, e spesso portabilità più facile.

In questo caso, una lingua di prova si inserisce in una via di mezzo.

Questa è una sola ragione per cui si potrebbe pensare ad una lingua jitted come sia compilato o come interpretato a seconda di quale posizione su cui metrica ci preoccupiamo per il raggiungimento, e i nostri pregiudizi a favore e contro l'uno o l'altro.

C# può anche essere compilato alla prima esecuzione, come accade in ASP.NET, il che lo rende vicino all'interpretazione in quel caso (anche se è ancora compilato in IL e quindi jitted in questo caso). Certamente, ha praticamente tutti i vantaggi dell'interpretato in questo caso (confronta con VBScript o JScript usato in ASP classico), insieme a molti dei vantaggi del compilato.

Strettamente, nessuna lingua viene interpretata, interpretata o compilata qua lingua. Possiamo NGen C# in codice nativo (sebbene se faccia qualcosa come caricare dinamicamente un assembly continuerà a usare IL e jitting). Potremmo scrivere un interprete per C o C++ (molte persone lo hanno fatto). Nel suo caso d'uso più comune, tuttavia, C# è compilato in IL, che viene quindi jitted, che non è proprio la definizione classica di interpretata né di compilazione.

+0

Sono d'accordo con "nessuna lingua è interpretata, interpretata o compilata qua lingua". Stavo vedendo un po 'di python che viene prima compilato in 'byteCode' e quindi in fase di esecuzione che' byteCode' viene interpretato dall'interprete del rispettivo OS. Questo fatto ha solo contribuito al mio stupore causato dalle definizioni di langauges compilati, interpretati e interpretati. – RBT

+0

Le lingue JIT possono essere più veloci di native. Sai qual è la cosa della strumentazione gcc, dove emette un file di misurazione delle prestazioni in esecuzione e poi lo carica nuovamente in gcc per compilare un binario più ottimizzato? JVM e CLR lo fanno continuamente. –

4

Prima di tutto comprendiamo le definizioni di interpretato e compilato.

"Compile" (when referring to code) significa tradurre codice da una lingua a un'altra. Tipicamente dal codice sorgente leggibile in codice macchina che il processatore target può ... elaborare.

"Interpret" (when referring to code) ANCHE significa tradurre codice da una lingua a un'altra. Ma questa volta è tipicamente usato per passare da un codice sorgente leggibile in un codice intermedio che è preso da una macchina virtuale che lo interpreta in codice macchina.

solo per essere il codice
sorgente chiaro -> Compiler -> Codice macchina
Codice sorgente -> Compiler -> Codice Byte -> Interprete -> Codice macchina

Qualsiasi lingua può, in teoria, essere interpreted oppure compiled. Tipicamente Java è compilato in bytecode che viene interpretato dalla macchina virtuale Java in codice macchina. C# viene in genere interpretato in bytecode che viene compilato dal CLR, il Common Language Runtime, un'altra macchina virtuale.

Di gran lunga il tutto è un espediente di marketing. Il termine "interpretato" è stato aggiunto (o almeno, aumentato nell'uso) per aiutare a mostrare quanto fosse bello just-in-time compiling. Ma avrebbero potuto semplicemente usare "compilato". La distinzione è più uno studio della lingua inglese e delle tendenze del business piuttosto che di natura tecnica.

+4

In un interprete, non viene generato alcun codice macchina in fase di esecuzione, viene eseguito solo il codice macchina esistente. Con questo standard, è del tutto scorretto riferirsi al Common Language Runtime come interprete. –

2

C# è sia interpretato e compilato nel corso della sua durata. C# è compilato in un linguaggio virtuale che viene interpretato da una VM.

La confusione deriva dal concetto fuzzy di un "linguaggio compilato".

"Lingua compilata" è un termine improprio, in un certo senso, perché compilato o interpretato non è una proprietà del linguaggio ma del runtime.

ad es. Si potrebbe scrivere un interprete C, ma la gente di solito lo chiama "Compiled Language", perché le implementazioni C vengono compilate in base al codice macchina e il linguaggio è stato progettato tenendo in considerazione la compilazione.

+2

No, il desktop .NET VM (chiamato Common Language Runtime) ha un compilatore JIT, nessun interprete. Al contrario, .NET Microframework, che si trova su piccoli dispositivi embedded che potrebbero non supportare nemmeno la modifica del codice di runtime, in realtà interpreta l'IL. –

+0

http://en.wikipedia.org/wiki/Common_Language_Runtime – ajfabbri

+0

Source -> (compiler) -> Intermediate Language -> (interpreter) -> Native code. Sto visualizzando JIT come ottimizzazione dell'interprete. È fondamentalmente "caching" a livello di interprete. Puoi chiamare entrambi i compilatori di passaggi, se lo desideri. – ajfabbri

8

Se ti senti, hai imparato o sei vecchio, un EXE compilato sta passando da codice sorgente a codice macchina, quindi C# viene interpretato. Se pensate che compili significhi convertire il codice sorgente in un altro codice come il codice byte, allora sì è convertito.Per me, tutto ciò che richiede l'elaborazione in fase di elaborazione per funzionare nel sistema operativo per cui è stato costruito è interpretato.

+0

Non chiediamo un'opinione e "per me" è un'opinione. Questo non è un forum. –

0

C#, come Java, ha un processore di linguaggio ibrido. I processori ibridi svolgono il lavoro sia di interpretazione che di compilazione.

7

Troppe semantiche e dichiarazioni basate sull'opinione.

Primo: C# non è una lingua interpretata; CLR e JVM sono considerati "runtime" o "middleware", ma lo stesso nome si applica a cose come Perl. Ciò crea molta confusione tra le persone interessate ai nomi.

Il termine "Interprete" che fa riferimento a un runtime generalmente indica che il codice esistente interpreta un codice non nativo. Esistono due grandi paradigmi: l'analisi legge il codice sorgente non elaborato e intraprende azioni logiche; l'esecuzione bytecode compila il codice prima di una rappresentazione binaria non nativa, che richiede un numero di cicli CPU inferiore per l'interpretazione.

Java originariamente compilato in bytecode, quindi sottoposto a un interprete; ora, la JVM legge il bytecode e just-in-time lo compila nel codice nativo. CIL fa lo stesso: CLR utilizza la compilazione just-in-time nel codice nativo.

Considerare tutte le combinazioni di codice sorgente in esecuzione, bytecode in esecuzione, compilazione in compilazione nativa, just-in-time, esecuzione di codice sorgente tramite un compilatore in modalità just-in-time nativa e così via. La semantica del fatto che una lingua sia compilata o interpretata diventa priva di significato.

Ad esempio: molti linguaggi interpretati utilizzano la compilazione bytecode just-in-time. C# si compila in CIL, che JIT compila in nativo; al contrario, Perl compila immediatamente uno script in un bytecode, quindi esegue questo bytecode tramite un interprete. Puoi eseguire solo un assembly C# in formato bytecode CIL; puoi eseguire uno script Perl solo in formato codice sorgente raw.

I compilatori just-in-time eseguono anche una grande quantità di strumentazione esterna e interna. Il runtime tiene traccia dell'esecuzione di varie funzioni, quindi regola il layout del codice per ottimizzare i rami e l'organizzazione del codice per il suo particolare flusso di esecuzione. Ciò significa che il codice JIT può essere eseguito più velocemente del codice compilato nativamente (come C++ è in genere, o come C# eseguito attraverso IL2CPP), perché la JIT adatta la sua strategia di ottimizzazione al caso di esecuzione effettivo del codice durante la sua esecuzione.

Benvenuti nel mondo della programmazione per computer. Abbiamo deciso di renderlo estremamente complicato, quindi associare nomi non descrittivi a tutto. Lo scopo è quello di creare flamewars sulla definizione di parole che non hanno alcun significato pratico.

+0

JVM interpreta il bytecode e quindi compila alcuni dei metodi/corpi del loop nel codice nativo. Questa compilazione può avvenire in parallelo con l'interpretazione bytecode e il codice può essere scambiato a caldo. – Steves

+0

Non riesco a trovare una citazione per quello.La mia comprensione è che JVM interpreta il bytecode mentre viene eseguito da JIT, ovvero: quando incontra un bytecode che non ha ancora affrontato durante l'esecuzione corrente, lo esegue attraverso il JIT ed esegue il blocco di codice nativo risultante. JIT-and-execute è più economico dell'interpretazione bytecode e l'implementazione di entrambi i sistemi è estremamente complessa. –

+0

Acquista ad es. https://www.slideshare.net/ZeroTurnaround/vladimir-ivanovjvmjitcompilationoverview-24613146. Quello che stai descrivendo è ciò che .NET fa. Quello che ho descritto è ciò che per es. L'Hotspot JVM lo fa e sì è piuttosto complesso, è per questo che è stato sviluppato per un po '. È necessario che il codice bytecode interpreti il ​​codice per ottenere informazioni sul profilo (si pensi: quale ramo è stato utilizzato la maggior parte del tempo, ecc.), Che viene utilizzato nel compilatore di ottimizzazione (se il ramo non è mai stato utilizzato, non spendere troppo risorse per ottimizzarlo). – Steves

0

Poiché un computer può eseguire solo codice binario, qualsiasi lingua porterà alla produzione di codice binario in un punto o in un altro. La domanda è: il linguaggio consente di produrre un programma in codice binario? Se sì, allora è un linguaggio compilato: per definizione "compilato" in "linguaggio compilato" si riferisce alla compilazione in codice binario, non alla trasformazione in qualche codice intermedio. Se il linguaggio porta alla produzione di tale codice intermedio per un programma, avrà bisogno di un software aggiuntivo per eseguire la compilazione binaria da questo codice: è quindi una lingua interpretata. Un programma "compilato" da C# è eseguibile direttamente su una macchina senza nessun altro software installato su questa macchina? se no, allora è un linguaggio interpretato. Per un linguaggio interpretato, è un interprete che genererà il codice binario sottostante, il più delle volte in modo dinamico poiché questo meccanismo è alla base della flessibilità di tali linguaggi. rem. : a volte non sembra ovvio perché l'interprete è incluso nel sistema operativo

+0

Con questa definizione QBasic era un compilatore. Questo è chiaramente un coccio. C# è anche un linguaggio interpretato, con alcuni JITting qua e là come un'ottimizzazione. Certo, puoi anche NGen .Net IL, ma perdi l'ottimizzazione che JITter può fare. Quello che si ottiene in IL è un elenco di dati usati per inviare chiamate in subroutine, nessun codice macchina viene generato o eseguito eccetto dove il runtime vede un uso pesante e sostituisce le esecuzioni dei dati del codice p con il codice macchina JITted per sostituire l'invio di chiamata. – Bob77

1

Credo che questo sia un argomento piuttosto vecchio.

Dal mio punto di vista, il codice interpretato passerà attraverso un interprete, riga per riga traduci ed esegui allo stesso tempo. Come ad esempio javascript, è un codice interpretato, quando una riga di javascript ha incontrato un errore, lo script si interromperà.

Mentre è compilato, passerà attraverso un compilatore, tradurrà tutto il codice in un'altra forma di codice contemporaneamente, senza eseguirlo prima. L'esecuzione è in un altro contesto.

0

Se siamo d'accordo con la definizione di interprete «In informatica, un interprete è un programma per computer che esegue direttamente, cioè esegue, istruzioni scritte in un linguaggio di programmazione o di scripting, senza richiedere che siano precedentemente compilati in un programma di linguaggio macchina. »non c'è dubbio: C# non è una lingua interpretata.

Interpreter on Wikipedia