C'è sempre stato un aspetto sfocato nel rispondere a questa domanda.
Qualsiasi lingua richiede un runtime standard. Ad esempio, non puoi eseguire nessun programma C senza alcun tipo di runtime. La piattaforma non sa come chiamare main
- la libreria di runtime deve fornire una funzione entry-point chiamata in base alle convenzioni della piattaforma, analizza i parametri della riga di comando e chiama main
, quindi fa qualsiasi cosa la piattaforma si aspetta di fornire il valore di uscita.
Poiché non esiste una convenzione universale per il modo in cui tutte le piattaforme chiamano il punto di ingresso di un programma, il runtime deve colmare tale lacuna in qualsiasi linguaggio che possa essere eseguito su più piattaforme.
Il runtime non è definito in base allo standard di lingua (dove esiste uno standard ufficiale), tanto quanto al compilatore. Ad esempio, poche o nessuna lingua definiscono i dettagli delle convenzioni di chiamata per le funzioni (libreria standard o altro) perché questi dettagli dipendono strongmente dalla piattaforma. Quindi, sebbene l'insieme di tipi e funzioni di libreria e il loro comportamento possano essere definiti da uno standard, molti dettagli di implementazione non lo sono.
Possono esserci anche interazioni sorprendenti tra il compilatore e la libreria. A volte, quando si importa una libreria, il compilatore non fa riferimento a nessun tipo di header / lib o modulo precompilato o qualsiasi altra cosa - il compilatore sostituisce le chiamate con implementazioni integrate, solitamente per motivi di efficienza.
Tuttavia, è normalmente possibile (e talvolta abbastanza pratico) sostituire la maggior parte o tutta la libreria standard, fino alla funzione del punto di ingresso. Per alcune parti richiede la codifica di un assemblatore. Alcuni bit potrebbero richiedere l'impostazione di alcune opzioni, impedendo l'utilizzo di tali implementazioni integrate. Ma la sostituzione è spesso possibile.
Alcune lingue hanno intrinsecamente un legame così stretto tra il compilatore e le librerie fornite che l'unico modo sensato di usare una libreria alternativa è di usare anche un compilatore alternativo. Questo è probabilmente sempre più il caso in questi giorni, con gli stretti legami tra framework come .NET e la piattaforma Java e i linguaggi supportati come C # e, ovviamente, Java.
- Oops - ovviamente è molto facile sostituire l'intera piattaforma .NET o Java con un'implementazione alternativa mentre si usano ancora gli stessi compilatori, perché le piattaforme stesse sono standardizzate - fino al codice della macchina virtuale. Siamo spiacenti.
Un contesto in cui probabilmente è ancora relativamente probabile vedere un runtime di sostituzione completo nei sistemi embedded, ma non intendo i telefoni cellulari. Più probabile, lavatrici.
Uno dei principi di Bjarne Stroustrups per C ++ era che non ci dovrebbe essere nulla che la lingua possa fare che il programmatore non possa fare. Ad esempio, l'overloading dell'operatore è lì in modo che gli sviluppatori di librerie possano supportare gli operatori con tipi: in C, solo i tipi predefiniti per il compilatore possono supportare gli operatori. Ci sono casi in cui questo richiede una programmazione di assemblatori - ovviamente, è impossibile scrivere una libreria per fornire accesso O / S di basso livello e funzionalità I / O direttamente in C ++ a meno che non ci sia già un modo per fornire accesso O / S a basso livello e capacità di I / O.
Quindi questo è fondamentalmente - non puoi completamente rinunciare ad avere un runtime, ma puoi scegliere di non utilizzare gran parte di esso, e potresti essere in grado di sostituire le parti che puoi fare a meno, o addirittura sostituire l'intera cosa.