You are on page 1of 15

Universidad dominicana O&M

>Nombres: Addys Manuel Mota Rodrguez 12-SISN-2-028

Juan Ramn Snchez Ruiz 12-MISN-2-002

>Carrera: Ing. de Sistemas y Computacin

>Materia: Compiladores e intrpretes

>Profesor: Radhames Montero

Introduccin
Absolutamente todos los softwares existentes han pasado por un proceso ms o
menos parecido donde empiezan siendo simples sucesiones de lneas de
instrucciones escritas en un lenguaje familiar para los seres humanos. Pero como
ya sabemos, las mquinas no entienden estos lenguajes y necesitan recibir estas
instrucciones en un formato ms complejo para nosotros: lenguaje de mquina.
Los traductores son softwares que se encargan de intermediar la comunicacin
entre el programador y la mquina para hacer funcionar su programa. Los
compiladores forman parte de este tipo se software y son los ms conocidos y
utilizados en la actualidad. A continuacin, conoceremos todo acerca de estos
programas, su funcionamiento y un poco de historia.

Introduccin a la compilacin
compilar
(Del lat. compilre).
1. tr. Allegar o reunir, en un solo cuerpo de obra, partes,
extractos o materias de otros varios libros o documentos.
2. tr. Inform. Preparar un programa en el lenguaje mquina a
partir de otro programa de ordenador escrito en otro lenguaje.

Compilador
Un compilador es un traductor que trasforma textos fuentes de lenguaje de alto
nivel a lenguajes de bajo nivel. Un compilador tpicamente opera en fases, cada
una lleva a cabo una tarea sobre el programa fuente. 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 principales de un compilador


Para cada lenguaje de programacin se requiere un compilador separado.
El compilador traduce todo el programa antes de ejecutarlo.
Los programas compilados se ejecutan ms rpido que los interpretados, debido a
que han sido completamente traducidos a lenguaje mquina.
Informa al usuario de la presencia de errores en el programa fuente.
Poseen un editor integrado con un sistema de coloreado para los comandos,
funciones, variables y dems partes de un programa.

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).

Historia
En 1946 se desarroll la primera computadora digital. En un principio, estas
mquinas ejecutaban instrucciones consistentes en cdigos numricos que
sealaban a los circuitos de la mquina los estados correspondientes a cada
operacin, lo que se denomin lenguaje mquina. Pronto los primeros usuarios de
estos ordenadores descubrieron la ventaja de escribir sus programas mediante
claves ms fciles de recordar que esos cdigos; al final, todas esas claves juntas
se traducan manualmente a lenguaje mquina. Estas claves constituyen los
llamados lenguajes ensambladores.
Pese a todo, el lenguaje ensamblador segua siendo el de una mquina, pero ms
fcil de manejar. Los trabajos de investigacin se orientaron hacia la creacin de
un lenguaje que expresara las distintas acciones a realizar de una manera lo ms
sencilla posible para una persona. El primer compilador fue escrito por Grace
Hopper, en 1952 para el lenguaje de programacin A-0. En 1950 John Backus
dirigi una investigacin en IBM sobre 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 de alto nivel y se introdujo en 1957 para el uso de la
computadora IBM modelo 704. 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 de
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.
El primer compilador autocontenido, es decir, capaz de compilar su propio cdigo
fuente fue el creado para Lisp por Hart y Levin en el MIT en 1962. Desde 1970 se
ha convertido en una prctica comn escribir el compilador en el mismo lenguaje
que este compila, aunque Pascal y C han sido alternativas muy usadas.

Tipos de compiladores
Esta taxonoma de los tipos de compiladores no es excluyente, por lo que puede
haber compiladores que se adscriban a varias categoras:

Compiladores cruzados: generan cdigo para un sistema distinto del que estn
funcionando.
Compiladores optimizadores: realizan cambios en el cdigo para mejorar su
eficiencia, pero manteniendo la funcionalidad del programa original.
Compiladores de una sola pasada: generan el cdigo mquina a partir de una
nica lectura del cdigo fuente.
Compiladores de varias pasadas: necesitan leer el cdigo fuente varias veces
antes de poder producir el cdigo mquina.
Compiladores JIT (Just In Time): forman parte de un intrprete y compilan partes
del cdigo segn se necesitan.

