Java ha la JVM, che cosa ha C?


15

So che C ha un compilatore ma cosa determina le prestazioni di esecuzione?

Ad esempio in un blocco if else, cosa succede se il codice aveva solo tutti gli if invece che if elses, cosa determina che tutti gli if verranno eseguiti? In Java sarebbe la JVM, ma in C qual è la cosa del compilatore di esecuzione?


16
Una sfumatura utile da imparare è che le lingue sono solo lingue. È possibile creare un compilatore che accetta il codice C e lo fa funzionare nella JVM, ad esempio.
Telastyn,

10
+1. Questa è un'ottima domanda Non lo voterei per la sua ignoranza - è una meraviglia che altri studenti Java non lo chiedano.
Djechlin,

Puoi anche compilare Java in codice macchina ed evitare la JVM ...
AK_

2
Inoltre: linguaggio di programmazione! = Framework! = Libreria di runtime! = Compilatore! = Compilatore Just in Time! = Interperter
AK_25

Risposte:


17

In Java la macchina virtuale esegue il codice, ma i compilatori C generano il codice eseguito dalla macchina reale . Per essere precisi, in entrambi i casi il tuo programma finisce per essere convertito in codice macchina reale, ma nel caso di Java c'è un passaggio intermedio di compilazione in bytecode JVM.

Quindi i programmi Java vengono convertiti in istruzioni reali dalla JVM quando li carichi, mentre i programmi C sono già convertiti in istruzioni reali dal compilatore prima di essere eseguiti.


20
Esistono compilatori che accettano Java e producono codice macchina. Ad esempio Excelsior Jet . Esistono anche interpeter per C ( picoc ) che non generano mai codice eseguito da una macchina reale. Le lingue sono lingue. Le implementazioni sono implementazioni. Confondere i due può essere fonte di confusione per le persone.

6

Oltre al codice macchina, non esiste un linguaggio di programmazione che viene eseguito direttamente sull'hardware, nel senso che non è possibile alimentare il testo di origine letterale. Tutte le implementazioni reali devono tradurre il programma sorgente nella lingua della "macchina".

Per alcune implementazioni, è tradotto staticamente. Di solito chiamiamo queste implementazioni "compilate". Per altri, viene tradotto in una forma intermedia, che viene quindi tradotta in modo dinamico durante l'esecuzione del programma. Generalmente chiamiamo queste interpretazioni "interpretate". Esiste un continuum di possibilità tra questi e persino molte CPU moderne eseguono traduzioni dinamiche come parte del suo core di esecuzione.

Anche quando il tuo programma è compilato staticamente molto prima dell'esecuzione, a meno che tu non stia scrivendo il firmware, è raro che il codice compilato venga eseguito direttamente sul bare metal senza nulla che lo supporti. Il sistema operativo fornisce una macchina virtuale per i programmi dello spazio utente, spesso fornendo funzionalità come l'illusione di avere una CPU tutta per te. L'illusione di uno spazio di memoria piatto che potrebbe essere più grande della RAM fisica collegata alla macchina è persino chiamata "memoria virtuale".

Inoltre, anche quando stai programmando in C, c'è una macchina virtuale C! È tradizionalmente indicato come "runtime C" o abbreviato CRT.

Poiché C viene tradotto principalmente in codice assembly / macchina con largo anticipo (su alcune piattaforme, potrebbe esserci anche un codice thread e che può essere considerato parte della macchina virtuale), la macchina virtuale di solito deve solo gestire l'avvio e spegnimento.

L'avvio comporta in genere l'impostazione dello stack e dell'heap; il sistema operativo fornisce raramente questi per te, ed è compito del linguaggio di programmazione fornirli al programmatore. Su alcune piattaforme potrebbe esserci qualche inizializzazione della gestione del segnale, impostazione del thread "principale" in un ambiente multi-thread, esecuzione di costruttori globali nella remota possibilità che il programma sia stato collegato al codice C ++, gestione di librerie collegate dinamicamente, o lì potrebbe essere necessaria l'elaborazione per configurare argc / argv ed envp. Infine, CRT trasferisce il controllo al principale.

Per quanto riguarda l'arresto, molti sistemi operativi possono uccidere un processo in modo impuro, quindi l'arresto non deve fare molto. La cosa principale è elaborare le richieste atexit () per il caso in cui il programma si chiude in modo pulito.


2
Il runtime C e JVM sono animali completamente diversi. Il CRT è solo una libreria.
DeadMG

Ho modificato la risposta per rendere le cose un po 'più chiare. Per inciso, anche JVM e VirtualBox sono animali completamente diversi.
Pseudonimo il

@Pseudonimo: non proprio. Bene, ok, VirtualBox è un virtualizzatore, mentre la tipica JVM è un emulatore, ma se sostituisci ad esempio VirtualBox con QEmu nella tua frase, i due sono in realtà gli stessi.
Jörg W Mittag,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.