Un compilatore moderno è tipicamente strutturato in tre fasi: front-end, middle-end e back-end. Il front-end analizza il codice sorgente, ne verifica la correttezza e crea una rappresentazione intermedia (IR). Il middle-end esegue ottimizzazioni su questa IR. Il back-end traduce quindi la IR ottimizzata in codice macchina di destinazione per una specifica architettura di CPU.
