Вы находитесь на странице: 1из 28

Compiladores

Unidad 1. Introduccin al
proceso de compilacin.

Contenido
Introduccin

a la compilacin
Estructura y fases de un compilador
Lenguajes y tipos de traductores
Herramientas para el desarrollo de un
compilador
Clasificacin de los compiladores

Introduccin a la compilacin
La

escritura de compiladores comprende los


lenguajes de programacin, la arquitectura
de computadoras, la teora de lenguajes, los
algoritmos y la ingeniera de software
[Aho98].

Introduccin a la compilacin (2)

A grandes rasgos, un compilador es un programa


que lee un programa escrito en algn lenguaje
(fuente) y lo traduce a un programa equivalente en
otro lenguaje (objeto).
Una parte importante de ste proceso de traduccin
es presentar los errores del programa fuente.
Programa
Fuente

Compilador

Mensajes
de error

Programa
Objeto

Introduccin a la compilacin (3)


Modelo

de anlisis y sntesis de la
compilacin

Fase de anlisis

Divide al programa fuente en sus elementos


componentes y crea una representacin intermedia.

Fase de sntesis

Construye el programa objeto a partir de la


representacin intermedia.

Introduccin a la compilacin (4)

Existe una gran variedad de software que realiza algn tipo de anlisis sobre
programas fuente, por ejemplo:

Editores de estructuras

Analiza el texto del programa fuente imponindole una estructura jerrquica apropiada.
Tambin puede proporcionar:

Visualizadores estticos

Imprime el programa fuente de tal forma que visiblemente claro. Por ejemplo:

Los comentarios pueden aparecer con un tipo de letra especial, al igual que las palabras clave.
Indentacin proporcional a la profundidad del anidamiento.

Verificadores estticos

Lee el programa fuente y lo analiza para intentar descubrir errores potenciales sin
ejecutar el programa. Por ejemplo:

Palabras clave de forma automtica


Saltos desde un parntesis, llave, o corchete que abre hasta su correspondiente que cierra.
Ayuda en la edicin de las estructuras propias del lenguaje.

Partes del programa que nunca se podrn ejecutar.


Si una variable se utiliza antes de ser definida.
Intentar utilizar una variable de tipo real como apuntador.

Intrpretes

En lugar de producir un programa objeto como resultado de una traduccin, realiza las
operaciones que implica el programa fuente.
En la mayora de las ocasiones son utilizados para ejecutar rdenes (por ejemplo: el
intrprete de comandos).

Introduccin a la compilacin (5)

Tradicionalmente se concibe a un
compilador como un programa que recibe
un programa fuente, escrito en algn
lenguaje de alto nivel, y genera cdigo
mquina.
Sin embargo, los principios con los que se
construyen compiladores tambin son
utilizados en otros lugares:

Formadores de textos (LaTex).


Intrpretes de consultas (SQL).

Introduccin a la
Estructura del programa fuente

compilacin (6)

Preprocesador

El contexto de un compilador

Cuando se requiere generar un


objeto ejecutable, el compilador
requiere de otros programas.

Programa fuente

Compilador
Programa objeto en lenguaje ensamblador

Ensamblador
Cdigo mquina relocalizable
Libreras, bibliotecas y
Archivos objeto relocalizables

Enlazador y cargador

Cdigo mquina absoluto

Estructura y fases de un
compilador

En la compilacin el anlisis consta de tres fases:

Anlisis lineal
La secuencia de caracteres que forma el programa fuente
se lee de izquierda a derecha y se agrupa en componentes
lxicos, que son secuencias de caracteres que tienen un
significado colectivo.
Anlisis jerrquico
Los componentes lxicos se agrupan jerrquicamente en
colecciones anidadas con un significado colectivo.
Anlisis semntico
Se realizan ciertas revisiones para asegurar que los
componentes de un programa se ajustan de un modo
significativo.

Estructura y fases de un
compilador (2)

Anlisis lineal

Tambin conocido como: anlisis lxico o exploracin.


Ejemplo, en la proposicin de asignacin:
posicion = inicial + velocidad * 60
Se identifican los siguientes componentes lxicos

Identificador (posicion)
Smbolo de asignacin (=)
Identificador (inicial)
Signo de suma (+)
Identificador (velocidad)
Signo de multiplicacin (*)
Nmero (60)

