Vous êtes sur la page 1sur 10

UNIDAD I

Introduccin
Por qu estudiar diseo de compiladores?
Algunas de las razones interesantes entre otras se muestran a continuacin:
El diseo de compiladores es una rama de la ciencia informtica considerada de xito, y una
de las primeras en ganarse el nombre de ciencia.
Dada su relacin muy cercana con la conversin de archivos, tiene un campo de aplicacin
muy amplio, ms all de los compiladores;
Contiene muchos algoritmos de uso general.
Por lo anterior, se dice que, el disear compiladores nos permite llevar a cabo la estructuracin clara
de un problema, puesto que un compilador analiza su entrada, construye una representacin
semntica, y sintetiza su salida a partir de ella; esto es muy potente y tiene un campo de aplicacin
muy amplio.
Tambin las estructuras de anlisis y sntesis son poderosas, sin ellas cada nuevo lenguaje
necesitara un conjunto nuevo de compiladores para cada sistema, sin embargo, es suficiente
combinar un nuevo front-end con los backs-ends existentes para los sistemas actuales.
Es por ello que el estudio de los compiladores son parte sustancial para el ingeniero en computacin
y, por ello, a continuacin, se hace referencia a la trayectoria de los mismos.

1.1 HISTORIA

SE DISTINGUEN TRES PERIODOS EN LA HISTORIA DEL DISEO DE COMPILADORES:

1945-1960: Generacin de Cdigo


Durante este periodo se trabajaba y se vea mejor la programacin con lenguaje ensamblador y a
los lenguajes de ms alto nivel se les tena reservas siendo que a este tipo de programacin se le
llamaba programacin automtica.El primer compilador de FORTRAN (Sheridan,1959) fue un gran
adelanto.

1960-1975: Anlisis
Aqu proliferaron los lenguajes de programacin y los diseadores comenzaron a pensar que era
ms importante obtener el compilador para un lenguaje nuevo era mejor que tener uno que generara
cdigo muy eficiente,as mismo se generaron varios estudios para obtener tcnicas que podan
aprovecharse en el diseo del front-end en particular en generacin de analizadores sintcticos.
1975-TIEMPO ACTUAL: Generacin de Cdigo y optimizacin de Cdigo; paradigmas
Desde el 75 el pblico empez a demandar compiladores profesionales que fueran fiables, eficientes
tanto en uso como en cdigo generado, lo que es ms fcil ahora, ya que al disminuir los cambios
en las mquinas aument la esperanza de vida de los generadores de cdigo.
Se desarrollaron nuevos paradigmas de programacin: funcional, lgica y distribuida.
Hay ms nfasis en cmo compilar y a qu compilar.
DETALLES HISTRICOS DEL DESARROLLO DE LOS COMPILADORES
1946, se desarrolla el primer ordenador digital

Las instrucciones que se ejecutaban eran cdigos numricos, lenguaje de mquina., esto es
engorroso, entonces surgen los ensamblador. Al inicio el programa se escriba mediante claves y
luego se traduca manualmente al lenguaje de mquina. Cuando esto lo hizo la misma mquina, a
este trabajo se le llam ensamblar el programa.

1950, John Backus dirige una investigacin en IBM en un lenguaje algebraico

1954, se comienza a desarrollar FORTRAN

1957, FORTRAN se utiliza en la IBM modelo 704

Surge el concepto traductor

El primer compilador de FORTRAN tard 18 aos-persona en realizarse

FORTRAN era dependiente de la mquina

Paralelamente al desarrollo de FORTRAN en Amrica, en Europa surge una corriente que pretende
que los lenguajes fuesen independientes de la mquina, esta corriente estaba influida por los trabajos
sobre GLC de Chomsky

Surge un grupo Europeo encabezado por F.L. Bauer, en la que particip ACM y John Backus. De
este grupo surge un informe que define un Lenguaje Algebraico Internacional, publicado en Zurich
en 1958

1969, aparece Algol 60

Junto con los lenguajes tambin la tcnica de los compiladores avanza

