Está en la página 1de 10

Compiladores

2013
Dayani Cabrera Victoriano Floribertha Marcial Dolores Reyna Crdenas Barrientos Ral Aarn Prez radilla Marco Antonio Cordero Dillanes Leonardo Herrera Romero

RESUMEN

El estudio de los compiladores es una parte esencial dentro de los planes y programas de estudio de las carreras afines a las ciencias computacionales. En Mxico podemos citar dos ejemplos, el caso de la carrera de Ingeniera en Computacin de la UNAM [1] y la carrera de Ingeniera en Computacin de las universidades del SUNEO [2] en el estado de Oaxaca. Ambas carreras cuentan en su retcula con la asignatura de compiladores teniendo un objetivo de aprendizaje y contenido temtico muy similar. En un escenario tpico de esta asignatura, al finalizar el curso, se pide a los alumnos desarrollar un pequeo compilador o intrprete que traduzca de un sencillo lenguaje de alto nivel basado en una sintaxis tipo C a cdigo en lengua-je ensamblador. Prcticamente siempre se trata del mismo proyecto: una calculadora para realizar operaciones aritmticas que tambin utilice estructuras secuenciales y de control. Este escenario presupone como antecedente reticular un curso de lengua-je ensamblador, aqu el problema estriba en que esto no siempre se cumple.

ABSTRACT

The study of compiler is an essential part in the plans and programs of study related to computer science careers. In Mexico we can cite two examples, the case of the Computer Engineering career UNAM [1 ] and Computer Engineering career in universities SUNEO [2 ] in the state of Oaxaca. Both races have in your grid with the subject of compilers having a learning objective and very similar thematic content. In a typical scenario of this course, the end of the course, students are asked to develop a small compiler or interpreter to translate a simple high-level language based on C syntax to type code in assembler language - je. Almost always it is the same project: a calculator to perform arithmetic operations also uses sequential control structures. This scenario assumes reticular history as a language course - je assembler, the problem here is that this is not always true.
PALABRAS CLAVE. ABP, L-Systems, Compiladores, Desarrollo Incremental. INTRODUCCIN

En un mundo informatizado como en el que vivimos, en el que cada da que pasa dependemos ms y ms de un sistema informtico eficiente, el cual debe estar preparado para brindarnos la ms alta calidad de servicios y prestaciones.

Adems de ser sencillo en su manejo y sobre todo confiable, siendo estas caractersticas indispensables para el usuario final.

Pgina 1

Compiladores
Quien no se fija, ni pregunta cmo se realiza determinada tarea, pero si es buen critico a la hora de ver resultados, pero hay otros que contrarios a estos, se hace la pregunta del milln, "Cmo se logra hacer tal y tal cosa? ,"Cmo es posible que un graficador trabaje tan rpido?, Cmo es posible que un procesador de palabra a la hora de usar un diccionario sea tan eficiente?, Cmo es posible llevar los resultados de una aplicacin a otra?, o Cmo es posible que un programa que fue creado por una empresa puede trabajar con los datos de obtenidos de otro programa, hecho por otra empresa?. Muchas pueden ser las respuestas, algunos argumentaran que es el sistema operativo, otros dirn que son las normas y estndares establecidos, otros dirn irnicamente que es ms sencillo de lo que se piensa, dirn que se hace clac con la rata aqu, se arrastra y se lleva a donde se quiere. Todos ellos tienen razn, sin embargo si indagamos ms a fondo. Surgirn preguntas ms directas como por ejemplo "Cmo se logra tal velocidad, con tan buen manejo de grfico?", claro que a todas ellas se puede responder diciendo, que todo se logra gracias al Hardware, y no estaramos totalmente errados, porque un buen Hardware conlleva a un buen resultado, a una buena calidad de impresin en caso de volcado al papel, una buena imagen si hablamos de grficos, o un buen tiempo de respuesta a la hora de realizar algn clculo matemtico, pero siempre el Hardware ser una parte, solo una parte.

