Beruflich Dokumente
Kultur Dokumente
1. Introduccin
2. Clasificacin de Compiladores
3. Funciones de un compilador
4. Partes en las que trabaja un compilador
5. Forma de examinar de un compilador
6. Como se sintetiza el cdigo objeto un compilador estndar, terica y
grficamente generacin de cdigo
7. rboles sintcticos para representar como sintetiza el cdigo objeto un
compilador
8. Herramientas que muestran tipos de anlisis de programas fuente
9. Diagrama de anlisis de un programa fuente, definiendo cada una de sus
partes
10. Conclusiones
11. Bibliografa
1. Introduccin
En 1946 se desarroll el primer ordenador digital. En un principio, estas mquinas
ejecutaban instrucciones consistentes en cdigos numricos que sealan a los circuitos de la
mquina los estados correspondientes a cada operacin. Esta expresin mediante cdigos
numricos se llam Lenguaje Mquina, interpretado por un secuenciador cableado o por un
microprograma. Pero los cdigos numricos de las mquinas son engorrosos. Pronto los
primeros usuarios de estos ordenadores descubrieron la ventaja de escribir sus programas
mediante claves ms fciles de recordar que esos cdigos numricos; al final, todas esas
claves juntas se traducan manualmente a Lenguaje Mquina. Estas claves constituyen los
llamados lenguajes ensambladores, que se generalizaron en cuanto se dio el paso decisivo
de hacer que las propias mquinas realizaran el proceso mecnico de la traduccin. A este
trabajo se le llama ensamblar el programa.
Dada su correspondencia estrecha con las operaciones elementales de las mquinas, las
instrucciones de los lenguajes ensambladores obligan a programar cualquier funcin de una
manera minuciosa e iterativa. De hecho, normalmente, cuanto menor es el nivel de
expresin de un lenguaje de programacin, mayor rendimiento se obtiene en el uso de los
recursos fsicos (hardware). A pesar de todo, el lenguaje ensamblador segua siendo el de
una mquina, pero ms fcil de manejar. Los trabajos de investigacin se orientaron
entonces hacia la creacin de un lenguaje que expresara las distintas acciones a realizar de
una manera lo ms sencilla posible para el hombre. As, en 1950, John Backus dirigi una
investigacin en I.B.M. en un lenguaje algebraico. En 1954 se empez a desarrollar un
lenguaje que permita escribir frmulas matemticas de manera traducible por un
ordenador. Le llamaron FORTRAN (FORmulae TRANslator). Fue el primer lenguaje
considerado de alto nivel. Se introdujo en 1957 para el uso de la computadora IBM modelo
704. Permita una programacin ms cmoda y breve que lo existente hasta ese momento,
lo que supona un considerable ahorro de trabajo. Surgi as por primera vez el concepto de
un traductor, como un programa que traduca un lenguaje a otro lenguaje. En el caso
particular de que el lenguaje a traducir es un lenguaje de alto nivel y el lenguaje traducido
de bajo nivel, se emplea el trmino compilador.
La tarea de realizar un compilador no fue fcil. El primer compilador de FORTRAN tard
18 aos-persona en realizarse y era muy sencillo. Este desarrollo del FORTRAN estaba muy
influenciado por la mquina objeto en la que iba a ser implementado. Como un ejemplo de
ello tenemos el hecho de que los espacios en blanco fuesen ignorados, debido a que el
perifrico que se utilizaba como entrada de programas (una lectora de tarjetas perforadas)
no contaba correctamente los espacios en blanco. Paralelamente al desarrollo de FORTRAN
Compilador
En el caso de que el lenguaje fuente sea un lenguaje de programacin de alto nivel y el
objeto sea un lenguaje de bajo nivel (ensamblador o cdigo de mquina), a dicho traductor
se le denomina compilador. Un ensamblador es un compilador cuyo lenguaje fuente es el
lenguaje ensamblador. Un intrprete no genera un programa equivalente, sino que toma
una sentencia del programa fuente en un lenguaje de alto nivel y la traduce al cdigo
equivalente y al mismo tiempo lo ejecuta. Histricamente, con la escasez de memoria de los
primeros ordenadores, se puso de moda el uso de intrpretes frente a los compiladores,
pues el programa fuente sin traducir y el intrprete juntos daban una ocupacin de
memoria menor que la resultante de los compiladores. Por ello los primeros ordenadores
personales iban siempre acompaados de un intrprete de BASIC (Spectrum, Commodore
VIC-20, PC XT de IBM, etc.). La mejor informacin sobre los errores por parte del
compilador as como una mayor velocidad de ejecucin del cdigo resultante hizo que poco
a poco se impusieran los compiladores. Hoy en da, y con el problema de la memoria
prcticamente resuelto, se puede hablar de un gran predominio de los compiladores frente
a los intrpretes, aunque intrpretes como los incluidos en los navegadores de Internet para
interpretar el cdigo JVM de Java son la gran excepcin.
Ventajas de compilar frente a interpretar:
fichero objeto generado por el compilador las cabeceras necesarias y las funciones de
librera utilizadas por el programa fuente. El depurador permite, si el compilador ha
generado adecuadamente el programa objeto, seguir paso a paso la ejecucin de un
programa. Finalmente, muchos compiladores, en vez de generar cdigo objeto, generan un
programa en lenguaje ensamblador que debe despus convertirse en un ejecutable
mediante un programa ensamblador.
2. Clasificacin de Compiladores
El programa compilador traduce las instrucciones en un lenguaje de alto nivel a
instrucciones que la computadora puede interpretar y ejecutar. Para cada lenguaje de
programacin se requiere un compilador separado. El compilador traduce todo el programa
antes de ejecutarlo. Los compiladores son, pues, programas de traduccin insertados en la
memoria por el sistema operativo para convertir programas de cmputo en pulsaciones
electrnicas ejecutables (lenguaje de mquina). Los compiladores pueden ser de:
una sola pasada: examina el cdigo fuente una vez, generando el cdigo o programa
objeto.
pasadas mltiples: requieren pasos intermedios para producir un cdigo en otro
lenguaje, y una pasada final para producir y optimizar el cdigo producido durante los
pasos anteriores.
Optimacin: lee un cdigo fuente, lo analiza y descubre errores potenciales sin
ejecutar el programa.
Compiladores incrementales: generan un cdigo objeto instruccin por instruccin
(en vez de hacerlo para todo el programa) cuando el usuario teclea cada orden
individual. El otro tipo de compiladores requiere que todos los enunciados o
instrucciones se compilen conjuntamente.
Ensamblador: el lenguaje fuente es lenguaje ensamblador y posee una estructura
sencilla.
Compilador cruzado: se genera cdigo en lenguaje objeto para una mquina
diferente de la que se est utilizando para compilar. Es perfectamente normal construir
un compilador de Pascal que genere cdigo para MS-DOS y que el compilador funcione
en Linux y se haya escrito en C++.
Compilador con montador: compilador que compila distintos mdulos de forma
independiente y despus es capaz de enlazarlos.
Autocompilador: compilador que est escrito en el mismo lenguaje que va a
compilar. Evidentemente, no se puede ejecutar la primera vez. Sirve para hacer
ampliaciones al lenguaje, mejorar el cdigo generado, etc.
Metacompilador: es sinnimo 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. El
desarrollo de los metacompiladores se encuentra con la dificultad de unir la generacin
de cdigo con la parte de anlisis. Lo que s se han desarrollado son generadores de
analizadores lxicos y sintcticos. Por ejemplo, los conocidos:
generador de analizadores lxicosLEX:
generador deYACC: analizadores sintcticos
desarrollados para UNIX. Los inconvenientes que tienen son que los analizadores que
generan no son muy eficientes.
Descompilador: es un programa que acepta como entrada cdigo mquina y lo
traduce a un lenguaje de alto nivel, realizando el proceso inverso a la compilacin.
3. Funciones de un compilador
Programa objeto
Figura 3.- Fases de un compilador.
Las tres primeras fases, que forman la mayor parte de la porcin de anlisis de un
compilador se analizan en la seccin IX. Otras dos actividades, la administracin de la tabla
se smbolos y el manejo de errores, se muestran en interaccin con las seis fases de anlisis
lxico, anlisis sintctico, anlisis semntico, generacin de cdigo intermedio, optimacin
de cdigo y generacin de cdigo. De modo informal, tambin se llamarn "fases" al
administrador de la tabla de smbolos y al manejador de errores.
Administrador de la tabla de smbolos
Una funcin esencial de un compilador es registrar los identificadores utilizados en el
programa fuente y reunir informacin sobre los distintos atributos de cada identificador.
Estos atributos pueden proporcionar informacin sobre la memoria asignada a un
identificador, su tipo, su mbito (la parte del programa donde tiene validez) y, en el caso de
nombres de procedimientos, cosas como el nmero y tipos de sus argumentos, el mtodo de
pasar cada argumento (por ejemplo, por referencia) y el tipo que devuelve, si los hay.
Una tabla de smbolos es una estructura de datos que contiene un registro por cada
identificador, con los campos para los atributos del identificador. La estructura de datos
permite encontrar rpidamente el registro de cada identificador y almacenar o consultar
rpidamente datos en un registro
Cuando el analizador lxico detecta un indentificador en el programa fuente, el
identificador se introduce en la tabla de smbolos. Sin embargo, normalmente los atributos
de un identificador no se pueden determinar durante el anlisis lxico. Por ejemplo, en una
declaracin en Pascal como var posicin, inicial, velocidad : real;
El tipo real no se conoce cuando el analizador lxico encuentra posicin, inicial y velocidad.
Las fases restantes introducen informacin sobre los identificadores en la tabla de smbolos
y despus la utilizan de varias formas. Por ejemplo, cuando se est haciendo el anlisis
semntico y la generacin de cdigo intermedio, se necesita saber cules son los tipos de los
identificadores, para poder comprobar si el programa fuente los usa de una forma vlida y
as poder generar las operaciones apropiadas con ellos. El generador de cdigo, por lo
A ciertos componentes lxicos se les agregar un "valor lxico". As, cuando se encuentra un
identificador como velocidad, el analizador lxico no slo genera un componente lxico, por
ejemplo, id, sino que tambin introduce el lexema velocidad en la tabla de smbolos, si an
no estaba all. El valor lxico asociado con esta aparicin de id seala la entrada de la tabla
de smbolos correspondiente a velocidad.
Usaremos id1 , id2 e id3 para posicin, inicial y velocidad, respectivamente, para enfatizar
que la representacin interna de un identificador es diferente de la secuencia de caracteres
que forman el identificador. Por tanto, la representacin de (1) despus del anlisis lxico
queda sugerida por:
id1 := id2 + id3 * 60 (2)
Se deberan construir componentes para el operador de varios caracteres := y el nmero 60,
para reflejar su representacin interna. En la seccin IX ya se introdujeron las fases
segunda y tercera: los anlisis sintctico y semntico. El anlisis sintctico impone una
estructura jerrquica a la cadena de componentes lxicos, que se representar por medio de
rboles sintcticos, como se muestra en la figura 5A). Una estructura de datos tpica para el
rbol se muestra en la figura 5B), en la que un nodo interior es un registro con un campo
para el operador y dos campos que contienen apuntadores a los registros de los hijos
izquierdo y derecho. Una hoja es un registro con dos o ms campos, uno para identificar el
componente lxico de la hoja, y los otros para registrar informacin sobre el componente
lxico. Se puede tener informacin adicional sobre las construcciones del lenguaje
aadiendo ms campos a les registros de los nodos.
:=
id1 +
id2 *
id360
(a)
:=
id 1
+
id 1
*
id 3
num60
(b)
registra en una estructura jerrquica llamada rbol. A menudo, se usa una clase especial de
rbol llamado rbol sintctico, donde cada nodo representa una operacin y los hijos de un
nodo son los argumentos de la operacin. Por ejemplo, en la figura 5 se muestra un rbol
sintctico para una proposicin de asignacin.
Es conveniente un buen manejo de errores, y que el compilador detecte todos los errores
que tiene el programa y no se pare en el primero que encuentre. Hay, pues, dos criterios a
seguir a la hora de manejar errores:
3.
Anlisis Semntico
El anlisis semntico es posterior al sintctico y mucho ms difcil de formalizar que ste.
Se trata de determinar el tipo de los resultados intermedios, comprobar que los argumentos
que tiene un operador pertenecen al conjunto de los operadores posibles, y si son
compatibles entre s, etc. En definitiva, comprobar que el significado de lo que se va
leyendo es vlido.
La salida "terica" de la fase de anlisis semntico sera un rbol semntico. Consiste en un
rbol sintctico en el que cada una de sus ramas ha adquirido el significado que debe tener.
En el caso de los operadores polimrficos (un nico smbolo con varios significados), el
anlisis semntico determina cul es el aplicable. Por ejemplo, consideremos la siguiente
sentencia de asignacin:
A := B + C
En Pascal, el signo "+" sirve para sumar enteros y reales, concatenar cadenas de caracteres
y unir conjuntos. El anlisis semntico debe comprobar que B y C sean de un tipo comn o
compatible y que se les pueda aplicar dicho operador. Si B y C son enteros o reales los
sumar, si son cadenas las concatenar y si son conjuntos calcular su unin.
Ejemplo
VAR
ch : CHAR; (* Un identificador no se puede utilizar si *)
ent: INTEGER; (* previamente no se ha definido. *)
...
ch := ent + 1; (* En Pascal no es vlido, en C s. *)
Figura 10.- rbol de anlisis sintctico para posicin := inicial + velocidad * 60.
10. Conclusiones
Este trabajo servir mucho en el momento de la creacin de un compilador, ya que en l se
detallan todas y cada una de las partes que involucran a este. Primeramente investigue que
existen distintos tipos de compiladores, me gustaria crear un compilador de optimacin, ya
que pienso que es muy til a la hora de crear un algoritmo o programa. La funcin de un
compiladores es leer un programa escrito es un lenguaje, en este caso el lenguaje fuente, y
lo traduce a un programa equivalente en otro lenguaje, el lenguaje objeto. Me parece
fascinante que nosotros podamos crear un compilador en seis meses (en un curso), cuando
en los aos 50, ya que en aquellos tiempos se tardaron hasta 18 aos trabajando en un
compilador.
Por otro lado, comprend que un compilador, requiere de una sintaxis y lenguajes
especficos, ya que, al igual que el lenguaje humano, si no lo escribimos correctamente el
compilador no har lo que deseamos. Y que en la compilacin hay dos partes: Anlisis y
Sntesis. La parte del anlisis divide al programa fuente en sus elementos componentes y
crea una representacin intermedia.
Aprend que las herramientas que muestran tipos de anlisis de programas fuente, son muy
tiles al momento de crear un programa al codificar un algoritmo, ya que estas
herramientas nos ayudan formateando el texto, corrigiendo errores, dando tips; para que
nosotros como programadores seamos ms eficientes al momento de crear alguna
aplicacin.
Tambin he notado como todas nuestras materias se va complementando y enlazando, por
ejemplo, en matemticas discretas vimos la representacin de rboles, los cuales usamos
aqu. Igualmente en estructura de datos I, vimos mtodos de ordenamiento que las
gramticas de los compiladores usan. Por lo tanto, no parece tan complicado crear un
compilador, slo se necesitan los conocimientos adecuados y dedicarle su tiempo para tener
xito.
11. Bibliografa
compiler). Los compiladores son programas o herramientas encargadas de compilar. Un compilador toma un
texto (cdigo fuente) escrito en un lenguaje de alto nivel y lo traduce a un lenguaje comprensible por las
computadoras (cdigo objeto).
Bsicamente, existen dos grandes formas de ejecutar programas: programas compilados (previamente pasados
por un compilador) y programas interpretados (necesitan pasar por un intrprete para ejecutarse en tiempo real).
Caractersticas de un compilador
Generalmente un compilador se divide en dos partes:
* Front End: parte que analiza el cdigo fuente, comprueba su validez, genera el rbol de derivacin y rellena los
valores de la tabla de smbolos. Parte que suele ser independiente de la plataforma o sistema operativo para el
que funcionar.
* Back End: parte en donde se genera el cdigo mquina exclusivo para una plataforma a partir de lo analizado
en el front end.
Por lo general el resultado del back end no puede ser ejecutado directamente, se necesita pasar por un proceso
de enlazado (linker).
Existen varios tipos de compiladores: Compiladores cruzados, Compiladores optimizadores, Compiladores de
una sola pasada, Compiladores de varias pasadas, Compiladores JIT (Just In Time).
Intrpretes vs compiladores
Cualquier lenguaje puede ser ejecutado tanto va intrprete o va compilador, pero algunos lenguajes suelen
asociarse ms a una va que a la otra, y por esto son llamados "lenguajes interpretados" o "lenguajes
compilados" respectivamente.
Tambin puede darse que un programa contenga partes que son implementadas va intrprete y otras va
compilador.
Tambin existen intrpretes que incluyen cierta "compilacin" en el medio. Son aquellos que compilan a un
cdigo intermedio llamado bytecode, que es ms eficiente de ejecutar que hacerlo directamente desde el cdigo
fuente.
En general, la principal desventaja de los intrpretes, es que cuando un programa es interpretado, suele
ejecutarse ms lento que si el mismo programa estuviese compilado. Esto se debe a que el intrprete debe
analizar cada sentencia en el programa en cada ejecucin (un anlisis en tiempo real). Tambin el acceso a
variables es ms lento en un intrprete, porque mapear los identificadores para almacenar las localizaciones
debe hacerse repetidas veces en tiempo real.
------------------
Bibliografia: