m.c. meliza contreras gonzález. arquitectura von neumann lenguaje máquina lenguaje ensamblador...

22
COMPILADORES M.C. Meliza Contreras González

Upload: thera-sevilla

Post on 22-Jan-2016

231 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: M.C. Meliza Contreras González.  Arquitectura Von Neumann  lenguaje máquina  Lenguaje Ensamblador ->arquitectura fija  Lenguaje natural independiente

COMPILADORESM.C. Meliza Contreras González

Page 2: M.C. Meliza Contreras González.  Arquitectura Von Neumann  lenguaje máquina  Lenguaje Ensamblador ->arquitectura fija  Lenguaje natural independiente

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.

Page 3: M.C. Meliza Contreras González.  Arquitectura Von Neumann  lenguaje máquina  Lenguaje Ensamblador ->arquitectura fija  Lenguaje natural independiente

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 4: M.C. Meliza Contreras González.  Arquitectura Von Neumann  lenguaje máquina  Lenguaje Ensamblador ->arquitectura fija  Lenguaje natural independiente

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

Page 5: M.C. Meliza Contreras González.  Arquitectura Von Neumann  lenguaje máquina  Lenguaje Ensamblador ->arquitectura fija  Lenguaje natural independiente

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

Page 6: M.C. Meliza Contreras González.  Arquitectura Von Neumann  lenguaje máquina  Lenguaje Ensamblador ->arquitectura fija  Lenguaje natural independiente

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 7: M.C. Meliza Contreras González.  Arquitectura Von Neumann  lenguaje máquina  Lenguaje Ensamblador ->arquitectura fija  Lenguaje natural independiente

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

Page 8: M.C. Meliza Contreras González.  Arquitectura Von Neumann  lenguaje máquina  Lenguaje Ensamblador ->arquitectura fija  Lenguaje natural independiente

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

Page 9: M.C. Meliza Contreras González.  Arquitectura Von Neumann  lenguaje máquina  Lenguaje Ensamblador ->arquitectura fija  Lenguaje natural independiente

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

Page 10: M.C. Meliza Contreras González.  Arquitectura Von Neumann  lenguaje máquina  Lenguaje Ensamblador ->arquitectura fija  Lenguaje natural independiente

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

Page 11: M.C. Meliza Contreras González.  Arquitectura Von Neumann  lenguaje máquina  Lenguaje Ensamblador ->arquitectura fija  Lenguaje natural independiente

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

Page 12: M.C. Meliza Contreras González.  Arquitectura Von Neumann  lenguaje máquina  Lenguaje Ensamblador ->arquitectura fija  Lenguaje natural independiente

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

Page 13: M.C. Meliza Contreras González.  Arquitectura Von Neumann  lenguaje máquina  Lenguaje Ensamblador ->arquitectura fija  Lenguaje natural independiente

EL ANALIZADOR LÉXICO

Ejemplo:

El scanner deberá reconocer sucesivamente,

13

Page 14: M.C. Meliza Contreras González.  Arquitectura Von Neumann  lenguaje máquina  Lenguaje Ensamblador ->arquitectura fija  Lenguaje natural independiente

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

Page 15: M.C. Meliza Contreras González.  Arquitectura Von Neumann  lenguaje máquina  Lenguaje Ensamblador ->arquitectura fija  Lenguaje natural independiente

EL ANALIZADOR SINTÁCTICO Ejemplo:

supongamos sintaxis asignación como:

y debemos analizar

15

Page 16: M.C. Meliza Contreras González.  Arquitectura Von Neumann  lenguaje máquina  Lenguaje Ensamblador ->arquitectura fija  Lenguaje natural independiente

EL ANALIZADOR SINTÁCTICO

El árbol sintáctico correspondiente es

16

Page 17: M.C. Meliza Contreras González.  Arquitectura Von Neumann  lenguaje máquina  Lenguaje Ensamblador ->arquitectura fija  Lenguaje natural independiente

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

Page 18: M.C. Meliza Contreras González.  Arquitectura Von Neumann  lenguaje máquina  Lenguaje Ensamblador ->arquitectura fija  Lenguaje natural independiente

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

Page 19: M.C. Meliza Contreras González.  Arquitectura Von Neumann  lenguaje máquina  Lenguaje Ensamblador ->arquitectura fija  Lenguaje natural independiente

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

Page 20: M.C. Meliza Contreras González.  Arquitectura Von Neumann  lenguaje máquina  Lenguaje Ensamblador ->arquitectura fija  Lenguaje natural independiente

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

Page 21: M.C. Meliza Contreras González.  Arquitectura Von Neumann  lenguaje máquina  Lenguaje Ensamblador ->arquitectura fija  Lenguaje natural independiente

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

Page 22: M.C. Meliza Contreras González.  Arquitectura Von Neumann  lenguaje máquina  Lenguaje Ensamblador ->arquitectura fija  Lenguaje natural independiente

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