2013

ANTECEDENTES HISTRICOS

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

Pgina 2

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

2013

Como parte importante de este proceso de traduccin, el compilador informa a su usuario de la presencia de errores en el programa fuente.2

QU ES UN COMPILADOR?

Un compilador es un programa informtico que traduce un programa escrito en un lenguaje de programacin a otro lenguaje de programacin, generando un programa equivalente que la mquina ser capaz de interpretar. Usualmente el segundo lenguaje es lenguaje de mquina, pero tambin puede ser un cdigo intermedio (bytecode), o simplemente texto. Este proceso de traduccin se conoce como compilacin.1 Un compilador es un programa que permite traducir el cdigo fuente de un programa en lenguaje de alto nivel, a otro lenguaje de nivel inferior (tpicamente lenguaje de mquina). De esta manera un programador puede disear un programa en un lenguaje mucho ms cercano a cmo piensa un ser humano, para luego compilarlo a un programa ms manejable por una computadora.

Diagrama de bloques de la operacin de un buen compilador.

ESTRUCTURA

DE

UN

COMPILADOR

La estructura de un compilador, est dividida en cuatro grandes mdulos, cada uno independiente del otro.

Pgina 3

Compiladores
El primero de ellos es el preprocesador, es el encargado de transformar el cdigo fuente de entrada original en el cdigo fuente puro. Es decir en expandir las macros, incluir las libreras, realizar un preprocesado racional (capacidad de enriquecer a un lenguaje antiguo con recursos ms modernos), extender el lenguaje y todo aquello que en el cdigo de entrada sea representativo de una abreviatura para facilitar la escritura del mismo.

2013

no enlazado. En su interior realiza como su antecesor un anlisis lxico grfico, un anlisis sintctico, un anlisis semntico, crea una tabla de smbolos, genera un cdigo intermedio lo optimiza y produce un cdigo de salida llamado cdigo binario no enlazado, y a todo este conjunto de tares se los denomina proceso de compilacin.

El segundo mdulo es el de compilacin que recibe el cdigo fuente puro, este es el modulo principal de un compilador, pues si ocurriera algn error en esta etapa el compilador no podra avanzar. En esta etapa se somete al cdigo fuente puro de entrada a un anlisis lxico grfico, a un anlisis sintctico, a un anlisis semntico, que construyen la tabla de smbolos, se genera un cdigo intermedio al cual se optimiza para as poder producir un cdigo de salida generalmente en algn lenguaje ensamblador.

El cuarto y ltimo modulo es el encargado de realizar el enlazado del cdigo de fuente de entrada (cdigo maquina relocalizable) con las libreras que necesita, como as tambin de proveer al cdigo de las rutinas necesarias para poder ejecutarse y cargarse a la hora de llamarlo para su ejecucin, modifica las direcciones relocalizables y ubica los datos en las posiciones apropiadas de la memoria. Este ltimo modulo es el que produce como salida el cdigo binario enlazado.

ESTRUCTURA COMPILACIN

DEL

PROCESO

DE

El tercer mdulo es el llamado mdulo de ensamblado, este mdulo no es ni ms ni menos que otro compilador pues recibe un cdigo fuente de entrada escrito en ensamblador, y produce otro cdigo de salida, llamado cdigo binario

Analizando en detalle el proceso de compilacin, se divide en dos grandes fases, una de Anlisis y la otra de Sntesis.

Pgina 4

Compiladores
FASE DE ANLISIS: FASE DE SNTESIS

2013