Estructura y fases de un
compilador (3)

Anlisis jerrquico

Tambin llamado anlisis sintctico.


Implica agrupar los componentes lxicos en frases
gramaticales que el compilador utiliza para sintetizar la
salida.
Por lo general, las frases gramaticales se representan
mediante un rbol de anlisis sintctico.
Proposicin
Ejemplo:
de asignacin
Identificador
posicin

=
expresin

expresin
+

expresin

identificador

expresin

inicial

identificador

Nmero

velocidad

60

expresin

Estructura y fases de un
compilador (4)

La estructura jerrquica de un programa normalmente se expresa


utilizando reglas recursivas. Para el ejemplo anterior de la
proposicin de asignacin se tiene:
Cualquier identificador es una expresin
Cualquier nmero es una expresin
Si expresin1 y expresin2 son expresiones, entonces tambin lo
son:

expresin1 + expresin2
expresin1 * expresin2
(expresin1)

Proposicin
de asignacin
Identificador
posicion

=
expresin

expresin
+

expresin

identificador

expresin

inicial

identificador

Nmero

velocidad

60

expresin

Estructura y fases de un
compilador (5)

Muchos lenguajes definen recursivamente las proposiciones


mediante reglas como:
Si identificador1 es un identificador y expresin2 es un identificador,
entonces:

Si expresin1 es una expresin y proposicin2 es una proposicin,


entonces:

Identificador1 = expresin2

while ( expresin1 ) do proposicin2


if ( expresin1 ) then proposicin2

El anlisis lineal (lxico) no es suficientemente poderoso para


analizar proposiciones o expresiones recursivas.
Cundo una construccin del lenguaje fuente es recursiva,
entonces es factible emplear una gramtica libre de contexto para
formalizar la recursin.

Estructura y fases de un
compilador (6)

Anlisis semntico
Revisa el programa e intenta encontrar errores semnticos.
Rene la informacin sobre los tipos para la fase posterior de
generacin de cdigo.
Un componente importante es la verificacin de tipos.

Se verifica si cada operador tiene los operandos permitidos.

Un real no debe utilizarse como ndice de un arreglo.

Convertir un nmero entero a real para algunos operadores.

El anlisis semntico inserta una conversin de entero a real en el rbol de anlisis sintctico
=

posicion

posicion

inicial
velocidad

inicial

*
60

velocidad

*
ent a real
60

Estructura y fases de un
compilador (7)

Conceptualmente un compilador opera en fases, cada una de las


cuales transforma al programa fuente de una representacin a otra.
Programa fuente
Analizador lxico

Analizador sintctico

Administrador de la
Tabla de smbolos

Analizador semntico
Generador de
cdigo intermedio

Optimizador de cdigo

Generador de cdigo
Programa objeto

Manejador
de errores

posicion = inicial + velocidad * 60

Estructura y fases de un
compilador (8)

Analizador lxico
id1 = id2 + id3 * 60
Analizador sintctico
=
id1

Administracin de la tabla de smbolos

Trata de mejorar el cdigo intermedio de modo


que resulte un cdigo mquina ms rpido de
ejecutar.

Generacin de cdigo

id1

T ABLA DE SIMBOLOS
1

posicion

inicial

velocidad

Se puede considerar como cdigo para una


4
mquina abstracta.
Dicha representacin debe ser fcil de producir y
fcil de traducir al cdigo objeto.

Optimizacin de cdigo

Cambian la representacin interna del programa


fuente conforme avanza cada una de ellas.

Por lo general se trata de cdigo mquina


relocalizable o cdigo ensamblador.
Se deben seleccionar posiciones de memoria para
cada una de las variables.

60

Analizador semntico

En cada fase se pueden encontrar errores.


Se debe definir como se deben tratar los errores
en cada una de las fases.

Generacin de cdigo intermedio

Registra los identificadores e informacin


referente a ellos.
Se tiene un registro por cada identificador.
Todas las fases hacen uso de esta tabla.

Las fases de anlisis

*
id3

Deteccin e informacin de errores

+
id2

+
id2
id3

*
ent a real
60

Generador de cdigo intermedio


