29
COMPILADORES M.C. Pedro Bello López Facultad de Ciencias de la Computación [email protected] BUAP 1

COMPILADORES M.C. Pedro Bello López Facultad de Ciencias de la Computación [email protected] BUAP 1

Embed Size (px)

Citation preview

Page 1: COMPILADORES M.C. Pedro Bello López Facultad de Ciencias de la Computación pbello@cs.buap.mx BUAP 1

COMPILADORES

M.C. Pedro Bello López

Facultad de Ciencias de la Computación

[email protected]

BUAP

1

Page 2: COMPILADORES M.C. Pedro Bello López Facultad de Ciencias de la Computación pbello@cs.buap.mx BUAP 1

Introducción

¿Qué es un compilador (traductor)?

Programa que lee un programa (fuente) en un lenguaje ascci 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

Permite programar “independientemente” de la máquina

Importante, ya que el número de máquinas diferente crece deprisa

2

Page 3: COMPILADORES M.C. Pedro Bello López Facultad de Ciencias de la Computación pbello@cs.buap.mx BUAP 1
Page 4: COMPILADORES M.C. Pedro Bello López Facultad de Ciencias de la Computación pbello@cs.buap.mx BUAP 1

¿De dónde el nombre “compilador”?

Murray Hopper (50’s) La traducción se veía como la “compilación”

de una secuencia de subprogramas tomados de una librería (biblioteca) de programas

Compilación (actual) se llamaba “programación automática” se veía como algo futurista

Primeros compiladores modernos: FORTRAN (finales 50) “independencia” de la máquina coste: 18 personas/año

4

Page 5: COMPILADORES M.C. Pedro Bello López Facultad de Ciencias de la Computación pbello@cs.buap.mx BUAP 1

No siempre el lenguaje objeto tiene que ser de “bajo nivel”

(traductor) Técnicas aplicables para:

editores/formateadores de texto nroff, troff, eqn, tbl, pic de UNIX,TeX

lenguajes de consulta SQL, shells

transformación de formatos de ficheros

5

Page 6: COMPILADORES M.C. Pedro Bello López Facultad de Ciencias de la Computación pbello@cs.buap.mx BUAP 1

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

Page 7: COMPILADORES M.C. Pedro Bello López Facultad de Ciencias de la Computación pbello@cs.buap.mx BUAP 1

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.

Page 8: COMPILADORES M.C. Pedro Bello López Facultad de Ciencias de la Computación pbello@cs.buap.mx BUAP 1

COMPILADOR

El compilador es el traductor más extendido Realiza un análisis y genera un programa

ejecutable El programa ejecutable, una vez creado, no

necesita el compilador para funcionar

Page 9: COMPILADORES M.C. Pedro Bello López Facultad de Ciencias de la Computación pbello@cs.buap.mx BUAP 1

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 deejecución.– Necesita menos memoria

Page 10: COMPILADORES M.C. Pedro Bello López Facultad de Ciencias de la Computación pbello@cs.buap.mx BUAP 1

10

Page 11: COMPILADORES M.C. Pedro Bello López Facultad de Ciencias de la Computación pbello@cs.buap.mx BUAP 1

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

11

Page 12: COMPILADORES M.C. Pedro Bello López Facultad de Ciencias de la Computación pbello@cs.buap.mx BUAP 1

Las FASES de un compilador

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

Muchas variaciones posibles: sin preprocesador sin usar código intermedio optimizando directamente sobre el ensamblador de la máquina generar directamente binario, sin pasar por el ensamblador .........

12

Page 13: COMPILADORES M.C. Pedro Bello López Facultad de Ciencias de la Computación pbello@cs.buap.mx BUAP 1

Tipos de Compiladores

Ensamblador: el lenguaje fuente es lenguaje ensamblador y posee una estructura sencilla.

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.

13

Page 14: COMPILADORES M.C. Pedro Bello López Facultad de Ciencias de la Computación pbello@cs.buap.mx BUAP 1

Tipos de Compiladores

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.

14

