In che modo un compilatore è correlato al sistema di runtime?

1

Una rapida ricerca sul ruolo del compilatore mostra quanto segue:

A compiler is a special program that processes statements written in a particular programming language and turns them into machine language or "code" that a computer's processor uses.

Tuttavia, leggo anche che ogni lingua deve avere un sistema di runtime di destinazione e i programmi scritti in quella lingua vengono eseguiti nel contesto del sistema di runtime.

Aggiungendo i due, sembra che un compilatore converta i programmi in bit comprensibili dal sistema di runtime e il sistema di runtime agisce come agente che interpreta i bit, traducendoli nelle istruzioni del processore. È corretto? In caso contrario, in che altro modo sono correlati il compilatore e il sistema di runtime?

E se quanto sopra è corretto, implicherebbe quanto segue:

  1. due eseguibili compilati da programmi con la stessa logica scritta in lingue diverse non sarebbero identici
  2. una macchina media avrebbe dozzine di runtime che non sembra essere il caso.

Cosa mi manca qui?

    
posta Aadith 08.11.2017 - 23:09
fonte

2 risposte

6

two executables compiled from programs with identical logic written in different languages would not be identical

È vero!

an average machine would have dozens of runtimes which doesnt seem to be the case

In realtà è abbastanza comune avere diversi runtime installati su un sistema. Dipende solo da quante lingue hai installato. A volte parecchie lingue possono condividere un runtime comune (Java, JRuby, Jython, Scala, ..). Oppure puoi avere più versioni di una singola lingua che usano tutti tempi di esecuzione diversi. Ad esempio, esistono diverse implementazioni del runtime Java.

the runtime system acts as the agent interpreting the bits, translating them to the processor intructions. Is this correct? If not, how else are compiler and runtime system related?

Penso che tu stia confondendo i runtime con le macchine virtuali. Le macchine virtuali sono un aroma specifico del runtime.

Alcune implementazioni linguistiche compilano l'origine direttamente al codice macchina nativo per l'hardware fisico e il runtime è solo una libreria di funzioni che si occupa dei dettagli di manutenzione come l'organizzazione della memoria, l'inizializzazione del processo e l'I / O di basso livello. C, C ++, Go e Rust sono in genere implementati in questo modo.

Altre implementazioni linguistiche compilano l'origine per le istruzioni per una "macchina virtuale". In tal caso, il runtime è un eseguibile che implementa la macchina virtuale utilizzando le istruzioni per l'hardware nativo. Questo sembra essere il tipo di runtime a cui stai pensando. Java, Python e C # vengono solitamente implementati utilizzando macchine virtuali.

    
risposta data 08.11.2017 - 23:56
fonte
1

L'affermazione che ogni lingua ha bisogno di un runtime è falsa. Molti dei primi computer e molti piccoli processori embedded attuali hanno decodificatori di istruzioni hardware e consentono ai programmi compilati di scrivere codice macchina binario direttamente nei registri IO, senza tempi di esecuzione di alcun tipo dopo il caricamento del programma (a meno che non si voglia prendere in considerazione, ad esempio, il microcodice in un MC68000 o RTL per un processore software RISC FPGA come runtime).

Il problema è che questo tipo di codice è altamente non portatile.

    
risposta data 13.11.2017 - 10:36
fonte

Leggi altre domande sui tag