Pauta de creacin de un compilador: En las primeras pocas de la informtica, el


software de los compiladores era considerado como uno de los ms complejos
existentes.
Los primeros compiladores se realizaron programndolos directamente en
lenguaje mquina o en ensamblador. Una vez que se dispone de un compilador,
se pueden escribir nuevas versiones del compilador (u otros compiladores
distintos) en el lenguaje que compila ese compilador.
Actualmente existen herramientas que facilitan la tarea de escribir compiladores o
intrpretes informticos. Estas herramientas permiten generar el esqueleto del
analizador sintctico a partir de una definicin formal del lenguaje de partida,
especificada normalmente mediante una gramtica formal y barata, dejando
nicamente al programador del compilador la tarea de programar las acciones
semnticas asociadas.

Fases de un compilador
El proceso de traduccin se compone internamente de varias etapas o fases, que
realizan distintas operaciones lgicas. Es til pensar en estas fases como en
piezas separadas dentro del traductor, y pueden en realidad escribirse como
operaciones codificadas separadamente, aunque en la prctica a menudo se
integren juntas.
1-Fase de anlisis:
1.2-Anlisis lxico
El anlisis lxico constituye la primera fase, aqu se lee el programa fuente de
izquierda a derecha y se agrupa en componentes lxicos (tokens), que son
secuencias de caracteres que tienen un significado. Adems, todos los espacios
en blanco, lneas en blanco, comentarios y dems informacin innecesaria se
elimina del programa fuente. Tambin se comprueba que los smbolos del lenguaje
(palabras clave, operadores, etc.) se han escrito correctamente.
Como la tarea que realiza el analizador lxico es un caso especial de coincidencia
de patrones, se necesitan los mtodos de especificacin y reconocimiento de
patrones, se usan principalmente los autmatas finitos que acepten expresiones
regulares. Sin embargo, un analizador lxico tambin es la parte del traductor que
maneja la entrada del cdigo fuente, y puesto que esta entrada a menudo
involucra un importante gasto de tiempo, el analizador lxico debe funcionar de
manera tan eficiente como sea posible.
1.2-Anlisis sintctico
En esta fase los caracteres o componentes lxicos se agrupan jerrquicamente en
frases gramaticales que el compilador utiliza para sintetizar la salida. Se
comprueba si lo obtenido de la fase anterior es sintcticamente correcto (obedece
a la gramtica del lenguaje). Por lo general, las frases gramaticales del programa
fuente se representan mediante un rbol de anlisis sintctico.
La estructura jerrquica de un programa normalmente se expresa utilizando reglas
recursivas. Por ejemplo, se pueden dar las siguientes reglas como parte de la
definicin de expresiones:
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)
Las reglas 1 y 2 son reglas bsicas (no recursivas), en tanto que la regla 3 define
expresiones en funcin de operadores aplicados a otras expresiones.
La divisin entre anlisis lxico y anlisis sintctico es algo arbitraria. Un factor
para determinar la divisin es si una construccin del lenguaje fuente es
inherentemente recursiva o no. Las construcciones lxicas no requieren recursin,
mientras que las construcciones sintcticas suelen requerirla. No se requiere
recursin para reconocer los identificadores, que suelen ser cadenas de letras y
dgitos que comienzan con una letra. Normalmente, se reconocen los
identificadores por el simple examen del flujo de entrada, esperando hasta
encontrar un carcter que no sea ni letra ni dgito, y agrupando despus todas las
letras y dgitos encontrados hasta ese punto en un componente lxico llamado
identificador. Por otra parte, esta clase de anlisis no es suficientemente poderoso
para analizar expresiones o proposiciones. Por ejemplo, no podemos emparejar
de manera apropiada los parntesis de las expresiones, o las palabras begin y end
en proposiciones sin imponer alguna clase de estructura jerrquica o de
anidamiento a la entrada.
1.3-Anlisis semntico
La fase de anlisis semntico revisa el programa fuente para tratar de encontrar
errores semnticos y rene la informacin sobre los tipos para la fase posterior de
generacin de cdigo. En ella se utiliza la estructura jerrquica determinada por la
fase de anlisis sintctico para identificar los operadores y operandos de
expresiones y proposiciones
Un componente importante del anlisis semntico es la verificacin de tipos. Aqu,
el compilador verifica si cada operador tiene operandos permitidos por la
especificacin del lenguaje fuente. Por ejemplo, las definiciones de muchos
lenguajes de programacin requieren que el compilador indique un error cada vez
que se use un nmero real como ndice de una matriz. Sin embargo, la
especificacin del lenguaje puede imponer restricciones a los operandos, por
ejemplo, cuando un operador aritmtico binario se aplica a un nmero entero y a
un nmero real.3 Revisa que los arreglos tengan definido el tamao correcto.
2-Fase de sntesis
Consiste en generar el cdigo objeto equivalente al programa fuente. Slo se
genera cdigo objeto cuando el programa fuente est libre de errores de anlisis,
lo cual no quiere decir que el programa se ejecute correctamente, ya que un
programa puede tener errores de concepto o expresiones mal calculadas. Por lo
general el cdigo objeto es cdigo de mquina relocalizable o cdigo
ensamblador. Las posiciones de memoria se seleccionan para cada una de las
variables usadas por el programa. Despus, cada una de las instrucciones
intermedias se traduce a una secuencia de instrucciones de mquina que ejecuta
la misma tarea. Un aspecto decisivo es la asignacin de variables a registros.
2.1-Generacin de cdigo intermedio
Despus de los anlisis sintctico y semntico, algunos compiladores generan una
representacin intermedia explcita del programa fuente. Se puede considerar esta
representacin intermedia como un programa para una mquina abstracta. Esta
representacin intermedia debe tener dos propiedades importantes; debe ser fcil
de producir y fcil de traducir al programa objeto.
La representacin intermedia puede tener diversas formas. Existe una forma
intermedia llamada cdigo de tres direcciones que es como el lenguaje
ensamblador de una mquina en la que cada posicin de memoria puede actuar
como un registro. El cdigo de tres direcciones consiste en una secuencia de
instrucciones, cada una de las cuales tiene como mximo tres operandos. Esta
representacin intermedia tiene varias propiedades:
Primera. - Cada instruccin de tres direcciones tiene a lo sumo un operador,
adems de la asignacin, por tanto, cuando se generan estas instrucciones,
el traductor tiene que decidir el orden en que deben efectuarse las
operaciones.
Segunda. - El traductor debe generar un nombre temporal para guardar los
valores calculados por cada instruccin.
Tercera. - Algunas instrucciones de tres direcciones tienen menos de tres
operandos, por ejemplo, la asignacin.

