COMPILADORES M.C. Meliza Contreras González
COMPILADORESM.C. Meliza Contreras González
HISTORIA DE LOS COMPILADORES Arquitectura Von Neumannlenguaje
máquina Lenguaje Ensamblador ->arquitectura
fija Lenguaje natural independiente de la
máquina. Fortran y su compilador por John
Backus. Estudio de las gramáticas por Noam
Chomsky. Hopper creo el primer compilador de la
historia.
CLASIFICACIÓN DE LOS LENGUAJES
Lenguajes máquina– Son los lenguajes de más bajo nivel: secuencias binarias de
ceros y unos.– Históricamente, los primeros
• Lenguajes ensambladores– Segunda generación de lenguajes– Versión simbólica de los lenguajes máquina (MOV, ADD).
• Lenguajes de alto nivel– Lenguajes de tercera generación (3GL)
• Estructuras de control, Variables de tipo, Recursividad, etc.• Ej.: C, Pascal, C++, Java, etc• Lenguajes orientados a problemas.
– Lenguajes de cuarta generación (4GL)• Ej. SQL
INTRODUCCIÓN¿Qué es un compilador (traductor)?
Programa que lee un programa (fuente) en un lenguaje ascii y lo traduce a un programa EQUIVALENTE en otro lenguaje (objeto)
Además: da mensajes de error lleva a cabo determinadas “correcciones” (recuperación de errores) puede optimizar el código generado
4
COMPILADOR El compilador es el traductor más
extendido Realiza un análisis y genera un
programa ejecutable(código objeto) El programa ejecutable, una vez creado,
no necesita el compilador para funcionar
INTERPRETE• El intérprete ejecuta el código
según lo va interpretando.– Cada vez que se escribe una
línea el programa comprueba si es correcta, si lo es, la ejecuta.
– La ejecución es interactiva.– Los intérpretes más puros no
guardan copia del programa que se está escribiendo.
– Ejemplos: Procesos por lotes, CAML, etc.
– El intérprete siempre debe estar presente.
COMPILADOR VS INTERPRETE
• Compilador– Se compila una vez, seejecuta n veces– El proceso de
compilacióntiene una visión global
detodo el programa, por locual la gestión de
erroreses más eficiente.– La ejecución es másrápida.
• Intérprete– Se traduce cada vez que seejecuta– Permite interaccionar más conel código en tiempo de ejecución.– Necesita menos memoria
TIPOS DE COMPILADORES
Compilador cruzado: se genera código en lenguaje objeto para una máquina diferente de la que se está utilizando para compilar.
Compilador con montador: compilador que compila distintos módulos de forma independiente y después es capaz de enlazarlos.
Autocompilador: compilador que está escrito en el mismo lenguaje que va a compilar.
Metacompilador: es sinónimo de compilador de compiladores y se refiere a un programa que recibe como entrada las especificaciones del lenguaje para el que se desea obtener un compilador y genera como salida el compilador para ese lenguaje.
Descompilador: es un programa que acepta como entrada código máquina y lo traduce a un lenguaje de alto nivel, realizando el proceso inverso a la compilación.
8
ESTRUCTURA DE UN COMPILADOREtapas que constituyen el proceso de compilación
Análisis Sintáctico
Análisis Léxico
Análisis Semántico
Generación de Código Intermedio
Optimización de Código
Generación de Código
Manejo de
Errores
Manejo de la Tabla de Símbolos
y de literales
Programa Fuente
Programa Objeto9
Tokens
Árbol sintáctico
LAS FASES DE UN COMPILADOR
Primera fase (precompilador) no siempre se realiza sustituciones de macros eliminación de comentarios inclusión de ficheros extensiones al lenguaje (C+SQL)
Segunda fase es la parte fundamental (y
siempre presente) consta de:
analizador léxico analizador sintáctico generador de código
traduce el código fuente a otro objeto puede ser el definitivo puede ser un código
intermedio
10
Tercera fase no siempre presente realiza optimizaciones
(algunas) sobre el código (intermedio) generado
Cuarta fase: traduce el código
intermedio (optimizado) a ensamblador binario
EL ANALIZADOR LÉXICO(SCANNER)
Recolecta secuencia de caracteres en unidades significativas llamadas tokens .
El scanner recorre los caracteres de entrada (el fuente) hasta reconocer un “token” token: unidad léxica indivisible ejemplos: while,if,==,>=,ancho,...
La secuencia de caracteres correspondiente se llama
“lexema” (componente léxico) 1 token <> 1 lexema(valor del token) Existen Generadores automáticos de
analizadores lexicos como LEX
11
EL ANALIZADOR LÉXICO
Además, suele realizar otras tareas: procesar directivas al compilador (opciones) introducir información preliminar en la tabla de símbolos eliminar separadores innecesarios sustituir macros listar el fuente
Normalmente, los tokens se describen mediante expresiones regulares
12
EL ANALIZADOR LÉXICO
Ejemplo:
El scanner deberá reconocer sucesivamente,
13
EL ANALIZADOR SINTÁCTICO
O “parser” Objetivo: agrupar los tokens suministrados
por el scanner para reconocer “frases” y su función es comprobar que estan ordenados de forma correcta respecto al lenguaje específico.
¿Cómo lo hace? La sintaxis se suele especificar formalmente mediante una GLC
El parser recibe tokens y los agrupa de acuerdo a especificadas por la GLC
El parser detecta errores sintácticos Y si es bueno, puede además realizar algunas
correcciones
Los resultados de este análisis es un árbol sintáctico
14
EL ANALIZADOR SINTÁCTICO Ejemplo:
supongamos sintaxis asignación como:
y debemos analizar
15
EL ANALIZADOR SINTÁCTICO
El árbol sintáctico correspondiente es
16
EL ANALIZADOR SEMÁNTICO
Realiza dos funciones: Análisis de la semántica estática
¿Es cada construcción legal y “con sentido”? variables en una expresión definidas del tipo adecuado alcance de los objetos
Generación del código intermedio Generalmente se lleva a cabo mediante
gramáticas de atributos la GLC se completa con atributos necesarios
tipo valor acciones a ejecutar cuando se detecta una construcción
legal
17
La generación de código intermedio transforma un árbol de análisis sintáctico (semántico) en una representación en un lenguaje intermedio, que suele ser código suficientemente sencillo para generar código máquina.
Generación de Código Intermedio
While (A>B) AND (A<=2*B-5) Do A := A + B
L1: IF A>B GOTO L2 GOTO L3L2: T1:= 2*B T2:= T1-5 IF A<=T2 GOTO L4 GOTO L3L4: A:= A+B GOTO L1L3: ....18
OPTIMIZACION DE CODIGO
El código intermedio generado es analizado y transformado en uno equivalente optimizado
Es una tarea muy costosa De hecho, generalmente se puede invocar al
compilador activando/desactivando esta opción Otras veces, optimiza el código objeto
usual la optimización “peephole”: tomar una porción pequeña de código y hacer una
optimización local “desenrrollado” de bucles eliminación de recursividad final
19
GENERACION DE CODIGO
Toma código intermedio y genera código objeto para la máquina considerada
Es la parte más próxima a la arquitectura de la máquina
Habitualmente, se escriben “a mano” desarrollo “a medida” para cada máquina
específica
Dada la complejidad, si no se va a realizar optimización, se asocia la generación de código a las rutinas semánticas compiladores de “una pasada”
20
LA TABLA DE SÍMBOLOS
Mecanismo para almacenar/acceder la información de los identificadores
La información asociada a un identificador se denominan “atributos”
Cada vez que se usa un identificador, la tabla de símbolos proporciona la información necesaria
Se usa tanto en la parte de análisis como en la de síntesis
21
MANEJO DE ERRORES
Es una de las misiones mas importantes de un compilador, aunque al mismo tiempo, es lo que mas dificulta su realización debido principalmente a dos motivos:
1) A veces unos errores ocultan otros2) A veces un error provoca una avalancha de
muchos errores que se solucionan con el primero
Criterios en el manejo de errores
a) Pararse al detectar el primer errorb) Detectar todos los errores de una pasada22