1. Compiladores
1.1. Es un programa complejo en el que no es fácil distinguir claramente unas partes de otras. Está compuesto por divisiones lógicas del compilador en fases, lo que permite formalizar y estudiar por separado cada una de ellas
1.2. Fases
1.2.1. Análisis léxico: El analizador léxico, también conocido como scanner, lee los caracteres del programa fuente, uno a uno, desde el fichero de entrada y va formando grupos de caracteres con alguna relación entre sí (tokens). Análisis sintáctico: También llamado parser, recibe como entrada los tokens que genera el analizador léxico y comprueba si estos tokens van llegando en el orden correcto. Siempre que no se hayan producido errores, la salida teórica de esta fase del compilador será un árbol sintáctico. Si el programa es in-correcto se generaran los mensajes de error correspondientes. Análisis semántico: El analizador semántico trata de determinar si el significado de las diferentes instrucciones del programa es válido. Para conseguirlo tendrá que calcular y analizar información asociada a las sentencias del programa. Generación de código intermedio: Hay que construir m programas que traduzcan cada lenguaje fuente al código intermedio (front ends) y n programas que traduzcan del lenguaje intermedio a cada lenguaje objeto (back ends). La utilización del lenguaje intermedio permite construir en menos tiempo compiladores para nuevos lenguajes y para nuevas máquinas. Optimización de código: La mayoría de los compiladores suelen tener una fase de optimización de código intermedio (independiente de los lenguajes fuente y objeto), y una fase de optimización de código objeto (no aplicable a otras máquinas). Generación de código objeto: En esta fase, el código intermedio optimizado es traducido a una secuencia de instrucciones en ensamblador o en código máquina.