COMPILADORES INTRODUCCIN M C Jos Andrs Vzquez Flores

  • Slides: 29
Download presentation
COMPILADORES INTRODUCCIÓN M. C. José Andrés Vázquez Flores Facultad de Ciencias de la Computación

COMPILADORES INTRODUCCIÓN M. C. José Andrés Vázquez Flores Facultad de Ciencias de la Computación andrex@cs. buap. mx FCC-BUAP 1

Introducción ¿Qué es un compilador (traductor)? n n Programa que lee un programa (fuente)

Introducción ¿Qué es un compilador (traductor)? n n Programa que lee un programa (fuente) en un lenguaje ascii y lo traduce a un programa EQUIVALENTE en otro lenguaje (objeto) Además: n n n 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 n 2 Importante, ya que el número de máquinas diferente crece deprisa

¿De dónde el nombre “compilador”? n Grace Murray Hopper (50’s) n La traducción se

¿De dónde el nombre “compilador”? n Grace Murray Hopper (50’s) n La traducción se veía como la “compilación” de una secuencia de subprogramas tomados de una librería (biblioteca) de programas n Compilación (actual) se llamaba “programación automática” n se veía como algo futurista n Primeros compiladores modernos: FORTRAN (finales 50) n “independencia” de la máquina 4

n No siempre el lenguaje objeto tiene que ser de “bajo nivel” (traductor) n

n No siempre el lenguaje objeto tiene que ser de “bajo nivel” (traductor) n Técnicas aplicables para: n editores/formateadores de texto n n lenguajes de consulta n n 5 nroff, troff, eqn, tbl, pic de UNIX, Te. X SQL, shells transformación de formatos de ficheros

Clasificación de los lenguajes Lenguajes máquina – Son los lenguajes de más bajo nivel:

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 (3 GL) • Estructuras de control, Variables de tipo, Recursividad, etc. • Ej. : C, Pascal, C++, Java, etc • Lenguajes orientados a problemas. – Lenguajes de cuarta generación (4 GL) • Ej. SQL

INTERPRETE • El intérprete ejecuta el código según lo va interpretando. – Cada vez

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 n El compilador es el traductor más extendido n Realiza un análisis y

COMPILADOR n El compilador es el traductor más extendido n Realiza un análisis y genera un programa ejecutable n El programa ejecutable, una vez creado, no necesita el compilador para funcionar

COMPILADOR VS INTERPRETE • Compilador – Se compila una vez, se ejecuta n veces

COMPILADOR VS INTERPRETE • Compilador – Se compila una vez, se ejecuta n veces – El proceso de compilación tiene una visión global de todo el programa, por lo cual la gestión de errores es más eficiente. – La ejecución es más rápida. • Intérprete – Se traduce cada vez que se ejecuta. – Permite interaccionar más con el código en tiempo de ejecución. – Necesita menos memoria

10

10

Las FASES de un compilador n Primera fase (precompilador) n n no siempre se

Las FASES de un compilador n Primera fase (precompilador) n n no siempre se realiza sustituciones de macros eliminación de comentarios inclusión de ficheros extensiones al lenguaje (C+SQL) n Segunda fase n n es la parte fundamental (y siempre presente) consta de: n analizador léxico n analizador sintáctico n n 11 generador de código traduce el código fuente a otro objeto n puede ser el definitivo n puede ser un código intermedio

Las FASES de un compilador n Tercera fase n n no siempre presente realiza

Las FASES de un compilador n Tercera fase n n no siempre presente realiza optimizaciones (algunas) sobre el código (intermedio) generado n Cuarta fase: n traduce el código intermedio (optimizado) a n ensamblador n binario n Muchas variaciones posibles: n n n 12 sin preprocesador sin usar código intermedio optimizando directamente sobre el ensamblador de la máquina generar directamente binario, sin pasar por el ensamblador. .

Tipos de Compiladores 13 n Ensamblador: el lenguaje fuente es lenguaje ensamblador y posee

Tipos de Compiladores 13 n Ensamblador: el lenguaje fuente es lenguaje ensamblador y posee una estructura sencilla. n Compilador cruzado: se genera código en lenguaje objeto para una máquina diferente de la que se está utilizando para compilar. n Compilador con montador: compilador que compila distintos módulos de forma independiente y después es capaz de enlazarlos. n Autocompilador: compilador que está escrito en el mismo lenguaje que va a compilar.

Tipos de Compiladores 14 n Metacompilador: es sinónimo de compiladores y se refiere a

Tipos de Compiladores 14 n Metacompilador: es sinónimo 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. n 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.

ESTRUCTURA DE UN COMPILADOR Etapas que constituyen el proceso de compilación Programa Fuente Análisis

ESTRUCTURA DE UN COMPILADOR Etapas que constituyen el proceso de compilación Programa Fuente Análisis Léxico Análisis Sintáctico Manejo de la Tabla de Símbolos Análisis Semántico Generación de Código Intermedio Optimización de Código Generación de Código 15 Programa Objeto Manejo de Errores

