Domanda

Sembra che qualcosa si può fare con il bytecode si può fare facilmente e molto più velocemente in codice nativo.In teoria, si potrebbe anche mantenere la piattaforma di linguaggio e di indipendenza, mediante la distribuzione di programmi e librerie in bytecode quindi la compilazione in codice nativo al momento dell'installazione, piuttosto che JITing di esso.

Quindi, in generale, quando si desidera eseguire il bytecode invece di quello nativo?

È stato utile?

Soluzione

Hank Shiffman da SGI ha detto (molto tempo fa, ma fino al vero):

Ci sono tre vantaggi di Java utilizzando il codice byte invece di andare a il codice nativo di sistema:

  1. La portabilità:Ogni tipo di computer che ha la sua unica istruzione set.Mentre alcuni processori includono il istruzioni per la loro predecessori, e ' generalmente vero che un programma che gira su un tipo di computer non verrà eseguito su qualsiasi altro.Aggiungi a i servizi forniti da il sistema, che ogni sistema viene descritto in il suo modo unico, e si dispone di un problema di compatibilità.In generale, si non posso scrivere e compilare un programma per un tipo di sistema ed eseguirlo su qualsiasi altri senza un sacco di lavoro.Java viene questa limitazione inserendo la sua macchina virtuale tra il applicazione e l'ambiente reale (computer + sistema operativo).Se un l'applicazione è compilato in Java byte codice e che il byte di codice viene interpretato allo stesso modo in ogni ambiente è possibile scrivere un programma che funziona su tutte le diverse piattaforme in cui Java è supportato.(In teoria, comunque.In pratica ci sono sempre piccole incompatibilità in agguato per il programmatore.)

  2. Sicurezza:Uno di Java virtù è la sua integrazione con il Web.Carico una pagina web che utilizza Java nel tuo il browser e il codice Java è automaticamente scaricato ed eseguito.Ma cosa succede se il codice distrugge i file, se con malizia o sciatteria il programmatore di parte?Java impedisce scaricato applet da fare nulla di distruttivo, non consentendo operazioni potenzialmente pericolose.Prima di consentire l'esecuzione di codice è esaminato, per i tentativi di bypass di sicurezza.Verifica che i dati è utilizzato in modo coerente:codice modifica di una voce di dati come un numero intero ad un certo punto e poi tenta di utilizzarlo come un puntatore in un momento successivo saranno catturati e impedita.(Il Java il linguaggio non permette il puntatore aritmetica, quindi non è possibile scrivere Java il codice per fare quello che abbiamo appena descritto.Tuttavia, non c'è nulla per impedire qualcuno di scrivere distruttivo byte codice utilizzando un esadecimale editor o anche la costruzione di un byte Java codice assembler.) In genere non è possibile analizzare un programma codice macchina prima dell'esecuzione e determinare se si fa qualcosa male.Trucchi, come la scrittura auto-modifica codice significa che il male le operazioni, potrebbe anche non esistere fino a quando più tardi.Ma Java byte code è stato progettato per questo tipo di convalida:si non ha le istruzioni di un dannoso programmatore di utilizzare per nascondere il loro assalto.

  3. Dimensioni:Il microprocessore del mondo RISC è generalmente preferibile oltre CISC.È meglio avere un piccolo set di istruzioni e utilizzare molti fast istruzioni per fare un lavoro che molte e complesse le operazioni poste in essere, come singole istruzioni.RISC disegni richiedono un minor numero di porte su chip per implementare le loro istruzioni, permettendo per più spazio per le condutture e gli altri le tecniche per rendere ogni istruzione più veloce.In un interprete, tuttavia, nessuno di questi aspetti.Se si desidera implementare una singola istruzione per il istruzione switch con una variabile lunghezza a seconda del numero di casi di clausole, non c'è nessun motivo per non fare così.In realtà, un complesso set di istruzioni è un vantaggio per un web-based lingua:significa che la stessa il programma sarà più piccolo (meno istruzioni di maggiore complessità), il che significa meno tempo per il trasferimento tutta la nostra velocità di rete limitate.

Così, quando si considera il byte code vs nativo, pensare a quali compromessi si vuole fare tra portabilità, sicurezza, dimensione e velocità di esecuzione.Se la velocità è l'unico fattore importante, il go native.Se tutti gli altri sono più importanti, di andare con il bytecode.

Aggiungo che il mantenimento di una serie di OS e di architettura mirati compilation lo stesso codice di base per ogni versione può essere molto noioso.E ' una grande vittoria per utilizzare lo stesso bytecode Java su più piattaforme e sono "solo lavoro".