Anlisis lexicogrfico o lxico, el compilador revisa y controla que las "palabras" estn bien escritas y pertenezcan a algn tipo de token (cadena) definido dentro del lenguaje, como por ejemplo que sea algn tipo de palabra reservada, o si es el nombre de una variable que este escrita de acuerdo a las pautas de definicin del lenguaje. En esta etapa se crea la tabla de smbolos, la cual contiene las variables y el tipo de dato al que pertenece, las constantes literales, el nombre de funciones y los argumentos que reciben etc. Anlisis sintctico como su nombre lo indica se encarga de revisar que los tokens estn ubicados y agrupados de acuerdo a la definicin del lenguaje. Dicho de otra manera, que los tokens pertenezcan a frases gramaticales validas, que el compilador utiliza para sintetizar la salida. Por lo general las frases gramaticales son representadas por estructuras jerrquicas, por medio de rboles de anlisis sintctico. En esta etapa se completa la tabla de smbolos con la dimensin de los identificadores y los atributos necesarios etc. Anlisis semntico se encarga de revisar que cada agrupacin o conjunto de token tenga sentido, y no sea un absurdo. En esta etapa se rene la informacin sobre los tipos para la fase posterior, en esta etapa se utiliza la estructura jerrquica de la etapa anterior y as poder determinar los operadores, y operandos de expresiones y preposiciones.

Generacin de cdigo intermedio, en esta etapa se lleva el cdigo del programa fuente a un cdigo interno para poder trabajar ms fcilmente sobre l. Esta representacin interna debe tener dos propiedades, primero debe ser fcil de representar y segundo debe ser fcil de traducir al cdigo objeto. Optimizacin de cdigo, se busca obtener el cdigo ms corto y rpido posible, utilizando distintos algoritmos de optimizacin. Etapa de generacin de cdigo, se lleva el cdigo intermedio final a cdigo maquina o cdigo objeto, que por lo general consiste en un cdigo maquina relocalizable o cdigo ensamblador. Se selecciona las posiciones de memoria para los datos (variables) y se traduce cada una de las instrucciones intermedias a una secuencia de instrucciones de maquina puro. La tabla de smbolos no es una etapa del proceso de compilacin, sino que una tarea, una funcin que debe realizar el proceso de compilacin. En ella se almacenan los identificadores que aparecen en el cdigo fuente puro, como as tambin los atributos de los mismos, su tipo, su mbito y en el caso de los procedimientos el nmero de argumentos el tipo del mismo etc. En otras palabras una tabla de smbolos es una estructura de datos, que contiene un registro por cada identificador, y sus atributos. La tabla de smbolo es accedida tanto para escritura como parar lectura por todas las etapas

Pgina 5

Compiladores
Detector de errores o manejador de errores, al igual que la tabla de smbolos no es una etapa del proceso de compilacin, sino que es una funcin, muy importante, pues al ocurrir un error esta funcin debe tratar de alguna forma el error para as seguir con el proceso de compilacin (la mayora de errores son detectados en las etapas de anlisis lxico, anlisis sintctico, anlisis semntico). Anlisis Sintctico

2013

El analizador sintctico impone una estructura jerrquica a la cadena de componentes lxicos, generada por el analizador lxico, que es representada en forma de un rbol sintctico. Convierte el texto de entrada en otras
estructuras (comnmente rboles), que son ms tiles para el posterior anlisis y capturan la jerarqua implcita de la entrada. Tambin es un estado inicial del

anlisis de frases de lenguaje natural. Es usado para generar diagramas de lenguajes que usan flexin gramatical.

Anlisis Semntico El analizador semntico verificara en este caso que cada operador tenga los operandos permitidos. Anlisis Lxico El analizador lxico lee los caracteres del programa fuente, y verifica que correspondan a una secuencia lgica (identificador, palabra reservada etc.). Esta secuencia de caracteres recibe el nombre componente lxico o lexema. En este caso el analizador lxico verifica si el identificador id1 (nombre interno para "suma") encontrado se halla en la tabla de smbolos, si no est produce un error porque todava no fue declarado, si la preposicin hubiese sido la declaracin del identificador "suma" en lenguajes C, C++ (int suma;) el analizador lxico agregara un identificador en la tabla de smbolos, y as sucesivamente con todos los componentes lxicos que aparezcan. id1= id2+ id3 * 10 Se compone de un conjunto de rutinas independientes, llamadas por los analizadores morfolgico y sintctico. Utiliza como entrada el rbol sintctico detectado por el anlisis sintctico para comprobar restricciones de tipo y otras limitaciones semnticas y preparar la generacin de cdigo. En compiladores de un solo paso, las llamadas a las rutinas semnticas se realizan directamente desde el analizador sintctico y son dichas rutinas las que llaman al generador de cdigo. El instrumento ms utilizado para conseguirlo es la gramtica de atributos. En compiladores de dos o ms pasos, el anlisis semntico se realiza independientemente de la generacin de cdigo, pasndose informacin a travs de un archivo intermedio, que

Pgina 6

Compiladores
normalmente contiene informacin sobre el rbol sintctico en forma linealizada (para facilitar su manejo y hacer posible su almacenamiento en memoria auxiliar).

2013
Sistemas empotrados, donde los recursos son extremadamente limitados. Compilacin para mltiples mquinas.

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 ejecutable para una plataforma diferente a aquella en la que se ejecuta. Esta herramienta es til cuando quiere compilarse cdigo para una plataforma a la que no se tiene acceso cuando es incomodo o imposible compilar en dicha plataforma (como en el caso de los sistemas empotrados). Por ejemplo, supongamos que queremos desarrollar aplicaciones para un telfono mvil, una PDA o una consola de videojuegos. Normalmente ser ms cmodo realizar el desarrollo en un PC y luego volcar el cdigo objeto en el dispositivo de destino. En estas situaciones, el compilador que usaremos en el PC es un caso de compilador cruzado. Un ejemplo de un compilador con estas posibilidades es el NASM, que puede ensamblar, entre otros formatos, ELF (para sistemas UNIX) y COM (para DOS).
USO DE LOS COMPILADORES CRUZADOS

Es una herramienta que se debe utilizar para una plataforma en la que es inconveniente o imposible compilar, como los microcontroladores que se ejecutan con una cantidad mnima de memoria para sus propios fines. 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. Leen una lnea y la traducen directamente para producir una instruccin de lenguaje maquina o la ejecuta si se trata de una pseudoinstruccin. Se construye la tabla de smbolos a medida que aparecen las definiciones de variables, etiquetas, etc. Compiladores de dos pasadas: Realiza la traduccin en dos etapas: En la 1 fase leen el programa fuente y construyen la tabla de smbolos, en la 2 fase vuelve a leer el programa fuente y pueden ir traduciendo totalmente pues reconocen la totalidad de los smbolos. Compiladores de varias pasadas: Necesitan pasos intermedios como leer el cdigo fuente varias veces antes de poder producir el cdigo mquina en otro lenguaje y una pasada final para producir y optimizar el cdigo producido durante pasos anteriores..

Los compiladores cruzados son muy utilizados en las siguientes situaciones:

Pgina 7

Compiladores
Compiladores JIT (Just In Time): forman parte de un intrprete y compilan partes del cdigo segn se necesitan. Auto compilador: Compilador que est escrito en el mismo lenguaje que va a compilar. Sirve para hacer amplificaciones al lenguaje, mejorar el cdigo generado, etc. Metacompilador: Es un compilador de compiladores, 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 un compilador para ese lenguaje. En general, la construccin del parser, mientras que el semntico del lenguaje se deja pasar en manos del usuario, para que lo ensamble una vez obtenido el parser. Descompilador: Es un programa de ordenador que realiza la operacin inversa a un compilador. Estos es, traducir cdigo o informacin de bajo nivel de abstraccin (slo diseado para ser ledo por un ordenador, ej. El cdigo mquina) a un lenguaje o medio de mayor nivel de abstraccin (usualmente diseado para ser ledo por un humano, ej. Cualquier lenguaje de programacin de alto nivel).
VENTAJAS Y DESVENTAJAS COMPILADORES

2013
DE LOS

