Domanda

Stavo leggendo questa domanda per scoprire le differenze tra la Java Virtual Machine e l' .NET CLR e Benji risposta mi chiedo perché le Macchine Virtuali sono necessarie, in primo luogo.

Dalla mia comprensione di Benji spiegazione, il compilatore JIT di una Macchina Virtuale interpreta il codice intermedio nel montaggio vero e proprio codice che viene eseguito sulla CPU.La ragione ha a che fare questo è perché la Cpu spesso hanno un diverso numero di registri e secondo Benji, "alcuni registri sono speciali, e ogni istruzione si aspetta che i suoi operandi in registri diversi." In questo senso allora che c'è bisogno di un intermediario interprete come la Macchina Virtuale in modo che lo stesso codice può essere eseguito su qualsiasi CPU.

Ma, se questo è il caso, allora quello che non capisco è il motivo per cui il C o il C++ il codice compilato in codice macchina è in grado di funzionare su qualsiasi computer è il sistema operativo corretta.Perché, allora, sarebbe un programma in C che ho compilato sulla mia macchina Windows utilizzando un Pentium essere in grado di eseguire sull'altra mia macchina Windows utilizzando un processore AMD?

Se C codice può essere eseguito su qualsiasi CPU allora quale è lo scopo della Macchina Virtuale?È così che lo stesso codice può essere eseguito su qualsiasi sistema operativo?So che Java VM versioni praticamente su qualsiasi sistema operativo, ma c'è un CLR per altri sistemi operativi oltre a Windows?

O c'è qualcos'altro che mi sto perdendo?Non l'OS di fare alcuni interpretazione di montaggio codice che viene eseguito, per adattarsi al particolare CPU o qualcosa del genere?

Io sono molto curioso di sapere come tutto questo funziona, quindi, una chiara spiegazione sarebbe molto apprezzato.

Nota:Il motivo non mi basta postare le mie domande come commenti nella JVM vsCLR domanda è perché non ho abbastanza punti per postare commenti di sicurezza =b.

Edit:Grazie per tutte le grandi risposte!Quindi, sembra proprio quello che mi mancava era che, nonostante tutti i processori hanno differenze c'è un comune di standardizzazione, principalmente l'architettura X86, che fornisce una abbastanza grande insieme di caratteristiche comuni, in modo che il codice C compilato su un processore X86 funziona la maggior parte su un altro processore X86.Questo favorisce la giustificazione per le Macchine Virtuali, per non parlare ho dimenticato l'importanza della raccolta dei rifiuti.

È stato utile?

Soluzione

I processori AMD e intel utilizzare lo stesso set di istruzioni e l'architettura della macchina (dal punto di vista di esecuzione di codice macchina).

C e compilatori C++ compila in codice macchina, con intestazioni appropriate per il sistema operativo che sono destinati a.Una volta compilato essi cessano di associare in qualche modo, forma o forma con la lingua con cui è stato redatto e sono semplicemente eseguibili binari.(ci sono artefatti che possono mostrare in che linguaggio è stato compilato, ma non è qui il punto)

Quindi, una volta compilato, essi sono associati alla macchina (X86 di intel e amd set di istruzioni e architettura) e l'OS.

Questo è il motivo per cui possono essere eseguiti su qualsiasi compatibile x86 e compatibili OS (win95 attraverso winvista, per alcuni software).

Tuttavia, essi non possono eseguire su una macchina OSX, anche se è in esecuzione su un processore intel - il binario non è compatibile a meno che non si esegue ulteriori software di emulazione (come parallels o una VM con windows).

Al di là che, se si desidera eseguire su un processore ARM o MIPS, o PowerPC, quindi è necessario eseguire un completo set di istruzioni macchina emulatore che interpreta il codice binario per la macchina da X86 in qualunque macchina si sta eseguendo su di esso.

Che contrasto con .NET.

L' .NET macchina virtuale è fabbricato come se non ci fosse molto meglio i processori, in tutto il mondo - processori che capisce di oggetti, di allocazione di memoria e la raccolta dei rifiuti, e con altri ad alto livello di costrutti.E ' una macchina molto complessa e non può essere costruito direttamente nella silicon ora (con buone prestazioni), ma un emulatore può essere scritto per essere eseguito su qualsiasi esistente processore.