1958, Strong y otros proponen una solucin al problema de que un compilador fuera portable, y esta
era dividir al compilador en dos fases front end (analiza el programa fuente) y back end (genera
cdigo objeto para la mquina objeto).

El puente de unin era un lenguaje intermedio denominado UNCOL Universal Computer Oriented
Language(no funcion)

1959, Rabin y Scott proponen el empleo de AFD y AFN para el reconocimiento lexicogrfico de los
lenguajes

Aparece BNF (Backus-1960, Naur-1963, Knuth-1964) como una gua para el desarrollo del anlisis
sintctico

1959, Sheridan describe un mtodo de parsing de FORTRAN para introducir parntesis en una
expresin

En los 60s se desarrollan diversos mtodos de parsers ascendentes y descendentes

Floyd ms adelante introduce la tcnica de precedencia de operadores y uso de funciones de


precedencia

1961, se usa por primera vez un parsing descendente recursivo

En los 60s se estudia el paso de parmetros por nombre, valor y referencia y se incluyen los
procedimientos recursivos para Algol 60

Se desarrolla la localizacin dinmica de datos


1968, se estudia y definen las GLC, los parsers predictivos y la eliminacin de recursividad izquierda

1975, aparece LEX generador automtico de analizadores lxicos a partir de expresiones regulares
bajo UNIX

A mitad de los 70s Johnson crea YACC para UNIX (generador de analizadores sintcticos)

Ahora un compilador de divide en varias fases

El ltimo lenguaje de programacin de amplia aceptacin es JAVA (es interpretado)

Tipos de Compiladores

El escritor del compilador, como cualquier programador, puede usar con provecho herramientas de
software tales como depuradores, administradores de versiones, analizadores, etctera. Adems
de estas herramientas de desarrollo de software, se han creado herramientas ms especializadas
para ayudar a implantar varias fases de un compilador. Poco despus de escribirse el primer
compilador, aparecieron sistemas para ayudar en el proceso de escritura de compiladores. A
menudo se hace referencia a estos sistemas como compiladores de compiladores, generadores de
compiladores o sistemas generadores de traductores. En gran parte, se orientan en torno a un
modelo particular de lenguaje, y son ms adecuados para generar compiladores de lenguajes
similares al del modelo.
Por ejemplo, es tentador suponer que los analizadores lxicos para todos los lenguajes son en
esencia iguales, excepto por las palabras clave y signos particulares que se reconocen. Muchos
compiladores de compiladores de hecho producen rutinas fijas de anlisis lxico para usar en el
compilador generado. Estas rutinas slo difieren en la lista de palabras clave que reconocen, y esta
lista es todo lo que debe proporcionar el usuario. El planteamiento es vlido, pero puede no ser
funcional si se requiere que reconozca componentes lxicos no estndar, como identificadores que
pueden incluir ciertos caracteres distintos de letras y dgitos.
Se han creado algunas herramientas generales para el diseo automtico de componentes
especficos de compilador. Estas herramientas utilizan lenguajes especializados para especificar e
implantar el componente, y pueden utilizar algoritmos bastante complejos. Las herramientas ms
efectivas son las que ocultan los detalles del algoritmo de generacin y producen componentes que
se pueden integrar con facilidad al resto del compilador. La siguiente es una lista de algunas
herramientas tiles para la construccin de compiladores:
I. Generadores de analizadores sintcticos. Estos generadores producen analizadores sintcticos,
normalmente a partir de una entrada fundamentada en una gramtica independiente del contexto.
En los primeros compiladores, el anlisis sintctico consuma no slo gran parte del tiempo de
ejecucin del compilador, sino gran parte del esfuerzo intelectual de escribirlo. Esta fase se
considera ahora una de las ms fciles de aplicar. Muchos de los pequeos lenguajes utilizados
en la composicin de este libro, como, PIC (Kernighan ([1982]) y EQN, se aplicaron en unos das
por medio del generador de analizadores sintcticos ya vistos. Muchos de los generadores de
analizadores sintcticos utilizan poderosos algoritmos de anlisis sintctico, y son demasiado
complejos para realizarlos manualmente.
2. Generadores de analizadores lxicos. Estas herramientas generan automticamente
analizadores lxicos. La organizacin bsica del analizador lxico resultante es en realidad un
autmata finito.
3. Dispositivos de traduccin dirigida por la sintaxis. Estos producen grupos de rutinas que recorren
el rbol de anlisis sintctico, como el de la figura 1.4, generando cdigo intermedio. La idea bsica
es que se asocian una o ms traducciones con cada nodo del rbol de anlisis sintctico, y cada
traduccin se define partiendo de traducciones en sus nodos vecinos en el rbol.
4. Generadores automticos de cdigo. Tales herramientas toman un conjunto de reglas que
definen la traduccin de cada operacin del lenguaje intermedio al lenguaje de mquina para la
mquina objeto. Las reglas deben incluir suficiente detalle para poder manejar los distintos mtodos
de acceso posibles a los datos: por ejemplo, las variables pueden estar en registros, en una posicin
fija (esttica) de memoria o pueden tener asignada una posicin en una pila. La tcnica fundamental
es la de concordancia de plantillas. Las proposiciones de cdigo intermedio se reemplazan por
plantillas que representan secuencias de instrucciones de mquina, de modo que las suposiciones
sobre el almacenamiento de las variables concuerden de plantilla a plantilla. Como suele haber
muchas opciones en relacin con la ubicacin de las variables (por ejemplo, en uno o varios
registros o en memoria), hay muchas formas posibles de cubrir el cdigo intermedio con un
conjunto dado de plantillas, y es necesario seleccionar una buena cobertura sin una explosin
combinatoria en el tiempo de ejecucin del compilador.
5. Dispositivos para anlisis de flujo de datos. Mucha de la informacin necesaria para hacer una
buena optimacin de cdigo implica hacer un anlisis de flujo de datos, que consiste en b
recoleccin de informacin sobre la forma en que se transmiten los valores de una parte de un
programa a cada una de las otras partes. Las distintas tareas de esa naturaleza se pueden efectuar
esencialmente con la misma rutina, en la que el usuario proporciona los detalles relativos a la
relacin que hay entre las proposiciones en cdigo intermedio y la informacin que se est
recolectando.

Clasificacin de los compiladores

a) Compilador cruzado. Genera un cdigo ejecutable en un ordenador distinto de aquel en que se