Ventajas 1.- "C": Fcil de aprender, compacto, gran productividad, permite incorporar ASM dentro del cdigo, gran cantidad de libreras, fcil manejo de operaciones matemticas, disminucin del nmero de errores, ms fcil memorizar, lenguaje ms cercano al humano, independencia de las distintas familias de micros. 2.- "ASM": Cdigo eficiente y rpido. 3.- "BASIC": Tiene algunas de las caractersticas del "C" por ser un lenguaje de mediano nivel.

Desventajas 1.- Cdigo poco optimizado, programas ms lentos, poco o ningn control sobre el cdigo generado, mas difcil de depurar. 2.- Curva de aprendizaje alta, fcil equivocacin, hay que escribir mucho cdigo, necesidad de utilizar macros que complican el programa, no se puede embeber otro lenguaje, si no se conoce se pueden crear programas ms largos, lenguaje ms alejado del humano, lenguaje especfico de las distintas familias de los micros. 3.- Es un lenguaje no estructurado que puede crear malos hbitos de programacin, no tienen tantas librerias como otros lenguajes, es menos eficiente que el "C" y el "ASM".

Pgina 8

Compiladores
CONCLUSIONES APENDICE

2013

En definitiva, compilacin e interpretacin son las opciones tpicas para los lenguajes de programacin ms tradicionales, presentando para cada una de ellas sus ventajas y desventajas. Los compiladores para lenguajes de alto nivel tienen muchas fases, en las que progresivamente se va transformando un texto de un lenguaje a otro Muchas aplicaciones necesitan lenguajes especiales y, por tanto, compiladores. Estos compiladores sencillos se pueden construir con herramientas para anlisis lxico y sintctico: Con estas herramientas se pueden construir analizadores o parsers en C o Ada, y luego integrarlos con la aplicacin. Una gran ventaja de los programas que se compilan es que son unidades autnomas listas para ser ejecutadas. Debido a que ya se encuentran compiladas en archivos binarios de lenguaje mquina, no es necesaria una segunda aplicacin o paquete que el usuario deba mantener actualizado. Si un programa se compila para Windows en una arquitectura x86, el usuario final solamente necesita un sistema operativo Windows ejecutndose en una arquitectura x86. Adicionalmente, un paquete precompilado puede ejecutarse ms rpido que un cdigo fuente compilador intrprete en tiempo real.

Token: es un par que consiste en un nombre de token y un valor de atributo opcional. El nombre del token es un smbolo abstracto que representa un tipo de unidad lxica; por ejemplo, una palabra clave especfica o una secuencia de caracteres de entrada que denotan un identificador. Los nombres de los tokens son los smbolos de entrada que procesa el analizador sintctico. Lexema: es una secuencia de caracteres en el programa fuente, que coinciden con el patrn para un token y que el analizador lxico identifica como una instancia de ese token. Lex o aflex: permiten analizadores lxicos. Yacc o ayacc: permiten analizadores sintcticos. generar

generar

Parser: Es un analizador sintctico.

Pgina 9

Compiladores
REFERENCIAS

2013

Aprendizaje Basado en Proyectos Utilizando L-Systems en un Curso de Compiladores J. Jess Arellano-Pimentel1, Omar Nieva-Garca1, Ignacio AlgredoBadillo1 1Ingeniera en Computacin, Universidad del Istmo, Sto. Domingo Tehuantepec, Oaxaca {jjap@sandunga, omarng@bianni, algredobadillo@sandunga}.unistmo.edu. mx. Aho, A.V., Sethi, R., Ullman, J.D. (1990), Compiladores: principios, tcnicas y herramientas, capitulo 1, pginas: 1- 25, 743-747. Louden, K.C. (1997), Construccin de Compiladores: Principios y prctica, capitulo 1, pginas: 1- 27. Anlisis y Diseo de Compiladores Emiliano Llano Diaz - 1era Edicin Junio 2002 - Col Roma Mxico, D.F. Compiladores Cruzados. Se encuentra disponible en: http://www.slideshare.net/Rolandovonch ong/compiladores-8733490

Pgina 10

También podría gustarte