2.2-Optimizacin de cdigo
La fase de optimizacin de cdigo consiste en mejorar el cdigo intermedio, de
modo que resulte un cdigo mquina ms rpido de ejecutar. Esta fase de la etapa
de sntesis es posible sobre todo si el traductor es un compilador (difcilmente un
intrprete puede optimizar el cdigo objeto). Hay mucha variacin en la cantidad
de optimizacin de cdigo que ejecutan los distintos compiladores. En los que
hacen mucha optimizacin, llamados compiladores optimizadores, una parte
significativa del tiempo del compilador se ocupa en esta fase. Sin embargo, hay
optimizaciones sencillas que mejoran sensiblemente el tiempo de ejecucin del
programa objeto sin retardar demasiado la compilacin.

Programas de sistemas relacionados con un compilador


Intrprete: es un traductor que en vez de generar cdigo objeto ejecuta el
programa fuente inmediatamente. Cualquier lenguaje se puede interpretar o
compilar, pero a veces se prefiere un intrprete dependiendo de la situacin
especfica: Algunos lenguajes son usualmente interpretados: BASIC, LISP,
PHP. En situaciones de enseanza o de desarrollo de software.

Preprocesador: Un programa fuente puede estar dividido en mdulos


almacenados en ficheros diferentes. La tarea de recopilar el cdigo fuente
almacenado en estos ficheros puede ser encomendada a un preprocesador.
Asimismo, un preprocesador puede expandir las macros convirtindolas en
instrucciones ejecutables.

Ensamblador: Para poder obtener un programa ejecutable es preciso