realiza la compilacin.
b) Compilador de montaje y ejecucin. Se fragmenta el programa fuente en mdulos que se
compilan por separado, y una vez compilados se unen mediante un enlazador para formar un
mdulo ejecutable.
c) Compilador en una pasada. Examina el cdigo fuente una sola vez, generando el cdigo objeto.
d) Compilador de pasadas mltiples Requiere varias lecturas del programa fuente para producir y
optimizar el cdigo objeto.
e) Compilador de optimizacin. Lee el cdigo fuente, lo analiza, optimiza y descubre errores
potenciales sin ejecutar el programa.
f) Compilador incremental. Compila el programa fuente, en caso de detectar errores al volver a
compilar el programa corregido, solo compila las modificaciones que se han hecho respecto al
primero.
g) Ensamblador. El lenguaje fuente es el lenguaje ensamblador.
h) Autocompilador. Es el compilador que est escrito en el mismo lenguaje a compilar, bsicamente
nos sirve para hacer ampliaciones al lenguaje, mejorar el cdigo generado, etc.
i) Metacompilador. Compilador de compiladores. Obtiene como entrada la definicin de un
lenguaje y como salida el compilador para dicho lenguaje.

Enlaces:http://www.sites.upiicsa.ipn.mx/polilibros/portal/polilibros/p_terminados/PolilibroFC/Unidad
_III/Unidad%20III_6.htm

Fuente:http://cidecame.uaeh.edu.mx
1.2 PROGRAMAS RELACIONADOS CON LOS COMPILADORES
Intrpretes
Es un traductor de lenguaje, sin embargo difiere de un compilador porque ejecuta el programa fuente
inmediatamente, en vez de generar un cdigo objeto que se ejecuta despus que se completa la
traduccin.