temp1 = entreal(60)
temp2 = id3 * temp 1
temp3 = id2 +temp 2
Id1 = temp3
Optimizador de cdigo
temp 1 = id3 * 60.0
temp 2 = id2 +temp 1
Id1 = temp2
Generador de cdigo
MOVF id 3, R2
MULF #60.0, R2
MOVF id 2, R1
ADDF R2, R1
MOV R1, id1

Estructura y fases de un
compilador (9)

Con frecuencia las fases de un compilador


se agrupan en una etapa inicial y una etapa
final:

Etapa inicial

Etapa final

CLR Architecture.PNG

Comprende aquellas fases que dependen


principalmente del cdigo fuente.
Normalmente incluye el anlisis lxico,
sintctico y semntico, la creacin de la tabla
de smbolos, la generacin de cdigo
intermedio y cierta optimizacin de ste.
Tambin incluye el manejo de errores
correspondientes a cada etapa.
Comprende aquellas partes del compilador
que dependen de la mquina objeto.
En general estas partes dependen del
lenguaje intermedio, ms que del lenguaje
fuente.
Comprende aspectos de optimizacin y
generacin de cdigo, junto con el manejo de
errores necesario y las operaciones con la
tabla de smbolos.

Estructura y fases de un
compilador (10)

Pasadas

Consiste en leer un archivo de entrada y escribir uno de salida.


Es comn que se apliquen varias fases de la compilacin en una
sola pasada

Reduccin de pasadas

Es deseable tener pocas pasadas dado que la lectura y la escritura


de archivos intermedios lleva tiempo.
Sin embargo, en ocasiones resulta muy difcil generar cdigo si no
se tiene una representacin intermedia completa. Por ejemplo:

Las instrucciones de tipo goto que saltan hacia delante. En este caso
es posible dejar un espacio en blanco y rellenar cuando la
informacin est disponible

Lenguajes y tipos de
traductores

Un lenguaje de programacin se puede definir como:

Notacin formal para describir algoritmos o funciones que sern


ejecutadas por una computadora.
Lenguaje para comunicar instrucciones a la computadora.
Convencin para escribir descripciones que pueden ser evaluadas.

Dentro de los atributos de un buen lenguaje estn:

Claridad y sencillez
Naturalidad para la aplicacin
Apoyo para la abstraccin
Facilidad para verificar programas
Entorno de programacin
Portabilidad de programas
Costo de uso

Costo de ejecucin
Costo de traduccin
Costo de creacin y prueba
Costo de mantenimiento

Lenguajes y tipos de traductores


(2)

El trmino general traductor denota cualquier procesador de


lenguajes que acepta programas en cierto lenguaje fuente
como entrada y produce lenguajes funcionalmente equivalentes
en otro lenguaje objeto.
Varios tipos de traductores tienen nombres especializados:
Ensamblador
Compilador
Cargador o editor de vnculos
Preprocesador o macroprocesador
Conversor fuente-fuente
Simulador o intrprete de software
Compresores
Formateadores

Lenguajes y tipos de traductores


(3)
Se puede hacer una clara divisin
entre dos tipos de lenguajes:

Procesamiento de un
programa en lenguaje C

Lenguajes compilados
Ordinariamente se traducen al
lenguaje mquina de la computadora
real que los ejecutar.
El traductor para estos lenguajes es
relativamente grande y complejo,
adems produce cdigo objeto que se
ejecutar con tanta eficiencia como
sea posible

Lenguajes interpretados

No producen cdigo para una mquina


real.
Producen una forma intermedia del
programa cuya ejecucin es ms fcil
que la ejecucin del programa original.
Ordinariamente la ejecucin en un
intrprete de software es ms lenta.
La complejidad de implementacin
suele cargarse ms en el software de
simulacin

Cdigo en C

Tiempo de compilacin
(Traduccin)

Tiempo de ejecucin

Precompilador

Cdigo en Java
Archivos
de Cabecera

Compilador
Cdigo objeto
Enlazador

Procesamiento de un
programa en lenguaje Java

Compilador
Java

Bibliotecas
o
Paquetes

Bytecode Java
Red

Archivos
de Librera

Cdigo mquina

Cargador de clases

Hardware

Verificador de
Bytecode

Intrprete Generador
de
Cdigo
JVM Runtime

Hardware

