Che cos'è un progetto di compilatore? Tipi, strumenti di costruzione, esempio
Cos'è un compilatore?
Un compilatore è un programma per computer che aiuta a trasformare il codice sorgente scritto in un linguaggio di alto livello in un linguaggio macchina di basso livello. Traduce il codice scritto in un linguaggio di programmazione in un altro linguaggio senza modificare il significato del codice. Il compilatore rende efficiente anche il codice finale, che è ottimizzato per il tempo di esecuzione e lo spazio di memoria.
Il processo di compilazione include meccanismi di traduzione di base e rilevamento degli errori. Il processo del compilatore passa attraverso l'analisi lessicale, sintattica e semantica nel front-end e la generazione e l'ottimizzazione del codice nel back-end.
Caratteristiche dei compilatori
- Correttezza
- Velocità di compilazione
- Conservare il significato corretto del codice
- La velocità del codice di destinazione
- Riconoscere i costrutti di programmi legali e illegali
- Buona segnalazione/gestione degli errori
- Aiuto per il debug del codice
Tipi di compilatore
Di seguito sono riportati i diversi tipi di compilatore:
- Compilatori a passaggio singolo
- Compilatori a due passaggi
- Compilatori multipass
Compilatore a passaggio singolo
Nel codice sorgente del compilatore a passaggio singolo si trasforma direttamente in codice macchina. Ad esempio, il linguaggio Pascal.
Compilatore a due passaggi
Il compilatore a due passaggi è diviso in due sezioni, vale a dire.
- Fine frontale: Mappa il codice legale nella Rappresentanza Intermedia (IR).
- Fine posteriore: Mappa l'IR sulla macchina target
Il metodo del compilatore a due passaggi semplifica anche il processo di retargeting. Consente inoltre più front-end.
Compilatori multipass
Il compilatore multipass elabora più volte il codice sorgente o l'albero della sintassi di un programma. Ha diviso un programma di grandi dimensioni in più piccoli programmi e li ha elaborati. Sviluppa molteplici codici intermedi. Tutti questi multipass prendono come input l’output della fase precedente. Quindi richiede meno memoria. È noto anche come "Wide Compiler".
Compiti del compilatore
I principali compiti svolti dal Compilatore sono:
- Spezza il programma sorgente in pezzi e impone loro una struttura grammaticale
- Permette di costruire il programma di destinazione desiderato dalla rappresentazione intermedia e creare anche la tabella dei simboli
- Compila il codice sorgente e rileva gli errori in esso contenuti
- Gestire la memorizzazione di tutte le variabili e i codici.
- Supporto per la compilazione separata
- Leggi, analizza l'intero programma e traduci in termini semanticamente equivalenti
- Traduzione del codice sorgente in codice oggetto a seconda del tipo di macchina
Storia del compilatore
Importante punto di riferimento della storia del compilatore è il seguente:
- La parola "compilatore" fu usata per la prima volta all'inizio degli anni '1950 da Grace Murray Hopper.
- Il primo compilatore fu costruito da John Backum e il suo gruppo tra il 1954 e il 1957 a IBM.
- COBOL è stato il primo linguaggio di programmazione che è stato compilato su più piattaforme nel 1960
- Lo studio dei problemi di scansione e analisi è stato portato avanti negli anni '1960 e '1970 per fornire una soluzione completa.
Passi per i sistemi di elaborazione del linguaggio
Prima di approfondire il concetto di compilatori, è necessario comprendere alcuni altri strumenti che funzionano con i compilatori.
- preprocessore: Il preprocessore è considerato parte del compilatore. È uno strumento che produce input per il compilatore. Si occupa dell'elaborazione delle macro, dell'aumento, dell'estensione del linguaggio, ecc.
- Interprete: Un interprete è come il compilatore che traduce il linguaggio di alto livello in linguaggio macchina di basso livello. La differenza principale tra i due è che l'interprete legge e trasforma il codice riga per riga. Il compilatore legge l'intero codice in una sola volta e crea il codice macchina.
- Assembler: Traduce il codice del linguaggio assembly in un linguaggio comprensibile dalla macchina. Il risultato di output dell'assemblatore è noto come file oggetto che è una combinazione di istruzioni macchina e dei dati richiesti per archiviare queste istruzioni in memoria.
- link: Il linker ti aiuta a collegare e unire vari file oggetto per creare un file eseguibile. Tutti questi file potrebbero essere stati compilati con assemblatori separati. Il compito principale di un linker è cercare i moduli chiamati in un programma e scoprire la posizione di memoria in cui sono archiviati tutti i moduli.
- Caricatore: Il caricatore è una parte del sistema operativo, che esegue le attività di caricamento dei file eseguibili in memoria e di esecuzione. Calcola anche la dimensione di un programma che crea spazio di memoria aggiuntivo.
- Cross-compilatore: Un compilatore incrociato nella progettazione del compilatore è una piattaforma che ti aiuta a generare codice eseguibile.
- Compilatore da sorgente a sorgente: Il compilatore da sorgente a sorgente è un termine utilizzato quando il codice sorgente di un linguaggio di programmazione viene tradotto nel sorgente di un altro linguaggio.
Strumenti per la costruzione del compilatore
Gli strumenti di costruzione del compilatore sono stati introdotti quando le tecnologie informatiche si sono diffuse in tutto il mondo. Sono anche noti come compilatori-compilatori, generatori di compilatori o traduttori.
Questi strumenti utilizzano un linguaggio o un algoritmo specifico per specificare e implementare il componente del compilatore. Di seguito sono riportati gli esempi di strumenti di costruzione del compilatore.
- Generatori di scanner: questo strumento accetta espressioni regolari come input. Ad esempio LEX per Unix Operasistema di ting.
- Motori di traduzione diretti dalla sintassi: Queste strumenti software offrire un codice intermedio utilizzando l'albero di analisi. Ha l'obiettivo di associare una o più traduzioni a ciascun nodo dell'albero di analisi.
- Generatori di parser: Un generatore di parser accetta una grammatica come input e genera automaticamente un codice sorgente in grado di analizzare flussi di caratteri con l'ausilio di una grammatica.
- Generatori automatici di codice: prende il codice intermedio e lo converte in linguaggio macchina.
- Motori di flusso di dati: questo strumento è utile per l'ottimizzazione del codice. Qui, le informazioni vengono fornite dall'utente e il codice intermedio viene confrontato per analizzare qualsiasi relazione. È anche nota come analisi del flusso di dati. Ti aiuta a scoprire come i valori vengono trasmessi da una parte del programma a un'altra parte.
Perché usare un compilatore?
- Il compilatore verifica l'intero programma, quindi non ci sono errori di sintassi o semantici.
- Il file eseguibile è ottimizzato dal compilatore, quindi viene eseguito più velocemente.
- Consente di creare una struttura interna nella memoria.
- Non è necessario eseguire il programma sulla stessa macchina su cui è stato creato.
- Traduci l'intero programma in un'altra lingua.
- Genera file su disco.
- Collegare i file in un formato eseguibile.
- Verifica la presenza di errori di sintassi e tipi di dati.
- Ti aiuta a migliorare la tua comprensione della semantica del linguaggio.
- Aiuta a gestire i problemi di prestazioni linguistiche.
- Opportunità per un progetto di programmazione non banale.
- Le tecniche utilizzate per costruire un compilatore possono essere utili anche per altri scopi.
Applicazione dei compilatori
- La progettazione del compilatore aiuta la completa implementazione dei linguaggi di programmazione di alto livello.
- Supporta l'ottimizzazione per computer Archiparallelismo della tecnica.
- Progettazione di nuove gerarchie di memoria delle macchine.
- Ampiamente usato per tradurre programmi.
- Utilizzato con altri strumenti di produttività software.
Sommario
- Un compilatore è un programma per computer che aiuta a trasformare il codice sorgente scritto in un linguaggio di alto livello in un linguaggio macchina di basso livello.
- Correttezza, velocità di compilazione, preservazione del significato corretto del codice sono alcune caratteristiche importanti della progettazione del compilatore.
- I compilatori sono divisi in tre parti 1) Compilatori a passaggio singolo 2) Compilatori a due passaggi e 3) Compilatori multipass.
- Il termine "compilatore" fu usato per la prima volta all'inizio degli anni '1950 da Grace Murray Hopper.
- Le fasi del sistema di elaborazione del linguaggio sono: preprocessore, interprete, assemblatore, linker/caricatore.
- Strumenti importanti per la costruzione di compilatori sono: 1) Generatori di scanner, 2) Motori di traduzione diretti dalla sintassi, 3) Generatori di parser, 4) Generatori automatici di codice.
- Il compito principale del compilatore è verificare l'intero programma, quindi non ci sono errori di sintassi o semantici.