Ejemplo:
BASIC es un leguaje que generalmente interpretado en vez de compilado, de manera similar el LISP.
Es preferible usar un compilador si lo que importa es la velocidad de ejecucin, ya que el cdigo
objeto compilado es siempre ms rpido que el cdigo fuente interpretado.

Ensambladores
Es un traductor para el lenguaje ensamblador de una computadora en particular.

Ligadores
Tanto los compiladores como ligadores dependen de un programa conocido como ligador,
el cual recopila el cdigo que se compila o ensambla por separado en diferentes archivos objeto, a
un archivo que es directamente ejecutable.

Cargadores
Con frecuencia un compilador,ensamblador o ligador producir un cdigo que todava no
est completamente organizado y listo para ejecutarse , pero cuyas principales
referencias de memoria se hacen relativas a una localidad de arranque indeterminada que puede
estar en cualquier sitio de la memoria. Se dice que tal cdigo es relocalizable y un cargador resolver
todas las direcciones relocalizables relativas a una direccin base.

Preprocesadores
Es un programa separado que es invocado por el compilador antes de que comience la
traduccin real. Puede eliminar los comentarios, incluir otros archivos y ejecutar situaciones de
macro.

Editores

Los compiladores por lo regular aceptan programas fuente escritos utilizando cualquier
editor, un editor puede ser orientado hacia el formato o estructura del lenguaje de programacin en
cuestin, a estos editores se les denomina basados en estructura y ya incluyen algunas de las
operaciones de un compilador.

Depuradores

Es un programa que puede utilizarse para determinar los errores de ejecucin en un


programa compilado, est integrado en un compilador en un IDE (ambiente de desarrollo
interactivo); el depurador se mantiene al tanto de la mayora de la informacin del cdigo fuente, tal
como los nmeros de lnea y los nombres de las variables y procedimientos, tambin puede detener
la ejecucin en ubicaciones especificadas denominadas puntos de ruptura.

Perfiladores

Es un programa que recolecta estadsticas sobre el comportamiento de un programa objeto


durante la ejecucin. Las estadsticas tpicas son el nmero de veces que se llama a cada
procedimiento y el porcentaje de tiempo de ejecucin que se ocupa en cada uno de ellos.
Aplicacin de las tcnicas de diseo de compiladores

Las tcnicas del diseo de compiladores pueden y de hecho se aplican fuera del diseo de
compiladores. Algunos ejemplos son la lectura de datos estructurados, la introduccin rpida de
nuevos formatos y los problemas genricos de conversin de archivos.
Es posible escribir una gramtica si los datos tienen una estructura clara . Puede usarse para crear
rpidamente funciones de lectura para archivos HTML PostScript; tambin facilita la introduccin de
nuevos formatos, por ejemplo algunos sistemas de conversin de archivos que se han beneficiado
de las tcnicas de diseo de compiladores son formateadores de texto TeX, que convierte texto Text
al formato dvi, y los intrpretes de PostScript, que convierten texto PostScript a las instrucciones
especficas de cada impresora.
Tambin los compiladores emplean algoritmos de uso general como ya se ha mencionado con
anterioridad, por ejemplo las tablas Hash, tablas precalculadas, las pilas, recoleccin de basura, la
programacin dinmica y los algoritmos de grafos.
As pues hay que tomar en cuenta que al llevar a cabo el diseo de un compilador debemos
enfocarnos en el corazn mismo que es la representacin semntica del programa que est
compilando, la cual toma la forma de una estructura de datos, denominada cdigo intermedio, el cual
puede tomar muchas formas, entre ellas dos elecciones muy comunes son: las listas enlazadas de
seudoinstrucciones y los rboles sintcticos abstractos anotados, ste ltimo se realiza
generalmente ya que va asociado con la semntica del mismo diseo.
El rbol sintctico de un programa es una estructura de datos que muestra de manera precisa cmo
se ven los segmentos del texto del programa. El rbol puede obtenerse mediante un proceso
denominado anlisis sintctico, el cual estructura un texto de acuerdo a una gramtica dada, por ello
los rboles sintcticos se denominan rboles de anlisis; la forma exacta que necesita una
gramtica usualmente se tiene que modificar a lo que se le llama entonces un AST rbol sintctico
abstracto, en los nodos de este rbol se aade informacin detallada sobre la semntica mediante
anotaciones, almacenadas en campos adicionales a los nodos de ah el trmino rbol sintctico
anotado.
Algunos ejemplos de anotaciones son la informacin de tipos (asignacin de array booleano) y la
informacin de optimizacin (esta expresin no contiene llamada a otra funcin). La primera se
refiere a la semntica tal y se utiliza para la deteccin de errores de contexto; la segunda puede ser
importante para la fase de cdigo intermedio; las anotaciones de un nodo tambin se llaman atributos
de ese nodo, y dado que un nodo representa un smbolo gramatical se dice que un smbolo
gramatical tiene los correspondientes atributos.
1.3 PROCESO DE TRADUCCIN