ensamblar este programa final con un ensamblador convencional.

Enlazador: Esta herramienta toma cdigo mquina relocalizable de los


diferentes objetos compilados y de librera, modifica las direcciones
relocalizables para situarlas a los valores absolutos adecuados, y crea el
programa ejecutable.

Cargador: es un programa que se encarga de llevar un programa


ejecutable a cualquier parte de la memoria de modo que se pueda ejecutar.

Editor: es un programa que se puede usar para escribir cualquier archivo


de texto. Sin embargo, hay editores especializados para escribir programas
llamados editores basados en estructura.

Depurador: es un programa que se usa para determinar los errores de


ejecucin de un programa compilado.

Perfilador: es un programa que junta estadsticas acerca de la ejecucin


de un programa, como el nmero de veces que se llam a un procedimiento
o la cantidad de tiempo que ocupa cada uno de ellos.

Administrador de proyecto: es un programa que sirve para coordina el


trabajo de escritura de un gran proyecto de software en el que se involucra
a ms de un programador.
Agrupamiento de las fases de un compilador

Un compilador opera en fases, de las cuales transforma el programa fuente de una


representacin en otra. Dentro de las tres primeras fases, que forman la mayor
parte de anlisis de un compilador se analiza la administracin, el manejo de
errores y la fase de anlisis
Administracin de tabla de smbolos es la funcin esencial de un
compilador registrando 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. Es la estructura la tabla de smbolos de datos que contiene un
registro por cada identificador, con los campos para los atributos de un
identificador.

Las faces restantes introducen informacin sobre los identificadores en la


tabla de smbolos y despus la utilizan de varias formas.

Deteccin e informacin de errores en cada una de las frases se puede


encontrar errores, sin embargo, despus de detectar el error, se debe tratar
de alguna forma ese error, para poder continuar con la compilacin. Las
fases de anlisis sintctico y semntico por lo general manejan una gran
proporcin de los errores detectables por el compilador. La fase lxica
detecta los errores donde los caracteres restantes de la entrada no forman
ningn componente lxico del lenguaje. Los errores donde la cadena de
componentes lxicos violan las reglas de estructura del lenguaje son
determinados por la fase del anlisis sintctico. Durante el anlisis
semntico el compilador intenta detectar construcciones que tengan la
estructura sintctica correcta, pero que no tenga significado para la
operacin implicada.

La fase de anlisis conforme avanza la traduccin, la representacin


interna del programa fuente que tiene el compilador se modifica.
Herramientas para generar compiladores
Son programas de ayuda en el proceso de escritura de compiladores: sistemas
generadores de traductores. Tambin se les conoce como compiler writing tools,
compiler generators, compiler-compilers. A continuacin mencionaremos los ms
conocidos.
Herramientas tradicionales
Lex/Yacc
Pclex
Pcyacc
Bison
Flex
Ventajas
Generan analizadores eficientes, incluso ms que los que se pudiera hacer
de manera manual.
Los analizadores ascendentes reconocen la mayor parte de los lenguajes
Desventajas
Yacc usa herramientas externas para que le provean los tokens necesarios
Las acciones semnticas asociadas con las producciones de los no
terminales de las gramticas son difciles de depurar
Yacc no genera rboles de anlisis sintctico
Mezcla las especificaciones sintcticas con las semnticas
Incrementos en la dificultad del trabajo de depuracin de puesto que los
errores que cometen el fichero de especificacin con solo visibles en el
analizador generado.
Herramientas de nueva generacin
ANTLR
Se considera el lex/yacc del nuevo milenio.
Genera rboles sintcticos descendentes.
Escrito ntegramente en JAVA.
Genera cdigo en JAVA o C++.
Ventajas
Buena integracin de los analizadores lxicos y sintcticos
El cdigo generado por ANTLR es ms fcil de entender y depurar que el
YACC.
Las especificaciones gramaticales de ANTLR permiten la notacin BNF y
generan rboles de anlisis sintctico.
Desventajas
Genera analizadores menos eficientes que los generados por YACC.
Los ficheros de especificacin de ANTLR son muy complejas.
El proceso de depurado consta de las siguientes fases:
1. Escribir el cdigo de acciones.
2. Compilar el fichero de especificaciones
3. Compilar y ejecutar el programa generado
4. Localizar errores del programa
5. Corregir errores en el fichero de especificaciones
JAVACC
Inicialmente se llam JACK.
Similar al ANTLR.
Analizador ascendente.
Ventajas
Buena integracin y los analizadores lxicos y sintctico.
Genera analizadores sintcticos descendentes basados en la gramtica.
Incluye la herramienta JJTREE para generar rboles sintcticos.
Desventajas
Las mismas que ANTLR
Cuestionario