Improvvisamente si può scrivere di una macchina specifica emulatore per qualsiasi processore che si desidera eseguire .NET, e quindi QUALSIASI .NET programma può essere eseguito su di esso.Non c'è bisogno di preoccuparsi per il sistema operativo o il sottostante architettura di CPU - se c'è una .NET VM, quindi il software verrà eseguito.

Ma andiamo un po ' più - una volta che si dispone di un linguaggio comune, perché non fare che i compilatori convertire qualsiasi altro linguaggio scritto in esso?

Così ora si può avere un C, C#, C++, Java, javascript, Basic, python, lua, o qualsiasi altro compilatore per il linguaggio che converte il codice scritto in modo che verrà eseguito su questa macchina virtuale.

Hai dissociato la macchina da lingua a 2 gradi, e non con troppo lavoro da fare è permettere a chiunque di scrivere il codice ed eseguirlo su qualsiasi computer, purché un compilatore e un VM esiste per mappare i due gradi di separazione.

Se si sta ancora chiedendo perché questa è una buona cosa, considerare precoce computer DOS e Microsoft reale contributo al mondo è:

Autocad dovuto scrivere i driver per ogni stampante che può stampare.Così ha fatto la lotus 1-2-3.Infatti, se si desidera che il software per la stampa, si doveva scrivere il proprio driver.Se ci fossero 10 stampanti e 10 programmi, quindi 100 pezzi diversi di essenzialmente lo stesso codice doveva essere scritto separatamente e indipendentemente.

Che versione di windows 3.1 cercato di portare a termine (con GEMMA, e tanti altri abstraction layer) è fare in modo che il produttore della stampante scritto un driver per la stampante, e il programmatore ha scritto un driver per la stampante di windows classe.

Ora con 10 programmi e 10 stampanti, solo 20 pezzi di codice deve essere scritto, e dal lato microsoft il codice è lo stesso per tutti, quindi esempi da MS significava che aveva ben poco lavoro da fare.

Ora un programma non è limitato a solo il 10 stampanti hanno scelto di sostenere, ma tutte le stampanti di cui i produttori di driver per windows.

Lo stesso problema si verifica nello sviluppo di applicazioni.Ci sono veramente pulito applicazioni che non posso usare perché non la uso un MAC.C'è un sacco di duplicazione (come molti di classe mondiale word processor abbiamo davvero bisogno?).

Java è stato pensato per risolvere questo problema, ma aveva molti limiti, alcuni dei quali non sono realmente risolto.

.NET è più vicino, ma nessuno è mondo in via di sviluppo-classe di macchine virtuali per piattaforme diverse da Windows (mono è così vicino...e ancora non del tutto lì).

Quindi...Ecco perché abbiamo bisogno di macchine virtuali.Perché non voglio limitarmi ad un pubblico più piccolo, semplicemente perché hanno scelto di OS/macchina di combinazione diversa dalla mia.

-Adam

Altri suggerimenti

La tua ipotesi e ' che C codice può essere eseguito su qualsiasi processore non è corretto.Ci sono cose, come i registri e le modalita ' di cui farà compilato programmi in C per lavori su una piattaforma, mentre potrebbe lavorare su un altro.

Tuttavia, ci sono alcune analogie che i processori condividere, per esempio, i processori Intel x86 e processori AMD condividere una abbastanza grande insieme di proprietà che la maggior parte di codice compilato contro one su altri.Tuttavia, se si desidera utilizzare il processore proprietà specifiche, allora avete bisogno di un compilatore o un set di librerie che farà per voi.

Del motivo per cui si vorrebbe una macchina virtuale, oltre la dichiarazione che in grado di gestire le differenze di processori per voi, c'è anche il fatto che le macchine virtuali offrono servizi di codice che non sono disponibili per i programmi compilati in C++ (non riuscito) di oggi.

Il più importante servizio offerto è di garbage collection, offerti da CLR e la JVM.Entrambe queste macchine virtuali offrono questo servizio gratuitamente.Essi gestire la memoria per voi.