Un compilador se compone internamente de varias etapas que realizan distintas operaciones lgicas.

Fases de un Compilador

Un compilador tpicamente opera en fases , cada una lleva a cabo una tarea sobre el programa
fuente. Las primeras tres fases suelen agruparse en una sola fase llamada fase de anlisis y las
ltimas tres en una llamada fase de sntesis. La fase de anlisis y el modulo de manejo de errores
se describirn posteriormente. La fase de sntesis no es relevante en el contexto de un lenguaje
multibase de datos, ya que este sigue un enfoque diferente que el de los lenguajes tradicionales, por
esta razn solo se menciona.
Muchas herramientas de software que manipulan programas fuente realizan primero algn tipo de
anlisis, entre estas se encuentran los editores de estructuras, impresoras estticas, verificadores
estticos y los intrpretes.

Estructura de un Compilador.

Cualquier compilador debe realizar dos tareas principales: anlisis del programa a compilar y sntesis
de un programa en lenguaje maquina que, cuando se ejecute, realizara correctamente las
actividades descritas en el programa fuente. Para el estudio de un compilador, es necesario dividir
su trabajo en fases. Cada fase representa una transformacin al cdigo fuente para obtener el cdigo
objeto. La siguiente figura representa los componentes en que se divide un compilador. Las tres
primeras fases realizan la tarea de anlisis, y las dems la sntesis. En cada una de las fases se
utiliza un administrador de la tabla de smbolos y un manejador de errores.
1.6 Arranque automtico y portabilidad

EL SISTEMA DE ENTRADA El sistema de entrada y el analizador lxico funcionan como una pareja
productor-consumidor; la misma manera de funcionar del analizador lxico respecto al analizador
sintctico. Con esta distribucin de tareas se mejora:
La eficiencia ya que las rutinas de acceso al programa de entrada pueden estar altamente
especializadas y optimizadas.
La portabilidad, ya que de todas las fases de anlisis del compilador estn comunicadas el
programa completo de ser capaz de poder ejecutarse en cualquier equipo, por lo que las rutinas del
sistema de entrada son las nicas que se comunican con el sistema operativo, permitiendo esta
relacin.
Puesto que el analizador lxico debe detectar siempre el token con el lexema ms largo
posible, otro aspecto que hay que tener en cuenta, antes de poder determinar correctamente de qu
testigo se trata, es la necesidad de leer caracteres por avanzado (lookahead). No obstante, esto
ocasiona problemas de lectura, por lo que el sistema de entrada del analizador lxico debe utilizar
una memoria intermedia propia de manera que:
Lee un bloque de caracteres de disco y lo guarda en la memoria intermedia. Adems
utiliza unos apuntadores para sealar la porcin que ya ha sido analizada.
Si han de retornarse caracteres al flujo de entrada, mueve el apuntador tantas
posiciones hacia atrs como caracteres se tengan que retornar.

De los tokens al rbol de anlisis sintctico


