Indice d compiladores

21
Indice 1. Introducción 2. Clasificación 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 código objeto un compilador estándar, teórica y gráficamente generación de código 7. Árboles sintácticos para representar como sintetiza el código objeto un compilador 8. Herramientas que muestran tipos de análisis de programas fuente 9. Diagrama de análisis de un programa fuente, definiendo cada una de sus partes 10. Conclusiones 11. Bibliografía 1. Introducción En 1946 se desarrolló el primer ordenador digital. En un principio, estas máquinas ejecutaban instrucciones consistentes en códigos numéricos que señalan a los circuitos de la máquina los estados correspondientes a cada operación. Esta expresión mediante códigos numéricos se llamó Lenguaje Máquina, interpretado por un secuenciador cableado o por un microprograma. Pero los códigos numéricos de las máquinas son engorrosos. Pronto los primeros usuarios de estos ordenadores descubrieron la ventaja de escribir sus programas mediante claves más fáciles de recordar que esos códigos numéricos; al final, todas esas claves juntas se traducían manualmente a Lenguaje Máquina. Estas claves constituyen los llamados lenguajes ensambladores, que se generalizaron en cuanto se dio el paso decisivo de hacer que las propias máquinas realizaran el proceso mecánico de la traducción . A este trabajo se le llama ensamblar el programa . Dada su correspondencia estrecha con las operaciones elementales de las máquinas, las instrucciones de los lenguajes ensambladores obligan a programar cualquier función de una manera minuciosa e iterativa. De hecho, normalmente, cuanto menor es el nivel de expresión de un lenguaje de programación , mayor rendimiento se obtiene en el uso de los recursos físicos (hardware ). A pesar de todo, el lenguaje ensamblador seguía siendo el de una máquina, pero más fácil de manejar. Los trabajos de investigación se orientaron entonces hacia la creación de un lenguaje que expresara las distintas acciones a realizar de una manera lo más sencilla posible para el hombre . Así, en 1950, John Backus dirigió una investigación en I.B.M. en un lenguaje algebraico. En 1954 se empezó a desarrollar un lenguaje que permitía escribir fórmulas matemáticas 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

description

material compiladores

Transcript of Indice d compiladores

