QNA > Q > Qual È La Differenza Tra Bytecode, Codice Nativo, Codice Macchina E Codice Assembly?

Qual è la differenza tra bytecode, codice nativo, codice macchina e codice assembly?

Il bytecode è un linguaggio intermedio che viene generato dal compilatore ed è successivamente interpretato o compilato just-in-time da un ambiente runtime. Non è tipicamente un linguaggio leggibile dall'uomo, e non rappresenta l'effettivo linguaggio macchina direttamente eseguibile su qualsiasi hardware CPU esistente. Il termine bytecode è spesso attribuito al linguaggio intermedio generato da un compilatore Java, ma è talvolta usato per riferirsi al codice intermedio di altri linguaggi. Altri esempi di linguaggi intermedi includono CIL (generato da C#, VB . NET, e altri linguaggi . NET) e p-Code (generato da UCSD Pascal). Il codice in linguaggio intermedio può essere eseguito in qualsiasi combinazione hardware/OS, finché l'ambiente di esecuzione richiesto è disponibile per quella combinazione hardware/OS.

Sia il codice nativo che il codice macchina si riferiscono alle istruzioni del linguaggio macchina che sono direttamente eseguibili sull'hardware della CPU esistente. Viene generato da un compilatore (per il codice sorgente in linguaggio di alto livello) o da un assemblatore (per il codice sorgente in linguaggio assembly. Non è tipicamente considerato un linguaggio leggibile dall'uomo. Il codice macchina è specifico per un'architettura della CPU. Non può essere eseguito su una CPU con un'architettura diversa.

Il codice assembly è un codice sorgente leggibile dall'uomo (testo) che rappresenta istruzioni e dati in linguaggio macchina. È considerato un linguaggio di basso livello. Viene convertito (tradotto) dalla forma di testo leggibile dall'uomo in istruzioni e dati in linguaggio macchina binario usando un programma chiamato assemblatore. Il codice in linguaggio assembly è specifico per un'architettura CPU. Ogni architettura CPU ha un unico set di istruzioni in linguaggio assembly, e alcune architetture hanno assemblatori che usano diversi dialetti per la stessa architettura.

Dunque, diciamo che avete scritto un programma nel linguaggio di programmazione di alto livello Java. Lo compilate e vi ritrovate con il bytecode. Quando eseguite il programma, la JVM (Java Virtual Machine) interpreta le istruzioni del bytecode o le compila just-in-time in codice macchina (codice nativo) per l'hardware su cui state girando. Portate il file eseguibile su un'altra combinazione hardware/OS, e verrà eseguito lì finché ci sarà una JVM presente.

Ora, diciamo che avete scritto un programma nel linguaggio di programmazione di alto livello C (sì, C è un linguaggio di alto livello). Lo si compila e lo si collega e si ottiene il codice nativo (cioè il codice macchina). Quando si esegue il programma, le istruzioni del linguaggio macchina vengono eseguite direttamente sull'hardware della CPU. Se volete che il programma venga eseguito su un'architettura di CPU diversa, dovete compilarlo con un compilatore diverso (o lo stesso compilatore con opzioni diverse), per generare codice macchina per quella nuova CPU di destinazione.

Se non avete un compilatore di linguaggio di alto livello per la vostra CPU di destinazione, ma avete a disposizione un assemblatore, potete scrivere il vostro programma in linguaggio assembly per quell'architettura CPU, assemblarlo e collegarlo e finire con le istruzioni in linguaggio macchina eseguite direttamente sull'hardware della CPU. Se volete che il programma venga eseguito su un'architettura CPU diversa, dovete riscrivere il programma nel linguaggio assembly che corrisponde alla vostra nuova CPU di destinazione, e poi assemblarlo e collegarlo, per generare codice macchina per quella nuova CPU di destinazione.

Di Josefina

Grand Theft Auto 4 è disponibile per la PS4? :: Il linguaggio assembly è diverso tra i sistemi operativi?
Link utili