El compilador es un programa que lee un programa escrito en un idioma (el idioma de origen) y lo traduce a otro programa equivalente en otro idioma (el idioma de destino), principalmente lenguaje de máquina.
Hay diferentes fases del compilador a través de las cuales se escanea el código del idioma fuente línea por línea. Hay una tabla de símbolos que mantiene el seguimiento de todas las palabras clave que se escanean en el código de idioma fuente.
Fase 1: Analizador léxico: lee todos los caracteres en el programa fuente y forma la separación lógica de tokens (int, char, float, if-else, for, while, etc.)
Fase 2: Analizador de sintaxis: analiza la estructura del flujo de tokens. Análisis jerárquico de expresiones que incluye postfix / prefix, etc. (a = b + c * d)
Fase 3: Analizador semántico: verificación de tipos de tokens (entero a real, flotante, etc.) y muchas cosas como la precedencia del operador, etc.
Fase 4: Generador de código intermedio - a = b + c * de (temp1 = c * d, temp2 = temp1 + b, temp3 = temp2-e)
Fase 5: Optimización del código: varios análisis (flujo de control, flujo de datos, transformaciones)
que elimina: código de redundancia, propagación de constantes, código muerto parcial, subexpresión común, código invariante de bucle
Fase 6: Generación de código: generación de código de destino (principalmente lenguaje ensamblador) poniendo valores en registros
Todas estas fases no son más que programas bien escritos y podría haber un número N de fallas en eso ...