Progettazione del compilatore - Panoramica
I computer sono un mix equilibrato di software e hardware. L'hardware è solo un pezzo di dispositivo meccanico e le sue funzioni sono controllate da un software compatibile. L'hardware comprende le istruzioni sotto forma di carica elettronica, che è la controparte del linguaggio binario nella programmazione del software. Il linguaggio binario ha solo due alfabeti, 0 e 1. Per istruire, i codici hardware devono essere scritti in formato binario, che è semplicemente una serie di 1 e 0. Scrivere tali codici sarebbe un compito difficile e macchinoso per i programmatori di computer, motivo per cui abbiamo compilatori per scrivere tali codici.
Sistema di elaborazione del linguaggio
Abbiamo imparato che qualsiasi sistema informatico è costituito da hardware e software. L'hardware comprende un linguaggio, che gli esseri umani non possono capire. Quindi scriviamo programmi in un linguaggio di alto livello, che è più facile da capire e ricordare. Questi programmi vengono quindi inseriti in una serie di strumenti e componenti del sistema operativo per ottenere il codice desiderato che può essere utilizzato dalla macchina. Questo è noto come Language Processing System.
Il linguaggio di alto livello viene convertito in linguaggio binario in varie fasi. UNcompilerè un programma che converte il linguaggio di alto livello in linguaggio assembly. Allo stesso modo, un fileassembler è un programma che converte il linguaggio assembly in linguaggio a livello di macchina.
Cerchiamo prima di capire come un programma, utilizzando il compilatore C, viene eseguito su una macchina host.
L'utente scrive un programma in linguaggio C (linguaggio di alto livello).
Il compilatore C compila il programma e lo traduce in un programma assembly (linguaggio di basso livello).
Un assemblatore quindi traduce il programma di assemblaggio in codice macchina (oggetto).
Uno strumento linker viene utilizzato per collegare tutte le parti del programma insieme per l'esecuzione (codice macchina eseguibile).
Un caricatore li carica tutti in memoria e quindi il programma viene eseguito.
Prima di immergerci direttamente nei concetti di compilatori, dovremmo comprendere alcuni altri strumenti che lavorano a stretto contatto con i compilatori.
Preprocessore
Un preprocessore, generalmente considerato come parte del compilatore, è uno strumento che produce input per i compilatori. Si occupa di elaborazione macro, aumento, inclusione di file, estensione del linguaggio, ecc.
Interprete
Un interprete, come un compilatore, traduce un linguaggio di alto livello in un linguaggio macchina di basso livello. La differenza sta nel modo in cui leggono il codice sorgente o l'input. Un compilatore legge l'intero codice sorgente in una volta, crea token, controlla la semantica, genera codice intermedio, esegue l'intero programma e può richiedere molti passaggi. Al contrario, un interprete legge un'istruzione dall'input, la converte in un codice intermedio, la esegue, quindi prende l'istruzione successiva in sequenza. Se si verifica un errore, un interprete interrompe l'esecuzione e lo segnala. mentre un compilatore legge l'intero programma anche se incontra diversi errori.
Assemblatore
Un assemblatore traduce i programmi in linguaggio assembly in codice macchina. L'output di un assemblatore è chiamato file oggetto, che contiene una combinazione di istruzioni macchina così come i dati richiesti per inserire queste istruzioni in memoria.
Linker
Linker è un programma per computer che collega e unisce vari file oggetto insieme per creare un file eseguibile. Tutti questi file potrebbero essere stati compilati da assemblatori separati. Il compito principale di un linker è cercare e individuare moduli / routine referenziati in un programma e determinare la posizione di memoria in cui verranno caricati questi codici, facendo in modo che l'istruzione del programma abbia riferimenti assoluti.
Caricatore
Loader è una parte del sistema operativo ed è responsabile del caricamento dei file eseguibili in memoria e della loro esecuzione. Calcola la dimensione di un programma (istruzioni e dati) e crea spazio di memoria per esso. Inizializza vari registri per avviare l'esecuzione.
Cross-compilatore
Un compilatore che viene eseguito sulla piattaforma (A) ed è in grado di generare codice eseguibile per la piattaforma (B) è chiamato cross-compilatore.
Compilatore da origine a origine
Un compilatore che prende il codice sorgente di un linguaggio di programmazione e lo traduce nel codice sorgente di un altro linguaggio di programmazione è chiamato compilatore da sorgente a sorgente.