Quando scriviamo un programma, di solito lo scriviamo in un linguaggio di programmazione. Questo può essere di basso livello (se è più vicino al linguaggio macchina del nostro) o di alto livello (quando ha una sintassi semplice). Tuttavia, non importa quanto sia basso il livello del linguaggio di programmazione che utilizziamo, le macchine continuano a non comprendere le nostre istruzioni in quanto tali, poiché funzionano con ordini binari. Pertanto, se vogliamo che il nostro programma funzioni, è necessario utilizzare a compilatore .
Che cos'è un compilatore di codice?
Un compilatore è, grosso modo, a traduttore . È responsabile trasformare il codice sorgente del programma che abbiamo creato (utilizzando generalmente un linguaggio di alto livello), insieme a tutte le dipendenze e librerie necessarie affinché il programma possa funzionare e funzionare senza problemi, in un binario file. Questo compilatore ha il compito di verificare che non ci siano errori nel codice (per evitare errori critici), nonché di analizzare e raggruppare la sintassi e la struttura del programma. Se tutto è corretto, lo passa a un linguaggio intermedio comune, assembler, per poi ottimizzarlo e tradurlo in linguaggio binario . In questo modo, attraverso il sistema operativo, il programma può essere eseguito sulla macchina.

I compilatori normalmente non passano le istruzioni dal nostro codice sorgente direttamente al codice binario, ma di solito svolgono i loro compiti in 3 fasi.
Fase di analisi
Il primo è il fase di analisi . In questa fase il compilatore si occupa di analizzare che la struttura e la semantica del programma siano corrette per generare un codice intermedio (bytecode). Il lessico del codice viene analizzato per raggruppare tutti i componenti che hanno un significato per il programma. In questo passaggio, ad esempio, vengono rimosse tutte le informazioni non necessarie, come commenti o spazi. l'analisi inizia dopo. In esso, i componenti lessicali sono raggruppati gerarchicamente in frasi grammaticali, che verranno utilizzate per creare l'output del programma. E infine, semantico avviene l'analisi. In esso, in base alla struttura gerarchica sopra, il compilatore cerca possibili errori nel codice per evitare guasti critici nel sistema. Quando tutto è corretto, inizia la fase di sintesi.
Fase di sintesi
. fase di sintesi è responsabile della generazione del codice oggetto dal codice sorgente. Questa fase inizia solo quando la fase di analisi non ha dato errori, evitando così possibili problemi sia nella compilazione che nell'esecuzione di un programma corrotto. Il codice oggetto è quasi sempre in linguaggio assembly, uno dei linguaggi di livello più basso che possiamo trovare. Ma non è ancora in binario, quindi è necessario un ultimo passaggio, noto come ottimizzazione.
Fase di ottimizzazione
A partire dal codice oggetto, il compilatore inizia il fase di ottimizzazione . Quello che fai in questa fase è interpretare il codice e cercare possibili ottimizzazioni in modo che le istruzioni siano il più brevi possibile e possano essere eseguite più rapidamente sul computer. Possono essere eseguiti diversi tipi di ottimizzazione a seconda che si desideri un programma meno ottimizzato, ma che compila più velocemente, o più ottimizzato ma che richiede molto più tempo per la compilazione.

Tipi di compilatori
Non tutti i compilatori di codice sono uguali. Inizialmente, nei primi decenni dell'era dei computer, i compilatori erano i programmi più complessi che potessimo trovare. In genere, i programmatori usavano assembler, o direttamente binari, per creare questi strumenti. Oggigiorno le cose sono molto cambiate e, sebbene siano elementi ancora molto complessi, non sono poi così complicati da creare o aggiornare per migliorarli.
Esistono diversi tipi di compilatori. E ogni compilatore può appartenere a uno o più gruppi:
- Crossed : sono quelli progettati per generare un codice da eseguire su un sistema operativo diverso da quello in esecuzione. Ad esempio, se compiliamo un programma Android da Windows.
- In un solo passaggio : sono responsabili della generazione del codice macchina (binario) da una singola lettura del codice sorgente. Normalmente non fanno uso di ottimizzatori avanzati o altre fasi intermedie.
- Multipasso : devono eseguire più passaggi al codice per verificare che tutto sia corretto e ottimizzarlo prima di produrre il codice macchina.
- JIT (appena in tempo) : compila il codice in tempo reale secondo necessità.
- ottimizzatori : apportare modifiche al codice per migliorare le prestazioni del programma e ottimizzarlo, ma senza rovinare la funzionalità del programma originale.
Come compilare un programma
I sistemi operativi e gli IDE di programmazione hanno i propri compilatori. Ad esempio, in Linux troviamo un noto strumento chiamato ” Make “. che viene utilizzato per compilare codice da terminale senza dover scrivere comandi lunghi e complessi nella console di sistema. Quando abbiamo un programma complesso, è in grado di sapere quali parti del codice sono cambiate per raccogliere solo ciò che è necessario invece dell'intero programma.
Se usiamo un IDE di programmazione, come Di Visual Studio , avrà i propri compilatori per modellare i programmi che scriviamo in C, C++, C# o Visual Basic. Altri IDE di programmazione, come Android Studio, hanno il proprio compilatore che ci consente di creare eseguibili per poter eseguire app su Android.
Quindi possiamo anche trovare compilatori di terze parti che ci aiutano a modellare programmi che non includono i propri compilatori. Questo è comune, ad esempio, se utilizziamo Visual Studio Code, Microsoft's OpenSource IDE, per creare programmi. A differenza del fratello maggiore, questo non viene fornito con i propri compilatori, quindi dovremo scaricare un'alternativa, come MinGW , che ci permette di compilare il codice.
La console di debug: il miglior alleato del programmatore
Il processo di compilazione è solitamente automatico (non possiamo interferire con esso) e, di solito, invisibile. Tuttavia, sia i compilatori che gli IDE dispongono di ambienti di debug che possono essere molto utili quando si tratta di rilevare e riparare errori che potremmo aver commesso.
Grazie a questi console di debug potremo controllare una ad una le istruzioni che vengono eseguite per generare il codice macchina del programma. La cosa più normale è mostrare solo gli avvisi e gli errori, poiché tutto ciò che viene compilato correttamente non aggiunge alcun valore. Se c'è un errore, la console ci dirà esattamente dove è successo (e molte volte perché) in modo che possiamo risolverlo facilmente. Lo stesso ogni volta che viene visualizzato un avviso. Questi non devono interrompere la compilazione del programma, ma possono aiutarci a ottimizzare il funzionamento del programma.