Page 15: COMPILADORES M.C. Pedro Bello López Facultad de Ciencias de la Computación pbello@cs.buap.mx BUAP 1

ESTRUCTURA DE UN COMPILADOR

Etapas 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

Programa Fuente

Programa Objeto

15

Page 16: COMPILADORES M.C. Pedro Bello López Facultad de Ciencias de la Computación pbello@cs.buap.mx BUAP 1

Las partes principales

La primera fase (front end) es la encargada de analizar el programa fuente – Fase de Análisis.

(back end) es la encargada de generar código para la máquina objeto.- Fase de síntesis.

El puente de unión entre las dos fases era un lenguaje intermedio que se designó con el nombre de UNCOL (UNiversal Computer Oriented Language).

Page 17: COMPILADORES M.C. Pedro Bello López Facultad de Ciencias de la Computación pbello@cs.buap.mx BUAP 1

El analizador léxico

Lo realiza un “scanner” también “tokenizer”

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 Existen Generadores automáticos de analizadores léxicos

como LEX

17

Page 18: COMPILADORES M.C. Pedro Bello López Facultad de Ciencias de la Computación pbello@cs.buap.mx BUAP 1

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

18

Page 19: COMPILADORES M.C. Pedro Bello López Facultad de Ciencias de la Computación pbello@cs.buap.mx BUAP 1

El analizador léxico

Ejemplo:

El scanner deberá reconocer sucesivamente,

19

Page 20: COMPILADORES M.C. Pedro Bello López Facultad de Ciencias de la Computación pbello@cs.buap.mx BUAP 1

El analizador sintáctico

O “parser” Objetivo: agrupar los tokens suministrados por el scanner

para reconocer “frases” ¿Cómo lo hace? La sintaxis se suele especificar formalmente mediante una GLC también de otros tipos

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 producciones

20

Page 21: COMPILADORES M.C. Pedro Bello López Facultad de Ciencias de la Computación pbello@cs.buap.mx BUAP 1

El analizador sintáctico

Ejemplo: supongamos sintaxis asignación como:

y debemos analizar

21

Page 22: COMPILADORES M.C. Pedro Bello López Facultad de Ciencias de la Computación pbello@cs.buap.mx BUAP 1

El analizador sintáctico

El árbol sintáctico correspondiente es

22

Page 23: COMPILADORES M.C. Pedro Bello López Facultad de Ciencias de la Computación pbello@cs.buap.mx BUAP 1

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 ....

23

Page 24: COMPILADORES M.C. Pedro Bello López Facultad de Ciencias de la Computación pbello@cs.buap.mx BUAP 1

Cuando el número de lenguajes fuente crece hasta un número grande M, y/o cuando el número de lenguajes objeto también crece hasta un numero grande N, es necesario encontrar una técnica para evitar tener que diseñar MxN compiladores. La solución consiste en utilizar un lenguaje intermedio o una representación intermedia; de esta forma solo hay que construir M programas que traduzcan de cada lenguaje fuente al lenguaje intermedio y N programas que traduzcan del lenguaje intermedio a cada lenguaje objeto.

Generación de Código Intermedio

24

Page 25: COMPILADORES M.C. Pedro Bello López Facultad de Ciencias de la Computación pbello@cs.buap.mx BUAP 1

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 poder luego 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: ....

25

Page 26: COMPILADORES M.C. Pedro Bello López Facultad de Ciencias de la Computación pbello@cs.buap.mx BUAP 1

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 ....

26

Page 27: COMPILADORES M.C. Pedro Bello López Facultad de Ciencias de la Computación pbello@cs.buap.mx BUAP 1

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”

27

Page 28: COMPILADORES M.C. Pedro Bello López Facultad de Ciencias de la Computación pbello@cs.buap.mx BUAP 1

La tabla de símbolos

Mecanismo para almacenar/acceder la información de los identificadores

Las informaciones asociadas 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

28

Page 29: COMPILADORES M.C. Pedro Bello López Facultad de Ciencias de la Computación pbello@cs.buap.mx BUAP 1

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 un pasada

29