Tutorial sulla progettazione di compilatori: Cos’è, Tipi, Strumenti, 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 cambiare il significato del codice. Il compilatore rende anche efficiente 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 il rilevamento degli errori. Il processo di compilazione passa attraverso l’analisi lessicale, sintattica e semantica al front-end, e la generazione e l’ottimizzazione del codice al back-end.

In questo tutorial sulla progettazione di compilatori, imparerete

  • Che cos’è un compilatore?
  • Features of Compilers
  • Types of Compiler
  • Tasks of Compiler
  • History of Compiler
  • Steps for Language processing systems
  • Compiler Construction Tools
  • Why use a Compiler?
  • Application of Compilers

Features of Compilers

  • Correctness
  • Speed of compilation
  • Preserve the correct the meaning of the code
  • The speed of the target code
  • Recognize legal and illegal program constructs
  • Good error reporting/handling
  • Code debugging help

Types of Compiler

Following are the different types of Compiler:

  • Single Pass Compilers
  • Two Pass Compilers
  • Multipass Compilers

Single Pass Compiler

Single Pass Compiler
Single Pass Compiler

In single pass Compiler source code directly transforms into machine code. For example, Pascal language.

Two Pass Compiler

Two Pass Compiler
Two Pass Compiler

Two pass Compiler is divided into two sections, viz.

  1. Front end: It maps legal code into Intermediate Representation (IR).
  2. Back end: It maps IR onto the target machine

The Two pass compiler method also simplifies the retargeting process. It also allows multiple front ends.

Multipass Compilers

Multipass Compilers
Multipass Compilatori

Il compilatore multipass processa il codice sorgente o l’albero sintattico di un programma più volte. Divide un grande programma in più programmi piccoli e li elabora. Sviluppa più codici intermedi. Tutti questi multipass prendono l’output della fase precedente come input. Quindi richiede meno memoria. È anche conosciuto come ‘Wide Compiler’.

Compiti del compilatore

I compiti principali eseguiti dal compilatore sono:

  • Smembra il programma sorgente in pezzi e vi impone una struttura grammaticale
  • Consente di costruire il programma target desiderato dalla rappresentazione intermedia e crea anche la tabella dei simboli
  • Compila il codice sorgente e rileva gli errori in esso
  • Gestisce la memorizzazione di tutte le variabili e dei codici.
  • Supporta la compilazione separata
  • Legge, analizza l’intero programma e lo traduce in modo semanticamente equivalente
  • Traduce il codice sorgente in codice oggetto a seconda del tipo di macchina

Storia del compilatore

Importanti punti di riferimento della storia del compilatore sono i seguenti:

  • La parola “compilatore” fu usata per la prima volta nei primi anni ’50 da Grace Murray Hopper
  • Il primo compilatore fu costruito da John Backum e dal suo gruppo tra il 1954 e il 1957 alla IBM
  • COBOL fu il primo linguaggio di programmazione che fu compilato su più piattaforme nel 1960
  • Lo studio dei problemi di scansione e parsing sono stati perseguiti negli anni ’60 e ’70 per fornire una soluzione completa

Passi per sistemi di elaborazione del linguaggio

Prima di conoscere il concetto di compilatori, bisogna prima capire alcuni altri strumenti che lavorano con i compilatori.

Steps for Language processing systems
Steps for Language processing systems

  • Preprocessore: Il preprocessore è considerato come una parte del compilatore. È uno strumento che produce input per il compilatore. Si occupa dell’elaborazione delle macro, dell’incremento, dell’estensione del linguaggio, ecc.
  • Interprete: Un interprete è come un compilatore che traduce un linguaggio di alto livello in un linguaggio macchina di basso livello. La differenza principale tra i due è che l’interprete legge e trasforma il codice linea per linea. Il compilatore legge l’intero codice in una volta sola e crea il codice macchina.
  • Assemblatore: Traduce il codice in linguaggio assembly in un linguaggio comprensibile alla macchina. Il risultato dell’assemblatore è conosciuto come un file oggetto che è una combinazione di istruzioni macchina così come i dati richiesti per memorizzare queste istruzioni in memoria.
  • Linker: Il linker 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 è quello di cercare i moduli chiamati in un programma e di trovare la posizione di memoria dove tutti i moduli sono memorizzati.
  • Caricatore: Il caricatore è una parte del sistema operativo, che esegue i compiti di caricare i file eseguibili in memoria ed eseguirli. Calcola anche la dimensione di un programma che crea spazio di memoria aggiuntivo.
  • Compilatore incrociato: Un compilatore incrociato nella progettazione di compilatori è una piattaforma che aiuta a generare codice eseguibile.
  • Compilatore source-to-source: Compilatore source-to-source è un termine usato quando il codice sorgente di un linguaggio di programmazione è tradotto nel sorgente di un altro linguaggio.

Strumenti di costruzione del compilatore

Gli strumenti di costruzione del compilatore sono stati introdotti quando le tecnologie legate al computer si sono diffuse in tutto il mondo. Sono anche conosciuti come compilatori, generatori di compilazione o traduttori.

Questi strumenti usano un linguaggio o un algoritmo specifico per specificare e implementare il componente del compilatore. Di seguito sono riportati gli esempi di strumenti di costruzione di compilatori.

  • Generatori di scanner: Questo strumento prende espressioni regolari come input. Per esempio LEX per il sistema operativo Unix.
  • Motori di traduzione sintassi-diretta: Questi strumenti software offrono un codice intermedio utilizzando l’albero di parsing. Hanno l’obiettivo di associare una o più traduzioni ad ogni nodo dell’albero di parsing.
  • Generatori di parser: Un generatore di parser prende una grammatica come input e genera automaticamente codice sorgente che può analizzare flussi di caratteri con l’aiuto 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 sono fornite dall’utente e il codice intermedio viene confrontato per analizzare qualsiasi relazione. È anche conosciuto come analisi del flusso di dati. 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 strutture interne in memoria
  • Non c’è bisogno di eseguire il programma sulla stessa macchina in cui è stato costruito
  • Tradurre l’intero programma in altre lingue
  • Generare file su disco
  • Collega i file in un formato eseguibile
  • Controlla gli errori di sintassi e i tipi di dati
  • Aiuta a migliorare la comprensione della semantica del linguaggio
  • Aiuta a gestire i problemi di performance del linguaggio
  • Opportunità per un nontrivial programming project
  • The techniques used for constructing a compiler can be useful for other purposes as well

Application of Compilers

  • Compiler design helps full implementation Of High-Level Programming Languages
  • Support optimization for Computer Architecture Parallelism
  • Design of New Memory Hierarchies of Machines
  • Widely used for Translating Programs
  • Used with other Software Productivity Tools

Summary

  • A compiler is a computer program which helps you transform source code written in a high-level language into low-level machine language
  • Correctness, velocità di compilazione, preservare il corretto significato del codice sono alcune importanti caratteristiche della progettazione del compilatore
  • I compilatori sono divisi in tre parti 1) Compilatori a singolo passaggio 2)Compilatori a due passaggi, e 3) Compilatori multipass
  • Il “compilatore” è stato usato per la prima volta nei primi anni ’50 da Grace Murray Hopper
  • I passi per il sistema di elaborazione del linguaggio sono: Preprocessore, Interprete, Assemblatore, Linker/Loader
  • Gli strumenti importanti per la costruzione del compilatore sono 1) Generatori di scanner, 2)Sintassi-3) motori di traduzione diretta, 4) Generatori di parser, 5) Generatori di codice automatico
  • Il compito principale del compilatore è quello di verificare l’intero programma, quindi non ci sono errori sintattici o semantici