Cose come la verifica dei limiti, le violazioni di accesso (per quanto ancora possibile, sono estremamente difficili) sono anche offerti.

Il CLR offre anche un modulo di codice di sicurezza per voi.

Nessuno di questi sono offerti come parte del basic runtime environment per un certo numero di altre lingue che non operano con una macchina virtuale.

Si potrebbe ottenere alcuni di loro utilizzando le librerie, ma poi che ti costringe in un modello di utilizzo con la libreria, mentre in .NET e Java servizi che vengono offerti attraverso il CLR e JVM sono coerenti nel loro accesso.

Essenzialmente permette per 'codice gestito", che significa esattamente quello che dice la macchina virtuale gestisce il codice viene eseguito.Tre vantaggi principali di questo sono just-in-time compilation, gestito puntatori/raccolta dei rifiuti, di sicurezza e di controllo.

Per il just-in-time compilazione di uno, la macchina virtuale guarda il codice in esecuzione e quindi, in quanto il codice viene eseguito più spesso, è reoptimised per correre più veloce.Non si può fare questo con il codice nativo.

Gestiti i puntatori sono anche più facile per ottimizzare perché la macchina virtuale tracce di loro come andare in giro, e la loro gestione in modi diversi a seconda della loro dimensione e la durata.È difficile fare questo in C++, perché non si può davvero dire dove un puntatore sta per andare solo leggendo il codice.

La sicurezza è un auto-esplicativa, la macchina virtuale si ferma il codice che fa cose che non dovrebbe, perché è guardando.Personalmente penso che sia probabilmente il più grande motivo per cui Microsoft ha scelto di codice gestito per C#.

Fondamentalmente il mio punto è, perché la macchina virtuale può guardare il codice, come accade, riesce a fare cose che rendono la vita più facile per il programmatore e rendere il codice più veloce.

La maggior parte dei compilatori, anche in codice nativo compilatori, utilizzare un qualche tipo di linguaggio intermedio.

Questo è principalmente fatto per ridurre il compilatore costi di costruzione.Ci sono molti (N) linguaggi di programmazione in tutto il mondo.Ci sono anche molti (M) hard ware piattaforme in tutto il mondo.Se compilatori lavorato senza l'utilizzo di un linguaggio intermedio, il numero totale di "compilatori" che avrebbe bisogno di essere scritto per supportare tutte le lingue su tutte le piattaforme hardware N*M.

Tuttavia, attraverso la definizione di un linguaggio intermedio e la rottura di un compilatore in 2 parti, un front-end e back-end, con l'estremità anteriore della compilazione del codice sorgente in IL e il back-end compilare IL in codice macchina, si può ottenere via con scrittura solo N+M compilatori.Questo finisce per essere un enorme risparmio sui costi.

La grande differenza tra CLR / JVM compilatori del codice nativo e compilatori è il modo in cui il front-end e back-end compilatori sono legate le une alle altre.In codice nativo compilatore le due componenti sono di solito combinati nella stessa eseguibile ed entrambi vengono eseguite quando il programmatore colpi di "costruire" in IDE.

Con CLR / JVM compilatori, il front-end e back-end vengono eseguiti in tempi diversi.Il front-end è eseguito a tempo di compilazione, a produrre IL che è effettivamente spediti ai clienti.Il back-end è poi racchiuso in un componente separato che viene richiamato in fase di runtime.

Quindi, questo porta alternativo domanda, "Quali sono i benefici di ritardare il back-end di compilazione fino alla fase di esecuzione"?

La risposta è:"Dipende".

Ritardando di back-end di compilazione fino alla fase di runtime, è possibile anche la spedizione di una serie di binari che può essere eseguito su più piattaforme hardware.Rende anche possibile per i programmi di trarre vantaggio dai miglioramenti nel back-end di compilazione tecnologia senza essere ridistribuiti.Essa può anche fornire una base efficace per l'implementazione di molte dynamic caratteristiche del linguaggio.Infine, offre la possibilità di introdurre la sicurezza e l'affidabilità dei vincoli tra compilati separatamente, collegati dinamicamente le librerie (dll) che non è possibile con anticipo macchina per la compilazione di codice.