Indice1. Introduccin2. Clasificacin de Compiladores3. Funciones de un compilador4. Partes en las que trabaja un compilador5. Forma de examinar de un compilador. Como se sinteti!a el cdi"o objeto un compilador est#ndar$ terica % "r#ficamente "eneracin de cdi"o&. 'rboles sint#cticos para representar como sinteti!a el cdi"o objeto un compilador(. )erramientas que muestran tipos de an#lisis de pro"ramas fuente*. +ia"rama de an#lisis de un pro"rama fuente$ definiendo cada una de sus partes1,. Conclusiones11. -iblio"raf.a1. IntroduccinEn 1946 se desarroll el primer ordenador digital. En un principio, estas mquinas ejecutaban instrucciones consistentes en cdigos numricos que sealan a los circuitos de lamquina los estados correspondientes a cada operacin. Esta expresin mediante cdigos numricos se llam enguaje !quina, interpretado por un secuenciador cableado o por unmicroprograma. "ero los cdigos numricos de las mquinas son engorrosos. "ronto los primeros usuarios de estos ordenadores descubrieron la #entaja de escribir sus programas mediante cla#es ms $ciles de recordar que esos cdigos numricos% al $inal, todas esas cla#es juntas se traduc&an manualmente a enguaje !quina. Estas cla#es constitu'en los llamados lenguajes ensambladores, que se generali(aron en cuanto se dio el paso decisi#o de )acer que las propias mquinas reali(aran el proceso mecnico de la traduccin. * este trabajo se le llama ensamblar el programa.+ada su correspondencia estrec)a con las operaciones elementales de las mquinas, las instrucciones de los lenguajes ensambladores obligan a programar cualquier $uncin de unamanera minuciosa e iterati#a. +e )ec)o, normalmente, cuanto menor es el ni#el de expresin de un lenguaje de programacin, ma'or rendimiento se obtiene en el uso de los recursos $&sicos ,)ard-are.. * pesar de todo, el lenguaje ensamblador segu&a siendo el de una mquina, pero ms $cil de manejar. os trabajos de in#estigacin se orientaron entonces )acia la creacin de un lenguaje que expresara las distintas acciones a reali(ar de una manera lo ms sencilla posible para el )ombre. *s&, en 19/0, 1o)n 2ac3us dirigi una in#estigacin en 4.2.!. en un lenguaje algebraico. En 19/4 se empe( a desarrollar un lenguaje que permit&a escribir $rmulas matemticas de manera traducible por un ordenador. e llamaron 56787*9 ,567mulae 87*9slator.. 5ue el primer lenguaje considerado de alto ni#el. :e introdujo en 19/; para el uso de la computadora 42! modelo ;04. "ermit&a una programacin ms cmoda ' bre#e que lo existente )asta ese momento, lo que supon&a un considerable a)orro de trabajo. :urgi as& por primera #e( el concepto de un traductor, como un programa que traduc&a un lenguaje a otro lenguaje. En el caso particular de que el lenguaje a traducir es un lenguaje de alto ni#el ' el lenguaje traducido de bajo ni#el, se emplea el trmino compilador.a tarea de reali(ar un compilador no $ue $cil. El primer compilador de 56787*9 tard 1< aos=persona en reali(arse ' era mu' sencillo. Este desarrollo del 56787*9 estaba mu' in$luenciado por la mquina objeto en la que iba a ser implementado. >omo un ejemplo de ello tenemos el )ec)o de que los espacios en blanco $uesen ignorados, debido a que el peri$rico que se utili(aba como entrada de programas ,una lectora de tarjetas per$oradas. no contaba correctamente los espacios en blanco. "aralelamente al desarrollo de 56787*9en *mrica, en Europa surgi una corriente ms uni#ersitaria, que pretend&a que la de$inicin de un lenguaje $uese independiente de la mquina ' en donde los algoritmos se pudieran expresar de $orma ms simple.Esta corriente estu#o mu' in$luida por los trabajos sobre gramticas de contexto libre publicados por >)oms3' dentro de su estudio de lenguajes naturales.>on estas ideas surgi un grupo europeo encabe(ado por el pro$esor 5..2auer ,de la ?ni#ersidad de !unic).. Este grupo de$ini un lenguaje de usos m@ltiples independiente de una reali(acin concretasobre una mquina. "idieron colaboracin a la asociacin americana *.>.!. ,*ssociation $or >omputing !ac)iner'. ' se $orm un comit en el que particip 1. 2ac3us que colaboraba en esta in#estigacin. +e esa unin surgi un in$orme de$iniendo un 4nternational *lgebraic anguage ,4.*..., publicado en Auric) en 19/6, el pro'ecto se )a quedado simplemente en un ejercicio terico. +e todas $ormas, ladi#isin de un compilador en $ront end ' bac3 end $ue un adelanto importante.Ea en estos aos se #an poniendo las bases para la di#isin de tareas en un compilador. *s&, en 19/9 7abin ' :cott proponen el empleo de autmatas deterministas ' no deterministas para el reconocimiento lexicogr$ico de los lenguajes. 7pidamente se aprecia que la construccin de anali(adores lxicos a partir de expresiones regulares es mu' @til en la implementacin de los compiladores. En 196)oms3' 'a citados, se produce una sistemati(acin de la sintaxis de los lenguajes de programacin, ' con ello un desarrollo de di#ersos mtodos de anlisis sintctico.>on la aparicin de la notacin 295 = desarrollada en primer lugar por 2ac3us en 1960 cuando trabajaba en un borrador del *B6 60, modi$icada en 196G por 9aur ' $ormali(ada por Hnut) en 1964 = se tiene una gu&a para el desarrollo del anlisis sintctico. os di#ersos mtodos de parsers ascendentes ' descendentes se desarrollan durante la dcada de los 60. En 19/9, :)eridan describe un mtodo de parsing de 56787*9 que introduc&a parntesis adicionales alrededor de los operandos para ser capa( de anali(ar las expresiones. !s adelante, 5lo'd introduce la tcnica de la precedencia de operador ' el usode las $unciones de precedencia. * mitad de la dcada de los 60, Hnut) de$ine las gramticas 7 ' describe la construccin de una tabla cannica de parser 7. "or otra parte, el uso por primera #e( de un parsing descendente recursi#o tu#o lugar en el ao 1961.En el ao 196< se estudian ' de$inen las gramticasas& como los parsers predicti#os. 8ambin se estudia la eliminacin de la recursin a la i(quierda de producciones que contienen acciones semnticas sin a$ectar a los #alores de los atributos.En los primeros aos de la dcada de los ;0, se describen los mtodos :7 ' *7 de parser 7. +ebido a su sencille( ' a su capacidad de anlisis para una gran #ariedad de lenguajes, la tcnica de parsing 7 #a a ser la elegida para los generadores automticos de parsers. * mediados de los ;0, 1o)nson crea el generador de anali(adores sintcticos E*>> para $uncionar bajo un entorno ?94F . 1unto al anlisis sintctico, tambin se $ue desarrollando el anlisis semntico.En los primeros lenguajes ,56787*9 ' *B6 60. los tipos posibles de los datos eran mu' simples, ' la comprobacin de tipos era mu' sencilla. 9o se permit&a la coercin de tipos, pues sta era una cuestin di$&cil ' era ms $cil no permitirlo. >on la aparicin del *B6 6< se permit&a que las expresiones de tipo $ueran construidas sistemticamente. !s tarde, de a)& surgi la equi#alencia de tipos por nombre ' estructural. El manejo de la memoria como una implementacin tipo pila se us por primera #e( en 19/< en el primer pro'ecto de 4:". a inclusin en el *B6 60 de procedimientos recursi#os potenci el uso de la pila como una $orma cmoda de manejo de la memoria . +ij3stra introdujo posteriormente el uso del displa' para acceso a #ariables no locales en un lenguaje de bloques.8ambin se desarrollaron estrategias para mejorar las rutinas de entrada ' de salida de un procedimiento . *s& mismo, ' 'a desde los aos 60, se estudi el paso de parmetros a un procedimiento por nombre, #alor ' #ariable. >on la aparicin de lenguajes que permiten la locali(acin dinmica de datos , se desarrolla otra $orma de manejo de la memoria , conocida por el nombre de )eap ,mont&culo.. :e )an desarrollado #arias tcnicas para el manejo del )eap ' los problemas que con l se presentan, como son las re$erencias perdidas' la recogida de basura .a tcnica de la optimi(acin apareci desde el desarrollo del primer compilador de 56787*9. 2ac3us comenta cmo durante el desarrollo del 56787*9 se ten&a el miedo de que el programa resultante de la compilacin $uera ms lento que si se )ubiera escrito a mano. "ara e#itar esto, se introdujeron algunas optimi(aciones en el clculo de los &ndices dentro de un bucle. "ronto se sistemati(an ' se recoge la di#isin de optimi(aciones independientes de la mquina ' dependientes de la mquina. Entre las primeras estn la propagacin de #alores , el arreglo de expresiones, la eliminacin de redundancias, etc.Entre las segundas se podr&a encontrar lalocali(acin de registros, el uso de instrucciones propias de la mquina ' el reordenamiento de cdigo. * partir de 19;0 comien(a el estudio sistemtico de las tcnicas del anlisis de $lujo de datos. :u repercusin )a sido enorme en las tcnicas de optimi(acin global de un programa. En la actualidad, el proceso de la compilacin 'a est mu' asentado. ?n compilador es una )erramienta bien conocida, di#idida en di#ersas $ases. *lgunas de estas $ases se pueden generar automticamente ,anali(ador lxico ' sintctico. ' otras requieren una ma'or atencin por parte del escritor de compiladores ,las partes de traduccin ' generacin de cdigo..+e todas $ormas, ' en contra de lo que qui( pueda pensarse, toda#&a se estn lle#ando a cabo #arias #&as de in#estigacin en este $ascinante campo de la compilacin. "or una parte,se estn mejorando las di#ersas )erramientas disponibles ,por ejemplo, el generador de anali(adores lxicos *ard#ar3 para el lenguaje "*:>*.. 8ambin la aparicin de nue#as generaciones de lenguajes ='a se )abla de la quinta generacin, como de un lenguaje cercano al de los )umanos=)a pro#ocado la re#isin ' optimi(acin de cada una de las $ases del compilador. El @ltimo lenguaje de programacin de amplia aceptacin que se )a diseado, el lenguaje 1a#a, establece que el compilador no genera cdigo para una mquina determinada sino para una #irtual, la 1a#a Iirtual !ac)ine ,1I!., que posteriormente serejecutado por un intrprete, normalmente incluido en un na#egador de 4nternet. El gran objeti#o de esta exigencia es conseguir la mxima portabilidad de los programas escritos ' compilados en 1a#a, pues es @nicamente la segunda $ase del proceso la que depende de la mquina concreta en la que se ejecuta el intrprete.JKu es un compiladorL?n traductor es cualquier programa que toma como entrada un texto escrito en un lenguaje, llamado $uente ' da como salida otro texto en un lenguaje, denominado objeto.>ompiladorEn el caso de que el lenguaje $uente sea un lenguaje de programacin de alto ni#el ' el objeto sea un lenguaje de bajo ni#el ,ensamblador o cdigo de mquina., a dic)o traductor se le denomina compilador. ?n ensamblador es un compilador cu'o lenguaje $uente es el lenguaje ensamblador. ?n intrprete no genera un programa equi#alente, sino que toma una sentencia del programa $uente en un lenguaje de alto ni#el ' la traduce al cdigo equi#alente ' al mismo tiempo lo ejecuta. Mistricamente, con la escase( de memoria de los primeros ordenadores, se puso de moda el uso de intrpretes $rente a los compiladores, pues el programa $uente sin traducir ' el intrprete juntos daban una ocupacin de memoria menor que la resultante de los compiladores. "or ello los primeros ordenadores personales iban siempre acompaados de un intrprete de 2*:4> ,:pectrum, >ommodore I4>=N0, "> F8 de 42!, etc... a mejor in$ormacin sobre los errores por parte del compilador as& como una ma'or #elocidad de ejecucin del cdigo resultante )i(o que poco a poco se impusieran los compiladores. Mo' en d&a, ' con el problema de la memoria prcticamente resuelto, se puede )ablar de un gran predominio de los compiladores $rente a los intrpretes, aunque intrpretes como los incluidos en los na#egadores de 4nternet parainterpretar el cdigo 1I! de 1a#a son la gran excepcin.Ientajas de compilar $rente a interpretarC :e compila una #e(, se ejecuta n #eces. En bucles, la compilacin genera cdigo equi#alente al bucle, pero interpretndolo se traduce tantas #eces una l&nea como #eces se repite el bucle. El compilador tiene una #isin global del programa, por lo que la in$ormacin de mensajes de error es mas detallada. Ientajas del intrprete $rente al compiladorC ?n intrprete necesita menos memoria que un compilador. En principio eran ms abundantes dado que los ordenadores ten&an poca memoria. "ermiten una ma'or interacti#idad con el cdigo en tiempo de desarrollo.?n compilador no es un programa que $unciona de manera aislada, sino que necesita de otros programas para conseguir su objeti#oC obtener un programa ejecutable a partir de un programa $uente en un lenguaje de alto ni#el. *lgunos de esos programas son el preprocesador, el lin3er, el depurador ' el ensamblador. El preprocesador se ocupa ,dependiendo del lenguaje. de incluir $ic)eros, expandir macros, eliminar comentarios, ' otras tareas similares. El lin3er se encarga de construir el $ic)ero ejecutable aadiendo al $ic)ero objeto generado por el compilador las cabeceras necesarias ' las $unciones de librer&a utili(adas por el programa $uente. El depurador permite, si el compilador )a generado adecuadamente el programa objeto, seguir paso a paso la ejecucin de un programa. 5inalmente, muc)os compiladores, en #e( de generar cdigo objeto, generan un programa en lenguaje ensamblador que debe despus con#ertirse en un ejecutable mediante un programa ensamblador.2. Clasificacin de CompiladoresEl programa compilador traduce las instrucciones en un lenguaje de alto ni#el a instrucciones que la computadora puede interpretar ' ejecutar. "ara cada lenguaje de programacin se requiere un compilador separado. El compilador traduce todo el programaantes de ejecutarlo. os compiladores son, pues, programas de traduccin insertados en la memoria por el sistema operati#o para con#ertir programas de cmputo en pulsaciones electrnicas ejecutables ,lenguaje de mquina.. os compiladores pueden ser deC una sola pasadaC examina el cdigo $uente una #e(, generando el cdigo o programa objeto. pasadas m@ltiplesC requieren pasos intermedios para producir un cdigo en otro lenguaje, ' una pasada $inal para producir ' optimi(ar el cdigo producido durante los pasos anteriores. 6ptimacinC lee un cdigo $uente, lo anali(a ' descubre errores potenciales sin ejecutar el programa. >ompiladores incrementalesC generan un cdigo objeto instruccin por instruccin ,en #e( de )acerlo para todo el programa. cuando el usuario teclea cada orden indi#idual. El otro tipo de compiladores requiere que todos los enunciados o instrucciones se compilen conjuntamente. EnsambladorC el lenguaje $uente es lenguaje ensamblador ' posee una estructura sencilla. >ompilador cru(adoC se genera cdigo en lenguaje objeto para una mquina di$erente de la que se est utili(ando para compilar. Es per$ectamente normal construir un compilador de "ascal que genere cdigo para !:=+6: ' que el compilador $uncione en inux ' se )a'a escrito en >OO. >ompilador con montadorC compilador que compila distintos mdulos de $orma independiente ' despus es capa( de enla(arlos. *utocompiladorC compilador que est escrito en el mismo lenguaje que #a a compilar. E#identemente, no se puede ejecutar la primera #e(. :ir#e para )acer ampliaciones al lenguaje, mejorar el cdigo generado, etc. !etacompiladorC es sinnimo de compilador de compiladores ' se re$iere a un programa que recibe como entrada las especi$icaciones del lenguaje para el que se desea obtener un compilador ' genera como salida el compilador para ese lenguaje. El desarrollo de los metacompiladores se encuentra con la di$icultad de unir la generacin de cdigo con la parte de anlisis. o que s& se )an desarrollado son generadores de anali(adores lxicos ' sintcticos. "or ejemplo, los conocidosCgenerador de anali(adores lxicos EFC generador de E*>>C anali(adores sintcticosdesarrollados para ?94F. os incon#enientes que tienen son que los anali(adores que generan no son mu' e$icientes. +escompiladorC es un programa que acepta como entrada cdigo mquina ' lo traduce a un lenguaje de alto ni#el, reali(ando el proceso in#erso a la compilacin.3. Funciones de un compilador* grandes rasgos un compilador es un programa que lee un programa escrito es un lenguaje, el lenguaje $uente, ' lo traduce a un programa equi#alente en otro lenguaje, el lenguaje objeto. >omo parte importante de este proceso de traduccin, el compilador in$orma a su usuario de la presencia de errores en el programa $uente.* primera #ista, la di#ersidad de compiladores puede parecer abrumadora. Ma' miles de lenguajes $uente, desde los lenguajes de programacin tradicionales, como 56787*9 o "ascal, )asta los lenguajes especiali(ados que )an surgido #irtualmente en todas las reas de aplicacin de la in$ormtica. os lenguajes objeto son igualmente #ariados% un lenguaje objeto puede ser otro lenguaje de programacin o el lenguaje de mquina de cualquier computador entre un microprocesador ' un supercomputador. * pesar de existir una aparente complejidad por la clasi$icacin de los compiladores, como se #io en el tema anterior, las tareas bsicas que debe reali(ar cualquier compilador son esencialmente las mismas. *l comprender tales tareas, se pueden construir compiladores para una gran di#ersidad de lenguajes $uente ' mquinas objeto utili(ando las mismas tcnicas bsicas.9uestro conocimiento sobre cmo organi(ar ' escribir compiladores )a aumentado muc)o desde que comen(aron a aparecerlos primeros compiladores a principios de los aos cincuenta. Es di$&cil dar una $ec)a exactade la aparicin del primer compilador, porque en un principio gran parte del trabajo de experimentacin ' aplicacin se reali( de manera independiente por #arios grupos. Bran parte de los primeros trabajos de compilacin estaba relacionada con la traduccin de $rmulas aritmticas a cdigo de mquina.En la dcada de 19/0, se consider a los compiladores como programas notablemente di$&ciles de escribir. E primer compilador de 56787*9, por ejemplo, necesit para su implantacin de 1< aos de trabajo en grupo ,2ac3us ' otros P19;/Q.. +esde entonces, se )an descubierto tcnicas sistemticas para manejar muc)as de las importantes tareas que surgen en la compilacin. 8ambin se )an desarrollado buenos lenguajes de implantacin, entornos de programacin ' )erramientas de so$t-are. >on estos a#ances, puede )acerse un compilador real incluso como pro'ecto de estudio en un curso de un semestre sobre diseo sobre de compiladores.4. Partes en las que trabaja un compilador>onceptualmente un compilador opera en $ases. >ada una de las cuales trans$orma el programa $uente de una representacin en otra. En la $igura G se muestra una descomposicin t&pica de un compilador. En la prctica se pueden agripar $ases ' las representaciones intermedias entres las $ases agrupadas no necesitan ser construidas expl&citamente."rograma $uente"rograma objeto5igura G.= 5ases de un compilador.as tres primeras $ases, que $orman la ma'or parte de la porcin de anlisis de un compilador se anali(an en la seccin 4F. 6tras dos acti#idades, la administracin de la tablase s&mbolos ' el manejo de errores, se muestran en interaccin con las seis $ases de anlisis lxico, anlisis sintctico, anlisis semntico, generacin de cdigo intermedio, optimacin de cdigo ' generacin de cdigo. +e modo in$ormal, tambin se llamarn D$asesD al administrador de la tabla de s&mbolos ' al manejador de errores.*dministrador de la tabla de s&mbolos?na $uncin esencial de un compilador es registrar los identi$icadores utili(ados en el programa $uente ' reunir in$ormacin sobre los distintos atributos de cada identi$icador. Estos atributos pueden proporcionar in$ormacin sobre la memoria asignada a un identi$icador, su tipo, su mbito ,la parte del programa donde tiene #alide(. ', en el caso de nombres de procedimientos, cosas como el n@mero ' tipos de sus argumentos, el mtodo depasar cada argumento ,por ejemplo, por re$erencia. ' el tipo que de#uel#e, si los )a'.?na tabla de s&mbolos es una estructura de datos que contiene un registro por cada identi$icador, con los campos para los atributos del identi$icador. a estructura de datos permite encontrar rpidamente el registro de cada identi$icador ' almacenar o consultar rpidamente datos en un registro>uando el anali(ador lxico detecta un indenti$icador en el programa $uente, el identi$icador se introduce en la tabla de s&mbolos. :in embargo, normalmente los atributos de un identi$icador no se pueden determinar durante el anlisis lxico. "or ejemplo, en una declaracin en "ascal como #ar posicin, inicial, #elocidad C real%El tipo real no se conoce cuando el anali(ador lxico encuentra posicin, inicial ' #elocidad.as $ases restantes introducen in$ormacin sobre los identi$icadores en la tabla de s&mbolos' despus la utili(an de #arias $ormas. "or ejemplo, cuando se est )aciendo el anlisis semntico ' la generacin de cdigo intermedio, se necesita saber cules son los tipos de losidenti$icadores, para poder comprobar si el programa $uente los usa de una $orma #lida ' as& poder generar las operaciones apropiadas con ellos. El generador de cdigo, por lo general, introduce ' utili(a in$ormacin detallada sobre la memoria asignada a los identi$icadores.+eteccin e in$ormacin de errores>ada $rase puede encontrar errores. :in embargo, despus de detectar un error. >ada $ase debe tratar de alguna $orma ese error, para poder continuar la compilacin, permitiendo la deteccin de ms errores en el programa $uente. ?n compilador que se detiene cuando encuentra el primer error, no resulta tan @til como debiera.as $ases de anlisis sintctico ' semntico por lo general manejan una gran proporcin de los errores detectables por el compilador. a $ase lxica puede detectar errores donde los caracteres restantes de la entrada no $orman ning@n componente lxico del lenguaje. os errores donde la cadena de componentes lxicos #iolan las reglas de estructura ,sintaxis. del lenguaje son determinados por la $ase del anlisis sintctico.+urante el anlisis semntico el compilador intenta detectar construcciones que tengan la estructura sintctica correcta, pero que no tengan signi$icado para la operacin implicada, por ejemplo, si se intenta sumar dos identi$icadores. ?no de los cuales es el nombre de una matri(, ' el otro, el nombre de un procedimiento.as $ases de anlisis>on$orme a#an(a la traduccin, la representacin interna del programa $uente que tiene el compilador se modi$ica. "ara ilustrar esas representaciones, considrese la traduccin de la proposicin"osicin CR inicial O #elocidad S 60 ,1.a $igura 4 muestra la representacin de esa proposicin despus de cada $rase."osicin CR inicial O #elocidad S 604d1 CR idN O idG S 608abla de s&mbolos1NG4 C Rid1 OidN SidG entareal60temp1 CR entareal,60.tempN CR idG S temp1tempG CR idN O tempNid1 CR tempGtemp1 CR idG S 60.0id1 CR idN O temp1!6I5 idG, 7N!?5 T60.0, 7N!6I5 idN, 71*++5 7N, 71!6I5 71, id15igura 4.= 7epresentacin de una proposicin.a $ase de anlisis lxico lee los caracteres de un programa $uente ' los agrupa en una cadena de componentes lxicos en los que cada componente representa una secuencia lgicamente co)erente de caracteres, como un identi$icador, una palabra cla#e ,i$, -)ile, etc., un carcter de puntuacin, o un operador de #arios caracteres, como CR. a secuencia de caracteres que $orman un componente lxico se denomina lexema del componente.* ciertos componentes lxicos se les agregar un D#alor lxicoD. *s&, cuando se encuentra unidenti$icador como #elocidad, el anali(ador lxico no slo genera un componente lxico, porejemplo, id, sino que tambin introduce el lexema #elocidad en la tabla de s&mbolos, si a@n no estaba all&. El #alor lxico asociado con esta aparicin de id seala la entrada de la tabla de s&mbolos correspondiente a #elocidad.?saremos id1 , idN e idG para posicin, inicial ' #elocidad, respecti#amente, para en$ati(ar que la representacin interna de un identi$icador es di$erente de la secuencia de caracteres que $orman el identi$icador. "or tanto, la representacin de ,1. despus del anlisis lxico queda sugerida porCid1 CR idN O idG S 60 ,N.:e deber&an construir componentes para el operador de #arios caracteres CR ' el n@mero 60,para re$lejar su representacin interna. En la seccin 4F 'a se introdujeron las $ases segunda ' terceraC los anlisis sintctico ' semntico. El anlisis sintctico impone una estructura jerrquica a la cadena de componentes lxicos, que se representar por medio derboles sintcticos, como se muestra en la $igura /*.. ?na estructura de datos t&pica para el rbol se muestra en la $igura /2., en la que un nodo interior es un registro con un campo para el operador ' dos campos que contienen apuntadores a los registros de los )ijos i(quierdo ' derec)o. ?na )oja es un registro con dos o ms campos, uno para identi$icar el componente lxico de la )oja, ' los otros para registrar in$ormacin sobre el componente lxico. :e puede tener in$ormacin adicional sobre las construcciones del lenguaje aadiendo ms campos a les registros de los nodos.C Rid1 OidN SidG60,a.:= id 1+ id 1* id 3num60 ,b. 5igura /.= a estructura de datos en ,b. corresponde al rbol en ,a..Beneracin de cdigo intermedio+espus de los anlisis sintctico ' semntico, algunos compiladores generan una representacin intermedia expl&cita del programa $uente. :e puede considerar esta representacin intermedia como un programa para una mquina abstracta. Esta representacin intermedia debe tener dos propiedades importantes% debe ser $cil de producir ' $cil de traducir al programa objeto.a representacin intermedia puede tener di#ersas $ormas. Existe una $orma intermedia llamada Dcdigo de tres direccionesD, que es como el lenguaje ensamblador para 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. El programa $uente de ,1. puede aparecer en cdigo de tres direcciones comotemp1 CR entarea1,60.tempN CR idG S temp1 ,N.tempG CR idN O tempNid1 CR tempGEsta representacin intermedia tiene #arias propiedades. "rimera, cada instruccin de tres direcciones tiene a lo sumo un operador, adems de la asignacin. "or tanto, cuando se generan esas instrucciones el compilador tiene que decidir el orden en que deben e$ectuarse, las operaciones% la multiplicacin precede a la adicin al programa $uente de ,1..:egunda, el compilador debe generar un nombre temporal para guardar los #alores calculados por cada instruccin. 8ercera, algunas instrucciones de Dtres direccionesD tienen menos de tres operadores, por ejemplo la primera ' la @ltima instrucciones de ,N..6ptimacin de >digoa $ase de optimacin de cdigo trata de mejorar el cdigo intermedio de modo que resulte un cdigo de mquina ms rpido de ejecutar. *lgunas optimaciones son tri#iales. "or ejemplo, un algoritmo natural genera el cdigo intermedio ,N. utili(ando una instruccin para cada operador de la representacin del rbol despus del anlisis semntico, aunque )a' una $orma mejor de reali(ar los mismos clculos usando las dos instrucciones8emp1 CR idG S 60.0 ,G.4d1 CR idN O temp1Este sencillo algoritmo no tiene nada de malo, puesto que el problema se puede solucionar en la $ase de optimacin de cdigo. Esto es, el compilador puede deducir que la con#ersin de 60 de entero a real se puede )acer de una #e( por todas en el momento de la compilacin, de modo que la operacin entreal se puede eliminar. *dems, tempG se usa slo una #e(, para transmitir su #alor a id1. Entonces resulta seguro sustituir a id1 por tempG, a partir de lo cual la @ltima proposicin de ,N. no se necesita ' se obtiene el cdigo de ,G..Ma' muc)as #ariaciones en la cantidad de optimacin de cdigo que ejecutan los distintos compiladores. En lo que )acen muc)a optimacin llamados Dcompiladores optimadoresD, una parte signi$icati#a del tiempo del compilador se ocupa en esta $ase. :in embargo )a' optimaciones sencillas que mejoran signi$icati#amente del tiempo del compilador se ocupa en esta $ase. :in embargo, )a' optimaciones sencillas que mejoran sensiblemente el tiempo de ejecucin del programa objeto sin retardar demasiado la compilacin.Forma de examinar de un compiladorEn la compilacin )a' dos partesC *nlisis ' :&ntesis. a parte del anlisis di#ide al programa $uente en sus elementos componentes ' crea una representacin intermedia. +e las dos partes, la s&ntesis es la que requiere la tcnica ms especiali(ada.+urante el anlisis se determina las operaciones que implica el programa $uente ' se registra en una estructura jerrquica llamada rbol. * menudo, se usa una clase especial de rbol llamado rbol sintctico, donde cada nodo representa una operacin ' los )ijos de un nodo son los argumentos de la operacin. "or ejemplo, en la $igura / se muestra un rbol sintctico para una proposicin de asignacin.5igura /. Urbol sintctico para posicin CR inicial O #elocidad S 60. Como se sinteti!a el cdi"o objeto un compilador est#ndar$ terica % "r#ficamente "eneracin de cdi"oEn esta parte el cdigo intermedio optimi(ado es traducido a una secuencia de instrucciones en ensamblador o en el cdigo de mquina del procesador que nos interese. "or ejemplo, la sentencia*CR2O> se con#ertir enC6*+ 2*++ >:867E *suponiendo que estas instrucciones existan de esta $orma en el ordenador de que se trate. ?na con#ersin tan directa produce generalmente un programa objeto que contiene muc)as cargas ,loads. ' almacenamientos ,stores. redundantes, ' que utili(a los recursos de la mquina de $orma ine$iciente. Existen tcnicas para mejorar esto, pero son complejas. ?na, por ejemplo, es tratar de utili(ar al mximo los registros de acceso rpido que tenga la mquina. *s&, en el procesador omo se tiene que acceder muc)o a la tabla de s&mbolos los accesos deben ser lo ms rpidos posible para que la compilacin sea e$iciente.!anejo de erroresEs una de las misiones ms importantes de un compilador, aunque, al mismo tiempo, es lo que ms di$iculta su reali(acin. +onde ms se utili(a es en las etapas de anlisis sintctico ' semntico, aunque los errores se pueden descubrir en cualquier $ase de un compilador. Esuna tarea di$&cil, por dos moti#osC * #eces unos errores ocultan otros. * #eces un error pro#oca una a#alanc)a de muc)os errores que se solucionan con el primero.Es con#eniente un buen manejo de errores, ' que el compilador detecte todos los errores que tiene el programa ' no se pare en el primero que encuentre. Ma', pues, dos criterios a seguir a la )ora de manejar erroresC "ararse al detectar el primer error. +etectar todos los errores de una pasada.En el caso de un compilador interacti#o ,dentro de un entorno de desarrollo integrado, como 8urbo="ascal o 2orland >OO. no importa que se pare en el primer error detectado, debido a la rapide( ' $acilidad para la correccin de errores.&. 'rboles sint#cticos para representar como sinteti!a el cdi"o objeto un compilador5igura 6.= Beneracin de cdigo.$igura ;.= >digo en ensamblador para la $igura 6.(. )erramientas que muestran tipos de an#lisis de pro"ramas fuente!uc)as )erramientas de so$t-are que manipulan porgraas $uente reali(an primero alg@n tipo de anlisis. *lgunos ejemplos de tales )erramientas sonC1. Editores de estructurasC un editor de estructuras toma como entrada uan secuencia de ordenes para construir un programa $uente. El editor de estructuras no slo reali(alas $unciones de creacin ' modi$icacin de textos de un editor de textos ordinario, sino que tambin anali(a el texto del programa imponiendo al programa $uente una estructura jerrquica apropiada. +e esa manera, el editor de estructuras puede reali(ar tareas adicionales @tiles para la preparacin de programas. "or ejemplo, puede comprobar si la entrada est $ormada correctamente, puede proporcionar palabras cla#e de manera automtica ' puede saltar desde un begin o un parntesis i(quierdo )asta su correspondiente end o parntesis derec)o. *dems, la salida de tal editor suele ser similar a la salida de la $ase del anlisis de un compilador.N. 4mpresoras estticasC ?na impresora esttica anali(a un programa ' lo imprime de $orma que la estructura del programa resulte claramente #isible. "or ejemplo, los comentarios pueden aparecer con un tipo de letra especial, ' las proposiciones puedenaparecer con una indentacin proporcional a la pro$undidad de su anidamiento en la organi(acin jerrquica de las proposiciones.G. Ieri$icadores estticosC ?n #eri$icador esttico lee un programa, lo anali(a e intenta descubrir errores potenciales sin ejecutar el programa. a parte del anlisis es similar a la que se encuentra en los compiladores de optimacin. *s& un #eri$icador esttico puede detectar si )a' partes de un programa que nunca se podrn ejecutar o si cierta #ariable se usa antes de ser de$inida. *dems, puede detectar errores de lgica como intentar utili(ar una #ariable real como apuntador, empleando las tcnicas de #eri$icacin de tipos.4. 4ntrpretesC En lugar de producir un programa objeto como resultado de una traduccin, un interprete reali(a las operaciones que implica el programa $uente. "arauna proposicin de asignacin, por ejemplo, un intrprete podr&a construir un rbol como el de la $igura /, ' despus e$ectuar las operaciones de los nodos con$orme DrecorreD el rbol. En la ra&( descubrir&a que tiene que reali(ar una asignacin, ' llamar&a a una rutina para e#aluar la expresin de la derec)a ' despus almacenar&a el#alor resultante en la localidad de memoria asignada con el identi$icador posicin. En el )ijo derec)o de la ra&(, la rutina descubrir&a que tiene que calcular la suma de dos expresiones. :e llamar&a a si misma de manera recursi#a para calcular el #alor de la #ariable inicial.*. +ia"rama de an#lisis de un pro"rama fuente$ definiendo cada una de sus partes*l principio de la )istoria de los compiladores, el tamao del programa ejecutable era un recurso cr&tico, as& como la memoria que utili(aba el compilador para sus datos, por lo que lo $recuente era que cada $ase le'era un $ic)ero escrito por la $ase anterior ' produjera un nue#o $ic)ero con el resultado de las trans$ormaciones reali(adas en dic)a $ase. Esta tcnica,ine#itable en aquellos tiempos. )ac&a que el compilador reali(ara muc)as pasadas sobre el programa $uente. En los @ltimos aos el tamao del $ic)ero ejecutable de un compilador es relati#amente pequeo comparado con el de otros programas del sistema, ' adems ,gracias a los sistemas de memoria #irtual. normalmente no tienen problemas de memoria para compilar un programa medio. "or estos moti#os, ' dado que escribir ' leer un $ic)ero de tamao similar o ma'or que el del programa $uente en cada $ase es una prdida considerable de tiempo ,incluso en los sistemas modernos., la tendencia actual es la de reducir el n@mero de $ic)eros que se leen o escriben ' por tanto reducir el n@mero de pasadas, incluso el de aqullas que se reali(an en memoria, sin escribir ni leer nada del disco.as $ases se agrupan en dos partes o etapasC $ront end ,las $ases de anlisis. ' bac3 end ,las $ases de generacin ' optimi(acin de cdigo.. Estas dos etapas se comunican mediante unarepresentacin intermedia ,generada por el $ront end., que puede ser una representacin de la sintaxis del programa ,un rbol sintctico abstracto. o bien puede ser un programa en un lenguaje intermedio. El $ront end depende del lenguaje $uente ' casi siempre es independiente ,o debe serlo. de la mquina objeto para la que se #a a generar cdigo% el bac3 end depende del lenguaje objeto ' debe ser independiente del lenguaje $uente ,exceptoqui( para alg@n tipo de optimi(acin..*nlisis xicoEl anali(ador lxico, tambin conocido como scanner, lee los caracteres uno a uno desde la entrada ' #a $ormando grupos de caracteres con alguna relacin entre s& ,to3ens., que constituirn la entrada para la siguiente etapa del compilador. >ada to3en representa una secuencia de caracteres que son tratados como una @nica entidad. "or ejemplo, en "ascal un to3en es la palabra reser#ada 2EB49, en >C VM4E, etc.Ma' dos tipos de to3ensC tiras espec&$icas, tales como palabras reser#adas ,i$, -)ile, begin, etc.., el punto ' coma, la asignacin, los operadores aritmticos o lgicos, etc.% tiras no espec&$icas, como identi$icadores, constantes o etiquetas. :e considera que un to3en tiene dos partes componentesC el tipo de to3en ' su #alor. as tiras espec&$icas slo tienen tipo ,lo que representan., mientras que las tiras no espec&$icas tienen tipo ' #alor. "or ejemplo, si D>ontadorD es un identi$icador, el tipo de to3en ser identi$icador ' su #alor ser la cadena D>ontadorD.El *nali(ador xico es la etapa del compilador que #a a permitir saber si es un lenguaje de $ormato libre o no. 5recuentemente #a unido al anali(ador sintctico en la misma pasada, $uncionando entonces como una subrutina de este @ltimo. Ea que es el que #a le'endo los caracteres del programa, ignorar aquellos elementos innecesarios para la siguiente $ase, como los tabuladores, comentarios, espacios en blanco, etc.5igura sean de un tipo com@n o compatible ' que se les pueda aplicar dic)o operador. :i 2 ' > son enteros o reales los sumar, si son cadenas las concatenar ' si son conjuntos calcular su unin.EjemploI*7c) C >M*7% ,S ?n identi$icador no se puede utili(ar si S.entC 498EBE7% ,S pre#iamente no se )a de$inido. S....c) CR ent O 1% ,S En "ascal no es #lido, en > s&. S.*nlisis xicoC +e#uel#e la secuencia de to3ensC id asig id suma numero ptocoma*nlisis :intcticoC 6rden de los to3ens #lido*nlisis :emnticoC 8ipo de #ariables asignadas incorrectaEstructura del programa $uente"rograma $uente"rograma objeto en lenguaje ensamblador>digo de mquina relocali(able>digo de mquina absoluto5igura 9.= :istema para procesamiento de un lenguaje 5igura 10.= Urbol de anlisis sintctico para posicin CR inicial O #elocidad S 60.1,. ConclusionesEste trabajo ser#ir muc)o en el momento de la creacin de un compilador, 'a que en l se detallan todas ' cada una de las partes que in#olucran a este. "rimeramente in#estigue que existen distintos tipos de compiladores, me gustaria crear un compilador de optimacin, 'a que pienso que es mu' @til a la )ora de crear un algoritmo o programa. a $uncin de un compiladores es leer un programa escrito es un lenguaje, en este caso el lenguaje $uente, ' lo traduce a un programa equi#alente en otro lenguaje, el lenguaje objeto. !e parece $ascinante que nosotros podamos crear un compilador en seis meses ,en un curso., cuando en los aos /0, 'a que en aquellos tiempos se tardaron )asta 1< aos trabajando en un compilador."or otro lado, comprend& que un compilador, requiere de una sintaxis ' lenguajes espec&$icos, 'a que, al igual que el lenguaje )umano, si no lo escribimos correctamente el compilador no )ar lo que deseamos. E que en la compilacin )a' dos partesC *nlisis ' :&ntesis. a parte del anlisis di#ide al programa $uente en sus elementos componentes ' crea una representacin intermedia.*prend& que las )erramientas que muestran tipos de anlisis de programas $uente, son mu'@tiles al momento de crear un programa al codi$icar un algoritmo, 'a que estas )erramientas nos a'udan $ormateando el texto, corrigiendo errores, dando tips% para que nosotros como programadores seamos ms e$icientes al momento de crear alguna aplicacin.8ambin )e notado como todas nuestras materias se #a complementando ' enla(ando, por ejemplo, en matemticas discretas #imos la representacin de rboles, los cuales usamos aqu&. 4gualmente en estructura de datos 4, #imos mtodos de ordenamiento que las gramticas de los compiladores usan. "or lo tanto, no parece tan complicado crear un compilador, slo se necesitan los conocimientos adecuados ' dedicarle su tiempo para tenerxito.11. -iblio"raf.a >ompiladores, "rincipios, tcnicas ' )erramientas, *l$red I. *)o, 7a#i :et)i, 1e$$re' +. ?llman. *ddison X Vesle' iberoamericana. )ttpCWW---.dlsi.ua.esWdocenciaWasignaturasWcomp1Wcomp1.)tml )ttpCWW---.cps.uni(ar.esWYe(peletaW>6!"4 )ttpCWW---.ii.uam.esWYal$onsec >ompiladoresC >onceptos 5undamentales. 2. 8eu$el, :. :c)midt, 8. 8eu$el. *ddison Vesle' 4beroamericana.compiler). Los compiladores son programas o herramientas encargadas de compilar. Un compilador toma un teto !c"digo #uente) escrito en un lengua$e de alto ni%el & lo traduce a un lengua$e comprensi'le por las computadoras !c"digo o'$eto).()sicamente* eisten dos grandes #ormas de e$ecutar programas: programas compilados !pre%iamente pasados por un compilador) & programas interpretados !necesitan pasar por un int+rprete para e$ecutarse en tiempo real).Caractersticas de un compilador,eneralmente un compilador se di%ide en dos partes:* -ront .nd: parte /ue anali0a el c"digo #uente* comprue'a su %alide0* genera el )r'ol de deri%aci"n & rellena los%alores de la ta'la de s1m'olos. 2arte /ue suele ser independiente de la plata#orma o sistema operati%o para el /ue #uncionar).* (ac3 .nd: parte en donde se genera el c"digo m)/uina eclusi%o para una plata#orma a partir de lo anali0ado en el #ront end.2or lo general el resultado del 'ac3 end no puede ser e$ecutado directamente* se necesita pasar por un proceso de enla0ado !lin3er)..isten %arios tipos de compiladores: 4ompiladores cru0ados* 4ompiladores optimi0adores* 4ompiladores de una sola pasada* 4ompiladores de %arias pasadas* 4ompiladores 567 !5ust 6n 7ime).Intrpretes vs compiladores4ual/uier lengua$e puede ser e$ecutado tanto %1a int+rprete o %1a compilador* pero algunos lengua$es suelen asociarse m)s a una %1a /ue a la otra* & por esto son llamados 8lengua$es interpretados8 o 8lengua$es compilados8 respecti%amente.7am'i+n puede darse /ue un programa contenga partes /ue son implementadas %1a int+rprete & otras %1a compilador.7am'i+n eisten int+rpretes /ue inclu&en cierta 8compilaci"n8 en el medio. 9on a/uellos /ue compilan a un c"digo intermedio llamado '&tecode* /ue es m)s e#iciente de e$ecutar /ue hacerlo directamente desde el c"digo#uente..n general* la principal des%enta$a de los int+rpretes* es /ue cuando un programa es interpretado* suele e$ecutarse m)s lento /ue si el mismo programa estu%iese compilado. .sto se de'e a /ue el int+rprete de'e anali0ar cada sentencia en el programa en cada e$ecuci"n !un an)lisis en tiempo real). 7am'i+n el acceso a %aria'les es m)s lento en un int+rprete* por/ue mapear los identi#icadores para almacenar las locali0aciones de'e hacerse repetidas %eces en tiempo real.------------------Bibliografia: Aho Alfred, Compiladores principios tcnicas y herramientas Garrido Alicia, Diseo de Compiladores, 2002