La definizione e lo scopo di un compilatore

Un compilatore è un programma che traduce il codice sorgente leggibile dall'uomo in codice macchina eseguibile dal computer. Per farlo correttamente, il codice leggibile dall'uomo deve rispettare le regole di sintassi di qualunque linguaggio di programmazione sia scritto. Il compilatore è solo un programma e non può sistemare il codice per te. Se si commette un errore, è necessario correggere la sintassi o non verrà compilata.

Cosa succede quando compili il codice?

La complessità di un compilatore dipende dalla sintassi del linguaggio e dalla quantità di astrazione fornita dal linguaggio di programmazione. Un compilatore C è molto più semplice di un compilatore per C ++ o C #.

Analisi lessicale

Durante la compilazione, il compilatore legge prima un flusso di caratteri da un file di codice sorgente e genera un flusso di token lessicali. Ad esempio, il codice C ++:

int C = (A * B) +10;

potrebbe essere analizzato come questi token:

  • digitare "int"
  • variabile "C"
  • è uguale a
  • leftbracket
  • variabile "A"
  • volte
  • variabile "B"
  • RIGHTBRACKET
  • più
  • letterale "10"

Analisi sintattica

L'output lessicale va alla parte dell'analizzatore sintattico del compilatore, che utilizza le regole grammaticali per decidere se l'input è valido o meno. A meno che le variabili A e B non siano state precedentemente dichiarate e fossero nell'ambito, il compilatore potrebbe dire:

  • 'A': identificatore non dichiarato.

Se sono stati dichiarati ma non inizializzati. il compilatore emette un avviso:

  • variabile locale 'A' utilizzata senza essere inizializzata.

Non si dovrebbero mai ignorare gli avvisi del compilatore. Possono rompere il tuo codice in modi strani e inaspettati. Correggi sempre gli avvisi del compilatore.

Uno o due passaggi?

Alcuni linguaggi di programmazione sono scritti in modo che un compilatore possa leggere il codice sorgente una sola volta e generare il codice macchina. Pascal è una di queste lingue. Molti compilatori richiedono almeno due passaggi. A volte, è a causa di dichiarazioni anticipate di funzioni o classi.

In C ++, una classe può essere dichiarata ma non definita fino a dopo. Il compilatore non è in grado di calcolare la quantità di memoria necessaria alla classe fino a quando non compila il corpo della classe. Deve rileggere il codice sorgente prima di generare il codice macchina corretto.

Generazione del codice macchina

Supponendo che il compilatore completi correttamente le analisi lessicali e sintattiche, lo stadio finale sta generando il codice macchina. Questo è un processo complicato, specialmente con le CPU moderne.