title: Compile-time
text: # Compile-time
  
  In informatica il termine compile-time (in italiano tempo di compilazione) indica la fase di compilazione di un programma. È usato principalmente in contrapposizione a run-time, che indica la fase di esecuzione.
  
  Un compilatore tipicamente effettua un controllo sulla sintassi, che include, tra gli altri, controlli sui tipi di dato e sulla visibilità delle variabili. Vengono inoltre eseguiti il binding statico, l'instanziazione dei template e l'ottimizzazione del codice. Queste azioni vengono anche chiamate analisi semantica. Il binding dinamico viene normalmente eseguito successivamente rispetto alla compilazione, normalmente a run-time oppure poco prima, per mezzo di un program loader. Anche i controlli sui limiti degli array non vengono normalmente eseguiti a compile-time.
  
  I compilatori multipiattaforma possono creare programmi che girano su differenti tipi di CPU, qualcosa che normalmente sarebbe molto lento fare a run-time, nonostante esistano sofisticate implementazioni che eseguono delle conversioni efficienti alla prima esecuzione, salvando il risultato in maniera quasi permanente, oppure ogni volta che l'eseguibile viene caricato. Queste implementazioni non sono efficienti quanto una vera compilazione multipiattaforma, ma sono l'unica soluzione pratica attuabile quando un rivenditore non produce una versione del programma per la CPU desiderata.
  
  Quando viene usato un interprete, normalmente non è possibile eseguire una separazione netta tra compile-time e run-time. Potrebbe esserci una fase di interpretazione (spesso in bytecode) seguita da una di esecuzione, ma normalmente queste attività sono eseguite dallo stesso software e sono trasparenti all'utente. Alcuni errori a compile-time in un programma che viene normalmente compilato potrebbero essere interpretati dal programmatore come errori a run-time: questo rende difficile controllarne il flusso di esecuzione senza un debug molto attento.
  
  Processi che avvengono in compile-time sono, ad esempio, la dichiarazione di array statici e l'assegnazione dei loro valori nella dichiarazione. Questi processi sono quindi irreversibili una volta compilato il progetto.
  
  