1. Cul es la funcin de los compiladores?

Un compilador se encarga de traducir el cdigo fuente de una aplicacin


que est en desarrollo, es decir convierte un programa hecho en lenguaje
de programacin de alto nivel a un lenguaje de mquina, el cual es
conocido como de bajo nivel, de tal forma que sea ms entendible y mucho
ms fcil de procesar en el equipo en el que se est ejecutando.

2. Cules son las partes o fases principales de un compilador?

generalmente un compilador se divide en dos partes principales:

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.

Back-End: parte en donde se genera el cdigo mquina exclusivo para


una plataforma a partir de lo analizado en el front end.

3. En qu se diferencian los compiladores de los intrpretes?


Los compiladores difieren de los intrpretes en varios aspectos:
Un programa que ha sido compilado puede correr por s solo, pues en el
proceso de compilacin se lo transformo en otro lenguaje (lenguaje
mquina).
Un intrprete traduce el programa cuando lo lee, convirtiendo el cdigo del
programa directamente en acciones.
La ventaja del intrprete es que dado cualquier programa se puede
interpretarlo en cualquier plataforma (sistema operativo), en cambio el
archivo generado por el compilador solo funciona en la plataforma en donde
se lo ha creado.
Pero por otro lado un archivo compilado puede ser distribuido fcilmente
conociendo la plataforma, mientras que un archivo interpretado no funciona
si no se tiene el intrprete.
Hablando de la velocidad de ejecucin un archivo compilado es de 10 a 20
veces ms rpido que un archivo interpretado.
4. Qu son el cdigo fuente y cdigo objeto?

Cdigo fuente: Texto escrito en un lenguaje de programacin especfico y


que puede ser ledo por un programador. Debe traducirse a lenguaje
mquina para que pueda ser ejecutado por la computadora.

Cdigo objeto: es el resultado de la compilacin del cdigo fuente. Puede


ser en lenguaje mquina o bytecode, y puede distribuirse en varios archivos
que corresponden a cada cdigo fuente compilado. Luego un enlazador
(linker) se encarga de juntar todos los archivos de cdigo fuente para
obtener el programa ejecutable.

5. Qu es el cdigo intermedio?

Despus de los anlisis sintctico y semntico, algunos compiladores


generan una representacin intermedia explcita del programa fuente. Se
puede considerar esta representacin intermedia como un programa para
una mquina abstracta. Esta representacin intermedia debe tener dos
propiedades importantes; debe ser fcil de producir y fcil de traducir al
programa objeto.

6. Que son los preprocesadores?

Estos son los que producen la entrada para un compilador.


Procesamiento de Macros, Inclusin de archivos, Preprocesadores
racionales (estructura de control) y Extensiones a lenguajes (bases de
datos).

7. Que son los ensambladores?

Son los que producen cdigo ensamblador que se pasa a un ensamblador


para su procesamiento (versin mnemotcnica del cdigo de mquina:
nombres de operaciones y nombres de direcciones de memoria)

8. De qu se encargan los cargadores y editores de enlace?

Modifica las direcciones relocalizables y ubica en memoria.


Forma un solo programa desde varios archivos relocalizables
9. Cmo es el agrupamiento de fases en la implementacin?

Un compilador opera en fases, de las cuales transforma el programa fuente


de una representacin en otra. Dentro de las tres primeras fases, que
forman la mayor parte de anlisis de un compilador se analiza la
administracin, el manejo de errores y la fase de anlisis

10. Qu es Lex Y Yacc?

Son herramientas que nos permiten desarrollar componentes o la mayor


parte de un compilador. Son un recurso invaluable para el profesional y el
investigador. Existen paquetes freeware

You might also like