Recibe como entrada lenguaje de programación de alto nivel (fuente) y genera
como salida un lenguaje de programación de bajo nivel como ensamblador o
código máquina (objeto). Muchos compiladores generan un programa en
lenguaje ensamblador que se convierte en ejecutable por medio de un ensamblador.
Este tiene varias ventajas como: El programa se compila una sola vez
pero se puede ejecutar varias veces, la ejecución del objeto es más
rápida y puede dar información más detallada de los errores
cometidos al codificarlo
Enlazador: construye el fichero
ejecutable añadiendo cabeceras
necesarias y las funciones de librería
utilizadas
Depurador: permite seguir
paso a paso la ejecución del
programa
Sus componentes son:
Analizador de léxico: Lee los caracteres de la fuente uno a uno y
va formando grupos de caracteres con alguna relación entre sí
(tokens), que son tratados como una única entidad
constituyendo la entrada de la siguiente fase. Frecuentemente
funciona como subrutina del analizador sintáctico. Existen
diferentes tipos:
Cadenas específicas: No tienen ningún
valor, solo tipo. Estas son palabras
reservadas, signos de puntuación y
operadores aritméticos y lógicos
Cadenas no específicas: tienen
tipo y valor. Estas son los
identificadores y datos que se
utilizan para almacenar variables
Análisis Sintáctico: Recibe como entrada los tokens generados
por el analizador léxico y comprueba si estos van llegando en el
orden correcto. Si no hay errores la salida es un árbol sintáctico, de
lo contrario se generarán los mensajes de error correspondientes.
Para su diseño se utilizan Autómatas de Pila.
Análisis Semántico: Determina si el significado de las diferentes instrucciones del programa son
válidas. Para ello calcula y analiza información asociada a las sentencias del programa. Su salida es un
árbol semántico, el cual es una ampliación del árbol sintáctico en el que cada rama adquiere el
significado del fragmento del programa que representa.
Generación de código intermedio: Crea un código intermedio que
es independiente de la fuente y el objeto y luego de convertirlo al
lenguaje del objeto. Esto permite construir en menos tiempo
compiladores para nuevos lenguajes y máquinas.
Generación del código objeto: El código intermedio
optimizado es traducido a una secuencia de
instrucciones en ensamblador o en código máquina.
Tabla de símbolos: Estructura interna que guarda la información
gestionada de los elementos que se encuentran en el programa
fuente. Se debe de diseñar cuidadosamente de manera que
contenga toda la información que el compilador necesita,
prestando atención a la velocidad de acceso a la información
Control de errores: Informa adecuadamente al programador de
los errores que hay en su programa.
Optimización de código: optimisa el código. Esto se añade para conseguir que el
programa objeto sea más rápido y necesite menos memoria para ejecutarse.