2012-01-19 17 views
5

È a mia conoscenza che il compilatore Java produce "codice byte", non "codice oggetto". Prima di tutto, è corretto?Java produce codice oggetto o codice byte?

Inoltre, questo è proprio quello che dice il mio libro, mi chiedevo perché questo è corretto. Qual è la differenza tra codice byte e codice oggetto?

+5

Java compilatore compila il codice sorgente in codice byte. Non ho mai sentito parlare di "codice oggetto" ancora. –

+1

un libro di uno dei tuoi professori? :) è stato scritto in inglese? – milan

risposta

15

Il codice di byte è solo il "codice oggetto" per Java Virtual Machine. Non è codice nativo (ad esempio x86). Ad essere onesti, di rado sento il termine "codice oggetto" al giorno d'oggi - in genere è più chiaro parlare in termini più specifici.

+0

Quindi il codice oggetto è codice nativo? – Bhaxy

+5

@Bhaxy: No, non l'ho detto. [Wikipedia] (http://en.wikipedia.org/wiki/Object_code) lo descrive come "ciò che produce un compilatore di computer". È un termine un po 'vago, ma direi che di solito è "una rappresentazione non testuale di un programma, che prende di mira le macchine piuttosto che gli umani". La "macchina" ha la JVM piuttosto che l'architettura nativa del computer su cui stai lavorando. –

+0

@Bhaxy si hai capito :) – reversiblean

2

Quando si compila un programma java, si passa al byte-code. Quando si esegue l'artefatto risultante, la JVM della piattaforma esegue quindi (bene, interpreta) il bytecode, trasformandolo in istruzioni a livello di macchina.

0

Java è indipendente dalla piattaforma. Quando si compila il codice sorgente Java viene convertito in codice byte e quando viene eseguita l'applicazione, il JRE sulla macchina client esegue il codice byte.

0

Il compilatore Java (javac.exe) accetta i file di origine Java (.java) come input e genera file bytecode (.class) Java (se il codice viene compilato correttamente). Quindi esegui Java Launcher (java.exe) e lo indirizza al tuo bytecode. Spetta quindi alla Java virtual machine (JVM) prendere il tuo codice per il resto del tempo e convertire il tuo bytecode in codice macchina (o nativo).

Si può pensare ad esso come codice oggetto essendo più vicino al codice macchina, e bytecode come più lontano dal codice macchina. Inoltre, bytecode è portabile (che è uno dei grandi vantaggi del linguaggio Java), mentre il codice macchina deve essere "portato" mediante un processo manuale (cioè ri-compilazione per una diversa piattaforma o architettura di destinazione).

Il codice oggetto è "quasi" codice macchina, è un po 'nel mezzo. È come una porzione del codice macchina risultante. A causa della portabilità del linguaggio Java, non è possibile fare in modo che il compilatore traduca il codice sorgente direttamente nel codice macchina. Perché il codice macchina deve essere diverso per diverse piattaforme e architetture. Se qualcuno esegue il tuo bytecode su Windows, JVM tradurrà il tuo bytecode in un tipo di codice macchina. Se qualcuno esegue il tuo bytecode su un Mac OS X, JVM tradurrà il tuo bytecode in un diverso tipo di codice macchina.

Si può pensare alla JVM come interprete per il proprio bytecode. Anche se tecnicamente si chiama compilation JIT (Just In Time). La JVM fa parte di JRE (Java Runtime Environment) e mentre i programmi Java sono praticamente indipendenti dalla piattaforma (qualsiasi sistema che esegue la JVM può anche eseguire programmi Java), la parte JVM di JRE dipende dalla piattaforma.

La versione corta:

  • Java compilatore produce bytecode (compilation a metà strada, indipendente dalla piattaforma, non è possibile eseguire ancora).
  • La macchina virtuale Java produce codice macchina.
  • Il codice oggetto è una parte del codice macchina risultante.
  • Bytecode diventa codice oggetto all'ora JIT.
  • Il codice oggetto diventa codice macchina (può essere eseguito il resto della compilazione, dipendente dalla piattaforma ).

Questo potrebbe non essere accurato al 100% poiché sto anche iniziando a imparare questa roba.Ma questa è la mia comprensione di questo concetto fino ad ora. Spero che aiuti.

1

Il codice oggetto C è in una forma in grado di interpretare solo il sistema operativo su cui è stato compilato.

codice C - (. Per esempio gcc)> compilatore C -> codice oggetto -> uscite compilatore os

Il C Oggetto codice per il sistema operativo che è stato scritto per. Se vuoi che il tuo codice C sia eseguito su un'altra macchina, devi ricompilarlo.
Il codice C compilato su Windows non funziona su linux senza ricompilare.

Java code-> Java compilatore (javac) -> codice di byte -> JVM

Il compilatore Java mette fuori bytecode che gira sulla sua JVM. Tutte le idiosincrasie del sistema operativo sono spinte verso il basso nella JVM, nascoste dal codice Java. Quindi, fintanto che il sistema operativo ha una JVM, è possibile eseguire bytecode Java su di esso senza ricompilare. Il codice Java compilato su Windows può essere eseguito su qualsiasi altro sistema operativo con la stessa versione di JVM.

riferiscono anche difference between object code and byte code