Las partes principales n La primera fase (front end) es la encargada de analizar

Las partes principales n La primera fase (front end) es la encargada de analizar el programa fuente – Fase de Análisis. n (back end) es la encargada de generar código para la máquina objeto. - Fase de síntesis. n 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).

El analizador léxico n Lo realiza un “scanner” también “tokenizer” n El scanner recorre

El analizador léxico n Lo realiza un “scanner” también “tokenizer” n El scanner recorre los caracteres de entrada (el fuente) hasta reconocer un “token” n token: unidad léxica indivisible n ejemplos: while, if, ==, >=, ancho, . . . n La secuencia de caracteres correspondiente se llama “lexema” (componente léxico) n 1 token <> 1 lexema n Existen Generadores automáticos de analizadores lexicos como LEX n 17

El analizador léxico n Además, suele realizar otras tareas: n n n procesar directivas

El analizador léxico n Además, suele realizar otras tareas: n n n procesar directivas al compilador (opciones) introducir información preliminar en la tabla de símbolos eliminar separadores innecesarios sustituir macros listar el fuente n Normalmente, los tokens se describen mediante expresiones regulares 18

El analizador léxico n Ejemplo: n El scanner deberá reconocer sucesivamente, 19

El analizador léxico n Ejemplo: n El scanner deberá reconocer sucesivamente, 19

El analizador sintáctico n O “parser” n Objetivo: agrupar los tokens suministrados por el

El analizador sintáctico n O “parser” n Objetivo: agrupar los tokens suministrados por el scanner para reconocer “frases” n ¿Cómo lo hace? n La sintaxis se suele especificar formalmente mediante una GLC n también de otros tipos n El parser recibe tokens y los agrupa de acuerdo a especificadas por la GLC n El parser detecta errores sintácticos n Y si es bueno, puede además realizar algunas correcciones n producciones 20

El analizador sintáctico n Ejemplo: n supongamos sintaxis asignación como: n y debemos analizar

El analizador sintáctico n Ejemplo: n supongamos sintaxis asignación como: n y debemos analizar 21

El analizador sintáctico n El árbol sintáctico correspondiente es 22

El analizador sintáctico n El árbol sintáctico correspondiente es 22

El analizador semántico n Realiza dos funciones: n Análisis de la semántica estática n

El analizador semántico n Realiza dos funciones: n Análisis de la semántica estática n ¿Es cada construcción legal y “con sentido”? § variables en una expresión definidas § del tipo adecuado § alcance de los objetos n Generación del código intermedio n Generalmente se lleva a cabo mediante gramáticas de atributos § la GLC se completa con atributos necesarios § § 23 tipo valor acciones a ejecutar cuando se detecta una construcción legal. .

Generación de Código Intermedio Cuando el número de lenguajes fuente crece hasta un número

Generación de Código Intermedio 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 Mx. N 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. 24

Generación de Código Intermedio La generación de código intermedio transforma un árbol de análisis

Generación de Código Intermedio 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. 25 While (A>B) AND (A<=2*B-5) Do A : = A + B L 1: IF A>B GOTO L 2 GOTO L 3 L 2: T 1: = 2*B T 2: = T 1 -5 IF A<=T 2 GOTO L 4 GOTO L 3 L 4: A: = A+B GOTO L 1 L 3: . .

OPTIMIZACION DE CODIGO n El código intermedio generado es analizado y transformado en uno

OPTIMIZACION DE CODIGO n El código intermedio generado es analizado y transformado en uno equivalente optimizado n Es una tarea muy costosa n De hecho, generalmente se puede invocar al compilador activando/desactivando esta opción n Otras veces, optimiza el código objeto n usual la optimización “peephole”: n n 26 tomar una porción pequeña de código y hacer una optimización local “desenrrollado” de bucles eliminación de recursividad final. .

GENERACION DE CODIGO n Toma código intermedio y genera código objeto para la máquina

GENERACION DE CODIGO n Toma código intermedio y genera código objeto para la máquina considerada n Es la parte más próxima a la arquitectura de la máquina n Habitualmente, se escriben “a mano” n desarrollo “a medida” para cada máquina específica n Dada la complejidad, si no se va a realizar optimización, se asocia la generación de código a las rutinas semánticas n 27 compiladores de “una pasada”

La tabla de símbolos n Mecanismo para almacenar/acceder la información de los identificadores n

La tabla de símbolos n Mecanismo para almacenar/acceder la información de los identificadores n Las informaciones asociadas a un identificador se denominan “atributos” n Cada vez que se usa un identificador, la tabla de símbolos proporciona la información necesaria n Se usa tanto en la parte de análisis como en la de síntesis 28

Manejo de errores Es una de las misiones mas importantes de un compilador, aunque

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) 2) A veces unos errores ocultan otros A veces un error provoca una avalancha de muchos errores que se solucionan con el primero Criterios en el manejo de errores a) b) 29 Pararse al detectar el primer error Detectar todos los errores de un pasada