Title: Introduccin a la Compilacin
1Introducción a la Compilación
- Diseño y Construcción de Compiladores
2Índice
- Conceptualización de Compilador
- Por qué y para qué estudiar técnicas de
compilación? - Fases de un compilador
- Clasificación de los Compiladores
- Compiladores vs. Intérpretes
- Temáticas abordadas en la materia
3Compilador
- Compilador Programa que lee un programa escrito
en un lenguaje de programación y lo traduce a un
programa equivalente en otro lenguaje de
programación.
Compilador
Programa Destino
Programa Fuente
Mensajes de Error
4Por qué estudiar compiladores?
- Forma parte de los conocimientos que un Lic. en
Computación o un Ingeniero de Software debe
poseer. - Permite conocer
- El funcionamiento de una computadora.
- El código de máquina generado para las
construcciones del lenguaje de programación. - Estrategias de diseño de lenguajes.
- Etc.
5Para qué estudiar compiladores?
6Para qué estudiar compiladores?
7Para qué estudiar compiladores?
8Para qué estudiar compiladores?
- Análisis de Código Estático y Dinámico
9Para qué estudiar compiladores?
- Aplicaciones Comerciales/Lenguajes Específicos
del Dominio
HDL
Lenguaje Intermedio
10Fases de un Compilador
11Agrupación de las Fases de Un Compilador
- Front-end Operaciones independientes de la
máquina. - Análisis Lexicográfico
- Análisis Sintáctico
- Creación de Tabla de Símbolos
- Generación de Código Intermedio
- Manejo de Errores
- Back-end Operaciones dependientes de la máquina.
- Optimización de Código
- Generación de Código
- Etc.
12Fases de un Compilador
- Como hay muchas variantes en las formas en que
las fases de un compilador se agrupan, se
prefiere hablar de fases antes que pasos. Es
común que en diferentes fases se agrupen en un
paso y que la actividad de esas fases se solapen
durante un paso (scanner, parser, análisis
semántico, generación de código intermedio).
13Fases de un Compilador
- Es importante notar que deseable tener pocas
fases porque la lectura y escritura de archivos
consume mucho tiempo. - Ejemplo
- Scanner-parser
- Representación Intermedia-Generación de Código.
14Funciones de las Fases
- Análisis Lexicográfico
- Agrupa caracteres en tokens (lexema).
- Produce mensajes de errores lexicográficos e
intenta recuperarse.
15Funciones de las Fases
- Análisis Sintáctico
- Agrupa los tokens en frases gramaticales.
- Representa las frases gramaticales como un árbol
de parser. - Produce mensajes de errores sintácticos.
- Intenta detectar y recuperarse de los errores.
16Funciones de las Fases
aa1
17Funciones de las Fases
- Análisis Semántico
- Controla los errores semánticos del programa.
- Variables usadas y no definidas.
- Operandos de tipos compatibles.
- Invocaciones a procedimientos con el número y
tipo correctos de parámetros. - Números reales no pueden ser usados como
subíndices de arreglos. - Conversión de tipos cuando se permiten las
cohersiones.
18Funciones de las Fases
- bool a
- a a 1 !!!!!!
- int a
- a a 1
19Funciones de las Fases
- Generador de Código Intermedio
- Genera una representación intermedia explícita.
- Árboles de sintaxis abstracta.
- Grafos acíclicos dirigidos.
- Notación postfija.
- N-uplas (código de tres direcciones).
20Funciones de las Fases
- Posfija
- aa1 aa1
- Árbol de Sintaxis Abstracta
21Funciones de las Fases
- Optimización de Código
- Intenta reducir el tiempo de ejecución.
- Descubrir y propagar algún valor constante.
- Mover determinadas computaciones a lugares menos
frecuentemente ejecutados. - Descubrir computaciones redundantes y removerlas.
- Remover código inútil o inalcanzable.
22Funciones de las Fases
- Generador de Código
- Genera el código objeto, esto es código de
máquina reubicable o código assembly.
aa1 lw r1,a lw r2,0(r1) addi r2,r2,1 sw
0(r1),r2
23Clasificación de los Compiladores
- Simple pasada
- Multi pasada
24Clasificación de los Compiladores
Recuperar un token
Analizar el token
El programa destino se genera mientras el
programa fuente se lee.
Verificar el token
Generar Código para el token
25Clasificación de los Compiladores
scanner
parser
Análisis Semántico
caracteres
Árbol
Código
Tokens
Cada fase lee los datos desde un archivo y
escribe el resultado en otro
- Por qué múltiples pasadas?
- Memoria escasa
- Lenguaje Complejo
- Portabilidad
26Clasificación de los Compiladores
Front-end
Back-end
Scanner Parser Análisis Semático
Generación de Código
Representación Intermedia
- Ventajas
- Portabilidad
- Optimizaciones más fáciles de hacer
- Se pueden combinar los front-end y los back-ends
- Importante
- El front-end es dependiente del lenguaje
- El Back-end es dependiente de la máquina
27Intérprete
- Intérprete Programa que lee un programa escrito
en un lenguaje de programación y produce el
resultado de ejecutar tal programa.
Lenguaje de Programación
INTÉRPRETE
Salida
Datos
28Compiladores vs. Intérpretes
29Partes de la Compilación
- Análisis Parte el programa fuente en piezas y
crea una representación intermedia. - Síntesis Construye el programa a partir de la
representación intermedia.
30Análisis
- Análisis Lineal El programa se lee de izquierda
a derecha y se detectan secuencias de caracteres
que tienen un significado colectivo (Tokens). - Análisis Jerárquico Los tokens se agrupan
jerárquicamente en colecciones anidadas con
significado colectivo. - Análisis Semántico Se realizan ciertos chequeos
que garantizan que las componentes del programa
tienen sentido.
31Herramientas de Construcción de Compiladores
- Generadores de Scanners (Lex)
- Generadores de Parsers (yacc, bison)
- Máquinas de Traducción Dirigida por la Sintáxis.
- Generadores de Código Automático.
32Otros Traductores
- Preprocesadores
- Macro Procesadores
- Inclusión de Archivos
- Extensiones del Lenguaje
- Ensambladores
- Ensambladores de dos pasadas
- Loaders and Link-Editors
33Temáticas Abordadas en la Materia
- Tabla de Símbolos
- Parser Descendente Recursivo
- Manejo de Errores
- Traducción Dirigida por la sintáxis
- Chequeo de Tipos
- Generación de Código
34Biliografía
- Compilers Principles, Techniques and Tools. Aho,
Setti and Ullman. (The Dragon ?). - Apuntes de la materia.