Tuttavia, ci sono anche disegnare effettua.L'analisi necessarie per attuare la vasta ottimizzazioni del compilatore può essere costoso.Questo significa che "JIT" back end sarà spesso fare a meno di ottimizzazioni rispetto upfront backend fare.Questo può compromettere le prestazioni.Inoltre, la necessità di richiamare il compilatore in fase di runtime, aumenta anche il tempo necessario per caricare i programmi.I programmi creati con "upfront" compilatori non hanno questi problemi.

In primo luogo il codice macchina non è la più bassa forma di istruzioni di una cpu.Oggi le CPU x86 stessi interpretare il set di istruzioni X86 in un altro formato interno utilizzando microcodice.Le uniche persone che effettivamente programma di microcodice sono i chip di sviluppatore ingegnere tipi, che fedelmente e indolore emulare l'eredità di istruzioni x86 chip per ottenere le massime prestazioni utilizzando tecnologie di oggi.

Sviluppatore tipi sono sempre stati l'aggiunta di ulteriori strati di astrazioni a causa della potenza e caratteristiche che portano.Dopo tutte le astrazioni meglio consentire nuove applicazioni per essere scritto più rapidamente e in modo affidabile.Le aziende non si preoccupano che cosa o come codice sembra che solo desidera che il lavoro fatto rapidamente e in modo affidabile.Non importa se la versione C di un'applicazione richiede pochi millisecondi in meno, ma finisce per prendere il doppio del tempo per sviluppare ?

La velocità domanda è quasi un non-argomento, come molte applicazioni aziendali che servono milioni di persone sono scritti in piattaforme e linguaggi come java - ad esempio GMail, GMaps.Dimenticare che linguaggio/piattaforma è più veloce.Che cosa è più importante è che si utilizza la corretta algoritmi e scrivere efficiente il codice e ottenere il lavoro fatto.

I processori AMD e Intel hanno entrambi architettura x86, se si desidera eseguire il programma c/c++ su un'architettura diversa, devi usare un compilatore che l'architettura, lo stesso binario eseguibile, di non correre tra diverse architetture di processore.

So che Java VM versioni praticamente su qualsiasi sistema operativo, ma c'è un CLR per altri sistemi operativi oltre a Windows?

Mono

In un modo molto semplificato, perché Intel e AMD implementa lo stesso linguaggio assembly, con lo stesso numero di registro, ecc ecc...

Così il compilatore C compila il codice per funzionare su Linux.Assemblaggio con Linux ABI, così come lungo come compilare il programma viene eseguito su Linux, su assembler x86, e la funzione di firma, quindi tutto è dandy.

Ora che il codice compilato, e il bastone su di esso, dire Linux/PPC (ad es.Linux su un vecchio iBook).Che non sta andando a lavorare.Dove, come un programma Java sarebbe perché la JVM è stato implementato su Linux/PPC della piattaforma.

Assemblea lingua oggigiorno è praticamente un'altra interfaccia che un programmatore può programmare per.x86 (32-bit) che consente l'accesso eax,ebx,ecx,edx per uso generale registri integer, e f00-f07 floating point.Dietro le quinte, la CPU ha in realtà centinaia di registri, e confusa, che roba intorno a spremere le prestazioni fuori.

Hai ragione nella tua analisi, java o C# sono stati progettati per la compilazione diretta per funzionare su qualsiasi macchina, e probabilmente sarebbe più veloce se lo hanno fatto.Ma la macchina virtuale approccio dà il controllo completo dell'ambiente in cui il codice viene eseguito, il VM crea una sandbox sicuro che solo consente ai comandi con il diritto di accesso di sicurezza per eseguire potenzialmente dannosi codice - come cambiare la password, o l'aggiornamento di un HD di avvio.Ci sono molti altri vantaggi, ma il killer ragione.Non è possibile ottenere una StackOverflow in C# ...

Penso che la premessa della tua domanda è valido, non siamo certo i primi a porre questa domanda.In modo da controllare http://llvm.org per vedere un approccio alternativo (che ora è un progetto in corso?o sponsorizzati da Apple)

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