Un compilador es un programa informático que traduce el código fuente de un
programa en lenguaje de alto nivel, a otro lenguaje de nivel inferior
(típicamente lenguaje de máquina, ceros y unos). De esta manera un programador puede
diseñar un programa en un lenguaje mucho más cercano a como piensa un
ser humano, para luego compilarlo a un programa más manejable por una
computadora.
Cómo funciona
El proceso de traducción se compone internamente de varias etapas o
fases, que realizan distintas operaciones lógicas. Es útil pensar en
estas fases como en piezas separadas dentro del traductor, y pueden en
realidad escribirse como operaciones codificadas separadamente aunque en
la práctica a menudo se integren juntas.
Fase de análisis
Análisis léxico
El análisis léxico constituye la primera fase, aquí se lee el
programa fuente de izquierda a derecha y se agrupa en componentes
léxicos (tokens), que son secuencias de caracteres que tienen un
significado. Todos los espacios en blanco, líneas en blanco,
comentarios y demás información innecesaria se elimina. También se comprueba que los símbolos del lenguaje (palabras
clave, operadores, etc.) se han escrito correctamente.
Análisis sintáctico
En esta fase los caracteres o componentes léxicos se agrupan
jerárquicamente en frases gramaticales que el compilador utiliza para
sintetizar la salida. Se comprueba si lo obtenido de la fase anterior es
sintácticamente correcto (obedece a la gramática del lenguaje). Por lo
general, las frases gramaticales del programa fuente se representan
mediante un árbol de análisis sintáctico.
Análisis semántico
La fase de análisis semántico revisa el programa fuente para tratar
de encontrar errores semánticos y reúne la información sobre los tipos
para la fase posterior de generación de código. En ella se utiliza la
estructura jerárquica determinada por la fase de análisis sintáctico
para identificar los operadores y operandos de expresiones y
proposiciones.
Fase de síntesis
Consiste en generar el código objeto equivalente al programa fuente.
Sólo se genera código objeto cuando el programa fuente está libre de
errores de análisis, lo cual no quiere decir que el programa se ejecute
correctamente, ya que un programa puede tener errores de concepto o
expresiones mal calculadas.
Generación de código intermedio
Después de los análisis sintáctico y semántico, algunos compiladores
generan una representación intermedia explícita del programa fuente. Se
puede considerar esta representación intermedia como un programa para
una máquina abstracta. Esta representación intermedia debe tener dos
propiedades importantes; debe ser fácil de producir y fácil de traducir
al programa objeto.
Optimización de código
La fase de optimización de código consiste en mejorar el código
intermedio, de modo que resulte un código máquina más rápido de
ejecutar. Esta fase de la etapa de síntesis es posible sobre todo si el
traductor es un compilador (difícilmente un intérprete puede optimizar
el código objeto). Hay mucha variación en la cantidad de optimización de
código que ejecutan los distintos compiladores. En los que hacen mucha
optimización, llamados «compiladores optimizadores», una parte
significativa del tiempo del compilador se ocupa en esta fase. Sin
embargo, hay optimizaciones sencillas que mejoran sensiblemente el
tiempo de ejecución del programa objeto sin retardar demasiado la
compilación.