Java ha JVM, cosa ha C?

15

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

Per esempio in un blocco if else, e se il codice avesse solo ifs invece di if elses, cosa determina che tutti i if saranno eseguiti? In Java sarebbe la JVM, ma in C qual è la cosa del compilatore di esecuzione?

    
posta scerrecrow 24.02.2015 - 22:03
fonte

2 risposte

16

In Java la macchina virtuale esegue il codice, ma i compilatori C generano il codice che viene 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'è una fase intermedia di compilazione in bytecode JVM.

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

    
risposta data 24.02.2015 - 22:14
fonte
6

Oltre al codice macchina, non esiste un linguaggio di programmazione che venga 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. Solitamente chiamiamo queste implementazioni "compilate". Per altri, è tradotto in una forma intermedia, che viene poi tradotta dinamicamente mentre il programma viene eseguito. Solitamente chiamiamo queste implementazioni "interpretate". Esiste un continuum di possibilità tra questi e anche molte CPU moderne eseguono la traduzione dinamica come parte del core di esecuzione.

Anche quando il tuo programma viene 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 alcun supporto. Il sistema operativo fornisce una macchina virtuale per i programmi dello spazio utente, spesso fornendo tali caratteristiche 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 è anche chiamata "memoria virtuale".

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

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

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

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

    
risposta data 24.02.2015 - 23:49
fonte

Leggi altre domande sui tag