Herramientas para la
construccin de compiladores

Existen herramientas especializadas


para implementar las diferentes fases
de un compilador.
Los sistemas de ayuda para construir
compiladores se conocen como:

Compiladores de compiladores
Generadores de compiladores
Sistemas generadores de compiladores

Herramientas para la
construccin de compiladores (2)

Algunas herramientas tiles para la construccin de compiladores


Generadores de analizadores lxicos

Generadores de analizadores sintcticos

Trabajan a partir de una gramtica independiente del contexto.


El generador hace de esta fase una de las ms fciles de aplicar.
Se utilizan poderosos y complejos algoritmos para realizar el anlisis.

Dispositivos de traduccin dirigida por la sintaxis

Por lo general, trabajan a partir de una especificacin basada en


expresiones regulares.
La organizacin bsica del analizador lxico resultante es un autmata
finito.

Producen grupos de rutinas que recorren el rbol de anlisis sintctico


generando cdigo intermedio.

Generadores automticos de cdigo

Toman un conjunto de reglas que definen la traduccin de cada


operacin del lenguaje intermedio al lenguaje de mquina objeto.
La tcnica fundamental es la concordancia de plantillas.

Herramientas para la
construccin de compiladores (3)

Un compilador es muy complejo como para programarlo en


ensamblador.
En el entorno de programacin UNIX, los compiladores se escriben
generalmente en C.
Se deben utilizar las ventajas del lenguaje para compilarse a s mismo
(los compiladores de C se escriben en C).
Sin embargo, un compilador slo es un programa. El entorno en el que
se desarrolle este programa puede afectar la velocidad y la fiabilidad de
la implantacin del compilador.
La mayora de las personas que escriben compiladores eligen un
lenguaje orientado a sistemas como C.

Herramientas para la
construccin de compiladores (3)

La escritura de compiladores, y en general de cualquier herramienta,


tendr un usuario final. Dicho usuario es quien hace realmente til al
software. Es necesario aplicar tcnicas de ingeniera de software en la
construccin de compiladores para evitar

Clasificacin de los
compiladores

Una caracterstica que identifica a los compiladores es el hecho


de que traducen completamente el lenguaje fuente de entrada
previo a la ejecucin del lenguaje objeto a ejecutar.
Los compiladores se pueden clasificar por el nmero de pasadas
en:
Compilador de una pasada

Examinan solo una vez el cdigo fuente para generar el cdigo objeto

Compiladores de mltiples pasadas

Requiere de pasos intermedios (cdigo intermedio) antes de generar


el cdigo objeto final.
Entre menos pasadas menor tiempo de compilacin, sin embargo
ms pasadas pueden generar cdigo objeto ms eficiente.

Clasificacin de los
compiladores (2)

Por el cdigo objeto generado se pueden clasificar en:


Metacompilador

Es un programa que acepta como entrada la descripcin de


un lenguaje y produce el compilador de dicho lenguaje.
Por lo regular hay dos tipos de metacompiladores, los que
trabajan con expresiones regulares y aquellos que lo hacen
con gramticas libres de contexto.
Ejemplos clsicos son Lex (generador de analizadores
lxicos) y Yacc (generador de analizadores sintcticos).

Descompilador

Realiza una tarea de traduccin inversa, es decir, va del


cdigo mquina al lenguaje de alto nivel.
Es relativamente sencillo cuando se trata de ir a cdigo
ensamblador o macro ensamblador, pero no cuando se
quiere llegar a un lenguaje de alto nivel.

Clasificacin de los
compiladores (3)

Compiladores-intrpretes

Realizan dos fases: la fase de compilacin y


la fase de interpretacin
La fase de compilacin traduce la entrada en
una representacin intermedia por una nica
vez.
La fase de interpretacin parte de la
representacin generada por la primera fase
para la ejecucin del programa.

Compiladores cruzados

Surgen como solucin al problema de


desarrollar un primer compilador para una
nueva arquitectura.
Dado que el desarrollo de compiladores es
una tarea compleja, resulta ms fcil
construirlos sobre una mquina que ya
disponga de herramientas de software.
Se denomina compilador cruzado a un
compilador que se ejecuta en una mquina
pero el cdigo objeto es para otra mquina.

Вам также может понравиться