What is run-time support required by a language?
Analizziamo in dettaglio alcune delle funzionalità che coinvolgono vari livelli di supporto al runtime.
Gestione della memoria
La gestione della memoria in molte lingue implica funzioni di linguaggio come new
e garbage collection. La raccolta dei dati inutili richiede la traccia degli oggetti per identificare le entità dal vivo o quelle morte. Questo in genere richiede il supporto al runtime che implica la scansione di stack e oggetti heap.
Al contrario, in C, la gestione della memoria è manuale e consiste in malloc & gratis, che sono le routine di libreria che potresti scrivere autonomamente in termini di chiamata al sistema operativo per ottenere un heap (anche se come scrive @Mason, forse non conforme agli standard).
Gestione errori e amp; recupero
In molte lingue, la gestione degli errori viene eseguita tramite eccezioni. Lanciare (stack unwinding,) e catching, in particolare, richiede il supporto al runtime, coinvolgendo il coordinamento tra il compilatore e lo stack di runtime.
Al contrario, la gestione degli errori in C è esplicita; lo sbobinamento dello stack è supportato da chiamate in libreria, anche se le routine specializzate, come longjmp, piuttosto che la gestione delle eccezioni più complessa.
Gestione tipi dinamici
Caricare e scaricare classi, classi di caricamento lazy, l'inizializzazione della classe richiede in genere un supporto di runtime. Casting, ad es. down-casting o casting di interfacce richiedono generalmente qualche supporto di runtime. Riflessione e amp; la serializzazione, generalmente richiede anche qualche supporto di runtime. Il runtime traccia i campi e il layout delle classi caricate.
Al contrario, C non fornisce il caricamento dinamico della classe: il caricamento dinamico della libreria può essere supportato dalle chiamate del sistema operativo senza un supporto di runtime significativo dal linguaggio C, e C non ha cast di runtime, o funzioni di riflessione o serializzazione. Ai campi vengono assegnati offset in fase di compilazione; la dimensione completa delle strutture è nota al momento della compilazione, quindi non è richiesto il supporto al runtime.
Operazioni aritmetiche
La maggior parte delle lingue fornisce tipi di dati in virgola mobile; alcuni forniscono tipi decimali nella lingua e altri forniscono un controllo di overflow e underflow (in genere coordinato con i meccanismi di gestione delle eccezioni delle lingue).
C supporta operazioni in virgola mobile; a volte questi sono supportati da emulazioni del sistema operativo di hardware in virgola mobile, altre volte da librerie di lingue di basso livello note al compilatore.
Per C altre operazioni sono fornite da routine di libreria più ordinarie (che non richiedono necessariamente la modifica del compilatore da fornire) piuttosto che funzioni di linguaggio incorporate.