Las gramticas son una herramienta esencial para la especificacin de los lenguajes.
Una gramtica sirve para imponer una estructura en la secuencia lineal de tokens que constituye el
programa; el proceso a partir de esta estructura se denomina el anlisis sintctico, por ello las
gramticas pueden emplearse para construir un analizador sintctico automticamente.
Existen dos formas bien constituidas para el anlisis sintctico:
El anlisis sintctico determinista ascendente de izquierda a derecha (LL) y
El determinista descendente de izquierda a derecha (LR y LALR).
La expresin de izquierda a derecha significa que el texto del programa, o secuencia de tokens, es
procesada de izquierda a derecha, un token cada vez.
el trmino determinista significa que no se realiza ninguna bsqueda: cada token lleva al analizador
un paso ms cerca de su meta de construccin del rbol sintctico.
Los mtodos de anlisis determinista requieren una cantidad de tiempo lineal con la longitud de la
secuencia de entrada: son mtodos lineales en el tiempo.
Ejercicios:
1.-De acuerdo a las siguientes reglas G={N,T,P,S} o que es lo mismmo G={V,T,P,S} donde
N={S},T={a,b},P={S aSb, S ab} obtener el lenguaje anbn para n >=1

2.- Obtener (id+id)+id de la siguiente gramtica


expresin expresin * expresin
expresin (expresin) | expresin + expresin
expresin id

3.-De acuerdo a la siguiente gramtica obtener su lenguaje S aAS | a A SbA | SS | ba


Anlsis Lxico

Funcin del analizador lxico Es la primera fase de un compilador. Su principal funcin consiste en
leer la secuencia de caracteres del programa fuente, carcter a carcter, y elaborar como salida la
secuencia de componentes lxicos que utiliza el analizador sintctico. El analizador sintctico emite
la orden al analizador lxico para que agrupe los caracteres y forme unidades con significado propio
llamados componentes lxicos (tokens). Los componentes lxicos representan:
o Palabras reservadas: if, while, do,
o Identificadores: variables, funciones, tipos definidos por el usuario, etiquetas,
o Operadores: =, >, <, >=, <=, +, *,
o Smbolos especiales: ;, ( ), { },
o Constantes numricas. literales que representan valores enteros y flotantes.
o Constantes de carcter: literales que representan cadenas de caracteres.

El analizador lxico opera bajo peticin del analizador sintctico devolviendo un componente lxico
conforme el analizador sintctico lo va necesitando para avanzar en la gramtica. Los componentes
lxicos son los smbolos terminales de la gramtica. Suele implementarse como una subrutina del
analizador sintctico. Cuando recibe la orden obtn el siguiente componente lxico, el analizador
lxico lee los caracteres de entrada hasta identificar el siguiente componente lxico.

Es responsable de:
o Manejo de apertura y cierre de archivo, lectura de caracteres y gestin de posibles errores de
apertura.
o Eliminar comentarios, espacios en blanco, tabuladores y saltos de lnea.
o Inclusin de archivos y macros.
o Contabilizar nmero de lneas y columnas para emitir mensajes de error.

Una de las ventajas de separar el anlisis lxico y anlisis sintctico es que facilita la
transportabilidad del traductor si se decide realizar cambios posteriores.

Ejemplo cambiar las etiquetas begin-end por llaves de apertura y cierre { }.

Componentes lxicos(tokens), patrones y lexemas

En la fase de anlisis, los trminos componentes lxicos (token), patrn y lexema se emplean con
significados especficos.
Un analizador lxico, inicialmente lee los lexemas y le asigna un significado propio.

componente lxico es la secuencia lgica y coherente de caracteres relativo a una categora:


identificador, palabra reservada, literales (cadena/numrica), operador o carcter de puntuacin,
adems de que un componente lxico puede tener uno o varios lexemas.
patrn es una regla que genera la secuencia de caracteres que puede representar a un
determinado componente lxico (expresin regular).
lexema es una cadena de caracteres que concuerda con un patrn que describe un componente
lxico (valor de cadena).

Vous aimerez peut-être aussi