Altri suggerimenti

Le prestazioni di essenzialmente qualsiasi programma di migliorare se viene compilato, sottoscritto con l'analisi e i risultati alimentati indietro nella compilatore per un secondo passaggio.I percorsi di codice che vengono effettivamente utilizzati saranno più aggressivo ottimizzato, loop svolto esattamente gradi e il caldo percorsi di istruzione organizzati per massimizzare I$ hits.

Tutta roba buona, ma è quasi mai fatto, perché è fastidioso per passare attraverso tanti passaggi per creare un file binario.

Questo è il vantaggio di eseguire il bytecode per un po ' prima che la compilazione in codice nativo:informazioni di profilo, è automaticamente disponibile.Il risultato dopo Appena In Tempo di compilazione è altamente ottimizzato il codice nativo per i dati specifici del programma di trattamento.

Essere in grado di eseguire il bytecode consente anche di più aggressivo nativo di ottimizzazione di un compilatore statico potrebbe tranquillamente usare.Per esempio, se uno degli argomenti di una funzione è nota per essere sempre NULLO, la gestione di tale argomento può essere semplicemente omesse da codice nativo.Ci sarà un breve controllo di validità degli argomenti della funzione di prologo, se l'argomento non è NULLO il VM interrompe nuovamente il bytecode e avvia il profiling di nuovo.

Bytecode crea un ulteriore livello di indirezione.

I vantaggi di questo ulteriore livello di riferimento indiretto sono:

  • Indipendenza dalla piattaforma
  • Possibile creare qualsiasi numero di linguaggi di programmazione (sintassi) e chiedi loro di compilare lo stesso bytecode.
  • Potrebbe facilmente creare croce lingua convertitori
  • x86, x64 e IA64 non è più necessario essere compilato come separare i binari.Solo il corretto macchina virtuale deve essere installato.
  • Ogni OS ha semplicemente bisogno di creare una macchina virtuale e avrà il supporto per il programma stesso.
  • Appena in tempo di compilazione consente di aggiornare un programma solo la sostituzione di un singolo patch file di origine.(Molto utile per le pagine web)

Alcuni degli svantaggi:

  • Prestazioni
  • Più facile a decompilare

Tutte buone risposte, ma il mio caldo, pulsante, è stato colpito prestazioni.

Se il codice viene eseguito trascorre tutto il suo tempo di chiamata di libreria/routine di sistema - operazioni sui file, le operazioni di database, invio di messaggi di windows, quindi non importa molto se è JITted, perché la maggior parte del tempo dell'orologio è trascorso in attesa di quelli di livello inferiore per il completamento delle operazioni.

Tuttavia, se il codice contiene le cose che di solito chiamiamo "algoritmi", che deve essere veloce e non spendere molto tempo le funzioni di chiamata, e se questi sono usati abbastanza spesso di essere un problema di prestazioni, quindi JIT è molto importante.

Penso che sia semplicemente risposto alla tua stessa domanda:indipendenza dalla piattaforma.Piattaforma-indipendente bytecode è prodotta e distribuita per la sua piattaforma di destinazione.Quando viene eseguito, è rapidamente compilato in codice nativo, sia prima dell'inizio dell'esecuzione, o simultaneamente (Appena In Tempo).Java JVM e, presumibilmente, l' .NET runtime di operare su questo principio.

Qui: http://slashdot.org/developers/02/01/31/013247.shtml

Andate a vedere cosa i geek di Slashdot hanno da dire in proposito!Po ' datato, ma molto buoni commenti!

Idealmente, si sarebbe portatili bytecode che viene compilato Solo Nel Momento in codice nativo.Penso che il motivo bytecode interpreti esistere senza JIT è dovuto principalmente alla pratica fatto che il codice nativo di compilazione aggiunge la complessità di una macchina virtuale.Ci vuole tempo per costruire, eseguire il debug, e mantenere un componente aggiuntivo.Non tutti hanno il tempo o le risorse per rendere questo impegno.

Un fattore non secondario di sicurezza.È molto più facile verificare un interprete non crash di garantire lo stesso per il codice nativo.

Il terzo è la prestazione.Spesso può richiedere più tempo per generare il codice macchina di interpretare il bytecode per piccoli pezzi di codice che eseguire solo una volta.

La portabilità e l'indipendenza della piattaforma sono probabilmente i vantaggi più importanti del bytecode su codice nativo.

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